Thuật toán mê cung
Thuật toán tìm kiếm theo chiều rộng trong mê cungNguyễn Duy HàmThuật toán tìm kiếm theo chiều rộng là một trong những thuật toán tìm kiếm cơ bản trên đồ thị, nó có thể giải quyết một loạt các bài toán liên quan dến đồ thị, cũng như các bài toán có thể mô hình hoá bằng đồ thị, như tìm đường đi trên đồ thị, kiểm tra tính liên thông, tìm các thành phần liên thông, xây dựng cây khung .Thuật toán này làm việc dựa trên cơ chế hàng đợi (QUEUE) vào trước ra trước (FIFO), phần tử được kết nạp trước sẽ được xử lý trước. Tư tưởng cơ bản của thuật toán này là: Chọn một đỉnh bất kì của đồ thị làm gốc. Sau đó tiến hành ghép các đỉnh có cạnh liên thuộc với đỉnh này. Các đỉnh được ghép trong lần này trở thành các đỉnh ở mức 1 của cây tìm kiếm. Bước tiếp theo ta tiến hành kết nạp các đỉnh khác (chưa được kết nạp) có cạnh liên thuộc thuộc với các đỉnh mức 1. Các đỉnh được kết nạp trong lần này trở thành các đỉnh ở mức 2 của cây tìm kiếm. Tiếp tục tiến hành cho đến khi không còn đỉnh nào có thể kết nạp được vào cây tìm kiếm nữa thì dừng.Thuật toán tìm kiếm theo chiều rộng được mô tả theo thủ tục sau:Procedure BFS(v: Type_Point);Var u,u1:Type_Point{Kiểu của đỉnh}BeginQUEUE:=phi;Dq:=1;Cq:=1;{đầu QUEUE và cuối QUEUE}QUEUE[Cq]:=v;{kết nạp v vào QUEUE}Chuaxet[v]:=false;While Cq>=Dq doBeginu1:=QUEUE[Dq];{Lấy u1 ra khỏi QUEUE}Dq:=Dq+1;For u ∈ ke(u1) do If chuaxet[u] thenBeginCq:=Cq+1; chuaxet[u]:=falseQUEUE[Cq]:=u;{kết nạp u vào QUEUE}End;End;End;Bây giờ ta cùng tìm hiểu một số ứng dụng của thuật toán này trong việc tìm kiếm trong mê cung. Mê cung được hiểu đơn giản là một lưới ô vuông kích thước nxm, trong đó các ô chứa các giá trị 0 hoặc 1, tương ứng với ô có thể đi vào được tượng trưng cho khoảng không, và ô không thể đi vào được tượng trưng cho bức tường chắn. Mê cung là dạng bài toán kinh điển có từ rất lâu với một số vấn đề được đặt ra như : 1.Tìm khoảng rộng (hẹp) nhất trong mê cung (khoảng có các ô liên thông = 0 lớn (nhỏ) nhất), đếm các vùng không gian trong mê cung.2.Tìm đường đi ngắn nhất từ vị trí này đến vị trí khác trong mê cung.3.Tìm đường đi có thể thoát ra nhanh nhất từ một vị trí trong mê cung ra khỏi mê cung .Thuật toán tìm kiếm theo chiều rộng như đã được trình bày ở trên có thể giải quyết triệt để các vấn đề đã được nêu ra ở đây. Ta sử dụng mảng 1 chiều Q làm hàng đợi (QUEUE). Trong quá trình thực hiện Q sẽ chứa vị trí các ô được kết nạp, giả sử ô (i,j) được kết nạp vào Q -> Q sẽ nhận giá trị (i-1)*m+j. Sau đó khi lấy k từ Q để xét thì giá trị k đó sẽ tương ứng với ô ((k div m )+1), k mod m) trong mê cung.Vấn đề thứ nhất (tìm khoảng rộng (hẹp) nhất): Đây là dạng bài tìm thành phần liên thông lớn (nhỏ) nhất. Ta sử dụng ngay mê cung để đánh dấu, các ô có giá trị > 0 coi như đã bị đánh dấu. Đi từ trên xuống dưới, từ phải qua trái gặp ô chưa bị đánh dấu đầu tiên, và tiến hành tìm thành phần liên thông ứng với ô đó. Kết nạp ô đó vào Q, tiến hành kết nạp các ô có giá trị = 0 chung cạnh với ô đó, các ô này trở thành mức 1, kết nạp các ô có giá trị = 0 chung cạnh với các ô mức 1 vào Q, các ô này trở thành mức 2 . Trong quá trình kết nạp, ta tiến hành đánh dấu các ô này bằng cách: Với thành phần liên thông đầu tiên tìm được, các ô tương ứng của nó được gán giá trị = 2, thành phần liên thông thứ hai các ô tương ứng được gán giá trị = 3 . Đồng thời, trong quá trình này ta tiến hành tính số ô được kết nạp vào Q, qua đó có thể tìm được thành phần nào có số ô được kết nạp nhiều nhất (ứng với vùng rộng nhất), thành phần nào có số ô được kết nạp ít nhất (ứng với vùng hẹp nhất). Sau khi tìm hết các thành phần liên thông, tìm được vùng rộng(hẹp) nhất, ta có thể đưa mê cung về trạng thái ban đầu bằng cách gán các ô có giá trị > 1 = 0.Vấn đề thứ hai(Tìm đường đi ngắn nhất giữa hai vị trí trong mê cung): Đây là dạng hay gặp trong các bài toán tin học cũng như trong thực tế. Chắc các bạn có biết trò chơi LINE - một trò chơi phổ biến trên máy tính. Qủa bóng trong trò chơi chạy từ vị trí này đến vị trí khác với đường chạy qua ít ô trung gian nhất (đường đi ngắn nhất). Bây giờ ta cùng tìm hiểu cách giải quyết vấn đề thứ hai này.Kết nạp vị trí thứ nhất vào Q, ô này được gán giá trị = 2 trong ma trận mô tả mê cung, kết nạp các ô có giá trị = 0 chung cạnh với ô này vào Q, các ô này trở thành mức 1, giá trị tương ứng trong ma trận mô tả mê cung của các ô mức 1 này có giá trị = 3 . cho đến khi kết nạp được vị trí thứ hai vào mê cung, hoặc không còn ô nào có thể được kết nạp nữa (hai vị trí không cùng thuộc một thành phần lên thông). Khi kết nạp được vị trí thứ hai vào Q, ta chỉ cần lần ngược lại trong ma trận mô tả mê cung qua các gia trị đã được đánh dấu, sẽ đưa ra được đường đi ngắn nhất cần tìm.Vấn đề thứ ba(Tìm đường thoát nhanh nhất ra khỏi mê cung): Vấn đề này được giải quyết như vấn đề thứ hai, khi một ô ở biên (ô có dòng = 1 hoặc = n, có cột = 1 hoặc cột = m) được kết nạp vào Q thì dừng, và cũng như ở trên chỉ cần lần ngược lại qua các giá trị đánh dấu sẽ ra đường thoát nhanh nhất ra khỏi mê cung. . Thuật toán tìm kiếm theo chiều rộng trong mê cungNguyễn Duy HàmThuật toán tìm kiếm theo chiều rộng là một trong những thuật toán tìm kiếm. QUEUE}End;End;End;Bây giờ ta cùng tìm hiểu một số ứng dụng của thuật toán này trong việc tìm kiếm trong mê cung. Mê cung được hiểu đơn giản là một lưới ô vuông kích