2010-03-23 13 views
11

Giả sử tôi có 10 điểm. Tôi biết khoảng cách giữa mỗi điểm.Thuật toán: đường đi ngắn nhất giữa tất cả các điểm

Tôi cần tìm tuyến đường ngắn nhất có thể đi qua tất cả các điểm.

Tôi đã thử một vài thuật toán (Dijkstra, Floyd Warshall, ...) và tất cả đều cho tôi con đường ngắn nhất giữa bắt đầu và kết thúc, nhưng họ không tạo một lộ trình với tất cả các điểm trên đó.

Các hoán vị hoạt động tốt, nhưng chúng quá tốn kém tài nguyên.

Thuật toán nào bạn có thể khuyên tôi xem xét vấn đề này? Hoặc là có một cách tài liệu để làm điều này với các thuật toán nêu trên?

+1

Nếu chỉ có 10 điểm, thì đó chỉ là 3.628.800 hoán vị. Đó không phải là đắt khủng khiếp. Bạn đang mong đợi để làm được rất nhiều trong số này? –

+0

10 điểm là một ví dụ. Chúng ta phải viết một kịch bản có thể lấy bất kỳ số điểm nào. – Jeroen

Trả lời

24

Hãy xem travelling salesman problem.

Bạn có thể muốn xem xét một số trong số heuristic solutions. Họ có thể không thể cung cấp cho bạn 100% kết quả chính xác, nhưng thường họ có thể đưa ra các giải pháp đủ tốt (2 đến 3% từ các giải pháp tối ưu) trong một khoảng thời gian hợp lý.

+0

Bạn có thể đảm bảo ít hơn 2 MST theo thời gian tuyến tính. –

+0

Nhân viên bán hàng đi du lịch trông giống như những gì tôi cần với sự khác biệt mà nó không phải là một mạch kín. Sẽ có một cái nhìn tại các giải pháp heuristic. Tnx! – Jeroen

6

Điều này rõ ràng là Travelling Salesman problem. Cụ thể cho N=10, bạn có thể thử thuật toán ngây thơ O(N!) hoặc sử dụng Dynamic Programming, bạn có thể giảm số này thành O(n^2 2^n), theo không gian giao dịch.

Ngoài ra, vì đây là một vấn đề NP-hard, bạn chỉ có thể hy vọng cho một xấp xỉ hoặc heuristic, cho các thông báo trước.

2

Như những người khác đã đề cập, đây là một phiên bản của TSP. Tôi nghĩ rằng Concord, được phát triển tại Georgia Tech là nhà giải pháp hiện đại nhất. Nó có thể xử lý lên tới 10.000 điểm trong vòng vài giây. Nó cũng có một API dễ làm việc với nó.

0

Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm, thực sự:

Floyd Warshall

Trong khoa học máy tính, Thuật toán Floyd-Warshall (đôi khi được gọi là các WFI Algorithm [làm rõ cần thiết], Thuật toán Roy – Floyd hoặc chỉ Thuật toán của Floyd) là thuật toán phân tích biểu đồ để tìm các đường dẫn ngắn nhất trong biểu đồ có trọng số (với trọng số cạnh dương hoặc âm). Một thực hiện duy nhất của thuật toán sẽ tìm ra độ dài (tóm tắt trọng lượng) của đường đi ngắn nhất giữa tất cả các cặp đỉnh mặc dù nó không trả lại chi tiết của những con đường mình

Trong "Con đường xây dựng lại" subsection nó giải thích cấu trúc dữ liệu bạn sẽ cần để lưu trữ các "đường dẫn" (thực sự bạn chỉ lưu trữ nút tiếp theo để đi đến và sau đó trivially xây dựng lại bất kỳ đường dẫn được yêu cầu khi cần thiết).

+0

Trên thực tế, OP đề cập đến FW và rõ ràng không phải những gì anh ta yêu cầu. – ziggystar

+1

OP có thể đã đề cập đến nó nhưng điều đó không có nghĩa là anh ta biết về việc xây dựng lại con đường, đó là những gì bình luận ở trên cho biết thêm. –