Trong khi phản hồi của Aditya là tốt, tôi muốn làm rõ một vài điểm.
Bề rộng-Tìm kiếm đầu tiên
Breadth-First Search (BFS) chỉ sử dụng hàng đợi để đẩy và bật các nút bật / tắt. Điều này có nghĩa là nó truy cập các nút theo thứ tự độ sâu của chúng.
Nếu điều đó xảy ra là chi phí của tất cả các nhà khai thác là như nhau (để chúng được coi là bằng 1), thì nó được đảm bảo để tìm ra một giải pháp tối ưu.
Do đó, lưu ý những điều sau:
Nó chỉ liệt kê các đường dẫn cho đến khi giải pháp cuối cùng được tìm thấy. Không thể nói rằng thuật toán này tính toán đường dẫn ngắn nhất từ nút nguồn đến nút mục tiêu (period!). Nó chỉ tính khoảng cách đến tất cả các con đường mà nó gặp trên đường tới mục tiêu. Nói cách khác, bất cứ điều gì được nói về đường dẫn mà nó tìm thấy cho nút mục tiêu đều có thể được nói như nhau về bất kỳ đường dẫn nào khác được phát hiện bởi nó.
Không có gì ngăn cản BFS được áp dụng cho các biểu đồ với chi phí tùy ý. Điểm duy nhất cần nhớ là thuật toán duy trì tính đầy đủ (để nó được đảm bảo tìm ra giải pháp) mặc dù khả năng chấp nhận bị mất (nghĩa là nó không đảm bảo giải pháp được tìm thấy là tối ưu).
Ban đầu, BFS không xem xét danh sách ĐÓNG để lưu trữ tất cả các nút được mở rộng để bạn có thể đúng khi bạn nói rằng nó có thể rơi vào một chu kỳ. Tuy nhiên, vì nó lưu trữ rõ ràng tất cả các nút trong bộ nhớ và lớp yêu cầu bộ nhớ nhiều hơn luôn luôn là lớp mới nhất, BFS thường được mở rộng với danh sách ĐÓNG lưu trữ tất cả các nút được mở rộng trước đó. Nếu gặp phải một chuyển vị trước khi mở rộng một nút, nó có thể được bỏ qua một cách an toàn.
Thuật toán của Dijkstra
Trong thực tế, nếu bạn thêm danh sách ĐÓNG vào BFS như được đề xuất ở điểm 3 ở trên và cũng sắp xếp các nút trong ngăn xếp (danh sách được gọi là MỞ) theo thứ tự tăng dần của g(n) (nghĩa là chi phí của đường dẫn từ trạng thái bắt đầu đến n) sau đó bạn có thuật toán của Dijkstra (tốt, cũng có một sự khác biệt rất quan trọng khác, trong khi BFS dừng khi tạo nút mục tiêu, Dijkstra dừng lại khi mở rộng nó).
Vì thế:
Một lần nữa, thuật toán này chỉ liệt kê các đường dẫn cho đến khi giải pháp cuối cùng được tìm thấy. Không đúng khi nó truy cập tất cả các nút trong không gian trạng thái và thực tế, thuật toán của Dijkstra đã được biết là hoàn chỉnh (nghĩa là nó đảm bảo rằng một giải pháp sẽ được tìm thấy nếu có tồn tại) ngay cả khi đồ thị bên dưới là vô hạn.
Bạn có thể áp dụng thuật toán của Dijkstra một cách an toàn khi các hoạt động có chi phí tùy ý. Thật vậy, đó là lý do tại sao bạn thay thế hàng đợi bằng một đống trong đó các nút được chèn theo thứ tự tăng dần của chi phí của chúng.
Edgar Dijkstra ban đầu xem xét sử dụng danh sách ĐÓNG (bạn có thể kiểm tra giấy của anh ấy, nó chỉ dài vài trang và rất dễ đọc) để các chu kỳ được xem xét đúng.
Hy vọng điều này sẽ giúp, có thể cần một lời giải thích chi tiết hơn về các thuật toán này. Nếu vậy, đừng ngần ngại yêu cầu họ
Chúc mừng