Thuật toántìm kiếm Depth First Search (DFS)

Một phần của tài liệu Thuật toán tìm đường đi ngắn nhất và xây dựng ứng dụng (Trang 31 - 34)

Tìm kiếm sâu trong không gian bài toán đƣợc bắt đầu từ một nút rồi tiếp tục cho đến khi hoặc đến ngõ cụt hoặc đến đích. Tại mỗi nút có luật trong tài, chẳng hạn, “đi theo nút cực trái”, hƣớng dẫn việc tìm. Nếu không đi tiếp đƣợc, gọi là đến ngõ cụt, hệ thống quay lại một mức trên đồ thị và tìm theo hƣớng khác, chẳng hạn, đến nút “sát nút cực trái”. Hành động này gọi là quay lui.

Thuật toán tìm kiếm theo chiều sâu đƣợc hình dung nhƣ việc khảo sát một cây bắt đầu từ gốc đi theo mọi cành có thể đƣợc, khi gặp cành cụt thì quay lại xét cành chƣa đi qua.

Ở bƣớc tổng quát, giả sử đang xét đỉnh i, khi đó các đỉnh kề với i có các trƣờng hợp:

+ Nếu tồn tại đỉnh j kề i chƣa đƣợc xét thì xét đỉnh này (nó trở thành đỉnh đã xét) và bắt đầu từ đó tiếp tục quá trình tìm kiếm với đỉnh này.

+ Nếu với mọi đỉnh kề với i đều đã đƣợc xét thì i coi nhƣ duyệt xong và quay trở lại tìm kiếm từ đỉnh mà từ đó ta đi đến đƣợc i.

Vào: Cây G = (N, A), đỉnh gốc n0, tập ĐICH  N Ra: Đƣờng đi p từ đỉnh n0 tới đỉnh n*  ĐICH

Ví dụ 13: Áp dụng thuật toán tìm kiếm theo chiều sâu với cây sau, tập

ĐICH = {o, p}

Thứ tự duyệt: a b d h Đƣờng đi: a b d h o

Nếu cây G hữu hạn thì thủ tục tìm kiếm theo chiều sâu sẽ dừng và cho kết quả là một đƣờng đi từ n0 đến tập ĐICH.

Đƣờng đi nhận đƣợc theo thuật toán BFS (nếu có) sẽ là đƣờng đi ngắn nhất còn đƣờng đi nhận đƣợc theo thuật toán DFS (nếu có) có thể không phải là đƣờng đi ngắn nhất. Hơn nữa, nếu đồ thị vô hạn thì thủ tục DFS có thể lặp vô hạn, thậm chí trong đồ thị G tồn tại đƣờng đi từ n0 tới tập ĐICH.

Thuật toán:

procedure DFS(d); begin

open:=[start]; closed:=[]; depth(start):=0; while open<>[] do

begin

loại trạng thái ngoài cùng bên trái của open, gọi nó là u if (u là một đích) then thông báo kết quả, thoát else begin

Đƣa u vào closed

If depth(u)<=d then begin Phát sinh các con v của u

Loại các con vừa phát sinh nhƣng đã có mặt trong open hoặc closed Gán độ sâu cho các v bằng depth(u)+1 Đƣa các con v còn lại vào bên trái open

End; End;

End;

Thông báo thất bại End.

Vấn đề khó khăn là xác định độ sâu hạn chế d. Hầu hết các bài tóan chúng ta không biết trƣớc d bằng bao nhiêu. Chiến lƣợc sau đây giải quyết vấn đề này.

Một phần của tài liệu Thuật toán tìm đường đi ngắn nhất và xây dựng ứng dụng (Trang 31 - 34)

Tải bản đầy đủ (PDF)

(55 trang)