Tại sao DFS không thể được sử dụng để tìm các đường dẫn ngắn nhất trong các biểu đồ không trọng số?


16

Tôi hiểu rằng sử dụng DFS "như hiện tại" sẽ không tìm thấy đường dẫn ngắn nhất trong biểu đồ không trọng số.

Nhưng tại sao điều chỉnh DFS để cho phép nó tìm đường đi ngắn nhất trong các biểu đồ không trọng số như một viễn cảnh vô vọng? Tất cả các văn bản về chủ đề này chỉ đơn giản nói rằng nó không thể được thực hiện. Tôi không tin tưởng (mà không tự mình thử).

Bạn có biết bất kỳ sửa đổi nào sẽ cho phép DFS tìm các đường dẫn ngắn nhất trong các biểu đồ không trọng số không? Nếu không, điều gì về thuật toán làm cho nó rất khó?


1
Thuật toán tìm đường phổ biến nhất trên các biểu đồ không trọng số là A *, với sự điều chỉnh nhỏ rằng các mối quan hệ bị phá vỡ gần với kết thúc. Điều này sẽ đưa ra một thuật toán tương tự như DFS, trong đó nó sẽ thử tuyến đường trực tiếp nhất trước tiên và chỉ bong bóng ra bên ngoài nếu cần.
BlueRaja - Daniel Pflughoeft

1
Hãy thử sử dụng DFS trên một số biểu đồ (được chọn tốt); Nếu nó thực sự không hoạt động, bạn sẽ gặp phải vấn đề. Btw, câu hỏi của bạn đọc như thể nó hoạt động trên các biểu đồ có trọng số.
Raphael

Có, bạn có thể làm điều đó. Đây là giải pháp
Anmol Middha

Câu trả lời:


12

Yếu tố duy nhất của tìm kiếm theo chiều sâu mà bạn tinh chỉnh là thứ tự mà trẻ em được điều tra. Phiên bản bình thường tiến hành theo thứ tự tùy ý, tức là theo thứ tự trẻ em được lưu trữ.

Cách thay thế khả thi duy nhất (hướng tới những con đường ngắn nhất) tôi có thể đưa ra là một cách tiếp cận tham lam, đó là nhìn trẻ em theo thứ tự khoảng cách từ nút hiện tại (từ nhỏ đến lớn). Thật dễ dàng để xây dựng một ví dụ cho quy tắc này:

ví dụ phản đối cho quy tắc tham lam
[ nguồn ]

Bây giờ, đó không phải là bằng chứng cho thấy không tồn tại chiến lược chọn đứa trẻ tiếp theo được điều tra, điều này sẽ khiến DFS tìm ra những con đường ngắn nhất.

(S,t)(S,một)một(một,b)(S,t)

cc-1


  1. Miễn là quy tắc là xác định. Nếu không, rõ ràng không phải lúc nào cũng có thể tìm thấy những con đường ngắn nhất.

Sửa lỗi cho tôi nếu tôi sai, nhưng điều này có nghĩa là DFS có thể tìm thấy con đường ngắn nhất trong bất kỳ biểu đồ nào, nhưng sẽ mất thời gian theo cấp số nhân trong khi làm như vậy?
Anmol Singh Jaggi

@AnmolSinghJaggi số DFS chỉ tìm thấy một con đường.
Raphael

10

Breadth -first-search là thuật toán sẽ tìm thấy các đường dẫn ngắn nhất trong một biểu đồ không trọng số.

Có một điều chỉnh đơn giản để chuyển từ DFS sang một thuật toán sẽ tìm thấy các đường dẫn ngắn nhất trên biểu đồ không trọng số. Về cơ bản, bạn thay thế ngăn xếp được sử dụng bởi DFS bằng một hàng đợi. Tuy nhiên, thuật toán kết quả không còn được gọi là DFS. Thay vào đó, bạn sẽ thực hiện tìm kiếm theo chiều rộng.

