Con đường ngắn nhất trên đồ thị vô hướng?


19

Vì vậy, tôi nghĩ rằng câu hỏi (mặc dù hơi cơ bản) thuộc về đây:

Giả sử tôi có một biểu đồ có kích thước 100 nút được sắp xếp theo mẫu 10 x 10 (nghĩ là bàn cờ). Biểu đồ là vô hướng, và không trọng số. Di chuyển qua biểu đồ bao gồm di chuyển ba không gian về phía trước và một không gian sang phải hoặc trái (tương tự như cách một hiệp sĩ cờ vua di chuyển trên một bảng).

Đưa ra một nút bắt đầu cố định, làm thế nào người ta sẽ tìm thấy con đường ngắn nhất đến bất kỳ nút nào khác trên bảng?

Tôi tưởng tượng rằng sẽ chỉ có một cạnh giữa các nút là di chuyển khả thi. Vì vậy, với thông tin này, tôi muốn tìm đường đi ngắn nhất từ ​​nút bắt đầu đến nút kết thúc.

Suy nghĩ ban đầu của tôi là mỗi cạnh đều có trọng số 1. Tuy nhiên, đồ thị không bị ảnh hưởng, vì vậy Djikstras sẽ không phù hợp với lý tưởng. Do đó, tôi quyết định thực hiện bằng cách sử dụng một hình thức thay đổi của tìm kiếm đầu tiên chuyên sâu.

Tuy nhiên, trong cuộc đời tôi, tôi không thể hình dung làm thế nào để có được con đường ngắn nhất bằng cách tìm kiếm.

Một điều khác tôi đã thử là đặt biểu đồ ở dạng cây với nút bắt đầu làm gốc, và sau đó chọn kết quả nông nhất (số hàng thấp nhất) cho tôi nút kết thúc mong muốn ... điều này hiệu quả, nhưng không hiệu quả, và do đó sẽ không làm việc cho một đồ thị lớn hơn.

Có ai có bất kỳ ý tưởng nào có thể chỉ cho tôi đi đúng hướng về cái này không?

Cảm ơn rât nhiều.

(Tôi đã cố gắng đưa vào một hình ảnh trực quan của biểu đồ, nhưng không thể do danh tiếng thấp của tôi)

Câu trả lời:


19

Nếu các cạnh trong biểu đồ chỉ thể hiện các bước di chuyển hợp lệ giữa các vị trí nhất định, sử dụng Dijkstra sẽ hoạt động tốt. Tuy nhiên, khi đồ thị không có trọng số, nó sẽ là quá mức cần thiết. Một tìm kiếm đầu tiên đơn giản sẽ cho câu trả lời tối ưu.


ohhhhhh người đàn ông tôi thậm chí không nghĩ về một BFS! cảm ơn rất nhiều
gfppaste

Làm thế nào là quá mức cần thiết? có thể được thực hiện là một chút khó khăn hơn không có gì khác.

Tôi cũng muốn thêm rằng BFS hiệu quả hơn. BFS có O(|E|), trong khi Dijkstra có O(|E| + |V|log(|V|).
Doug Ramsey

@ user742 BFS nhanh hơn Djikstras. Djikstra O(mn)trong khi BFS làO(V + E)
CodyBugstein

13

Nicholas đã cung cấp một câu trả lời hoàn hảo. Tuy nhiên, hãy để tôi giải quyết nỗ lực ban đầu của bạn để sử dụng tìm kiếm theo chiều sâu.

Đầu tiên, hoặc Dijkstra (hoạt động tốt với các nút không có trọng số như được ghi nhận bởi Nicholas Mancuso) hoặc tìm kiếm đầu tiên phát sinh trong sự lãng phí theo cấp số nhân của bộ nhớ của bạn. Tuy nhiên, ưu điểm của họ là không bao giờ mở rộng lại bất kỳ nút nào trong khi chúng được đảm bảo để tìm giải pháp tối ưu. Thật không may, giới hạn của chúng là khá quan trọng và chúng không nên được dự kiến ​​mở rộng một cách hợp lý.

dmmộtxkTôidmmộtx+Tôi×kdmmộtx= =k= =1 sau đó bạn được đảm bảo để tìm giải pháp tối ưu trong khi sử dụng tuyến tính bộ nhớ theo độ sâu của giải pháp.

bb-1b

Chúc mừng

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.