Đoạn văn trên cho trực giác chính xác, nhưng đơn giản hóa quá mức tình huống một chút. Thật dễ dàng để viết mã mà trao đổi đơn giản thực hiện tìm kiếm đầu tiên theo chiều rộng, nhưng cũng dễ dàng viết mã mà thoạt nhìn giống như một triển khai chính xác nhưng thực tế không phải vậy. Bạn có thể tìm thấy một câu hỏi cs.SE liên quan trên BFS vs DFS tại đây . Bạn có thể tìm thấy một số mã giả đẹp ở đây.


2

Bạn có thể!!!

Đánh dấu các nút là đã truy cập trong khi bạn đang đi sâu và bỏ đánh dấu trong khi bạn quay lại, trong khi quay lại khi bạn tìm thấy một nhánh khác lặp lại tương tự.

Tiết kiệm chi phí / đường dẫn cho tất cả các tìm kiếm có thể có nơi bạn tìm thấy nút mục tiêu, so sánh tất cả các chi phí / đường dẫn như vậy và chọn cái ngắn nhất.

Vấn đề lớn (và ý tôi là LỚN) với cách tiếp cận này là bạn sẽ truy cập cùng một nút nhiều lần, điều này làm cho dfs trở thành một lựa chọn tồi tệ rõ ràng cho thuật toán đường dẫn ngắn nhất.


1
st

1
@ user2407394 Bạn đã thực sự thực hiện biến thể DFS này một lần và chạy nó một cách chính xác cho một biểu đồ lớn vừa phải chưa? Tôi sẽ do dự khi gọi biến thể này là DFS. Tôi sẽ gọi nó là tìm kiếm đường dẫn sâu đầu tiên.
John L.

Tôi đã thực hiện kiểu tiếp cận này, nó hoạt động rất chậm. Tôi đang suy nghĩ về việc thêm tính năng ghi nhớ để cải thiện hiệu suất.
Mic

0

BFS có một thuộc tính tốt là nó sẽ kiểm tra tất cả các cạnh từ gốc và giữ khoảng cách từ gốc đến các nút khác tối thiểu nhất có thể, nhưng dfs chỉ cần nhảy đến nút liền kề đầu tiên và đi sâu. Bạn CÓ THỂ sửa đổi DFS để có được con đường ngắn nhất, nhưng bạn sẽ chỉ kết thúc bằng một thuật toán có độ phức tạp thời gian cao hơn hoặc cuối cùng sẽ làm điều tương tự BFS làm


-3

CNTT có thể tìm đường đi giữa hai đỉnh với số cạnh tối thiểu bằng DFS. chúng ta có thể áp dụng cách tiếp cận cấp độ


2
Xin cho biết thêm chi tiết. Tôi không thể nói thuật toán nào bạn đang cố gắng mô tả trong câu đơn này.
David Richerby

-3

Bạn có thể

chỉ cần đi qua biểu đồ theo cách dfs và kiểm tra

if(distance[dest] > distance[source]+cost[source_to_destination]){
    distance[dest] = distance[source] + cost[source_to_destination]);
}

Đây là liên kết cho giải pháp đầy đủ


1
Câu trả lời được chấp nhận cho rằng điều này là không thể, điều này mâu thuẫn với yêu cầu của bạn. Bạn có thể giải thích lý do tại sao bạn nghĩ rằng tuy nhiên phương pháp này hoạt động? (hoặc giải thích lý do tại sao phương pháp này hoạt động nói chung)
Thằn lằn rời rạc

Đây không phải là chỉ lặp lại câu trả lời của user2407394 , chỉ với mã khó hiểu (bạn chưa xác định bất kỳ biến nào trong số các biến đó có nghĩa là gì và nó không rõ ràng đối với tôi) thay vì giải thích?
David Richerby

Vâng, đó là việc thực hiện câu trả lời của user2407394. Xin lỗi vì sự bất tiện này. Tôi đã thêm ý kiến ​​trong mã. Bạn có thể kiểm tra nó ngay bây giờ.
Anmol Middha
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.