2010-06-18 33 views
5

Tôi có khả năng tính toán tuyến đường tốt nhất giữa điểm xuất phát và điểm đến bằng A *. Ngay bây giờ, tôi bao gồm các điểm giữa điểm bắt đầu và điểm kết thúc của mình bằng cách áp dụng A * cho các cặp trong tất cả các hoán vị của các điểm của tôi.Thêm điểm tham chiếu vào A * tìm kiếm đồ thị

Ví dụ:

Tôi muốn đi từ điểm 1 đến điểm 4. Ngoài ra, tôi muốn đi qua điểm 2 và 3.

tôi tính toán hoán vị của (1, 2, 3, 4):

1 2 3 4 
1 2 4 3 
1 3 2 4 
1 3 4 2 
1 4 2 3 
1 4 3 2 
2 1 3 4 
2 1 4 3 
2 3 1 4 
2 3 4 1 
2 4 1 3 
2 4 3 1 
3 1 2 4 
3 1 4 2 
3 2 1 4 
3 2 4 1 
3 4 1 2 
3 4 2 1 
4 1 2 3 
4 1 3 2 
4 2 1 3 
4 2 3 1 
4 3 1 2 
4 3 2 1 

sau đó, đối với mỗi hoán vị, tôi tính toán A * đường từ người đầu tiên thứ hai, sau đó thêm nó vào con đường từ thứ hai đến thứ ba, sau đó thứ ba đến thứ tư.

Khi tôi tính toán này cho mỗi hoán vị, tôi sắp xếp các tuyến đường theo khoảng cách và trả về giá trị ngắn nhất.

Rõ ràng, hoạt động này, nhưng bao gồm rất nhiều tính và hoàn toàn sụp đổ khi tôi có 6 waypoints (hoán vị của 8 mặt hàng là 40.320 :-))

Có cách nào tốt hơn để làm điều này?

+1

Tại sao bạn bao gồm các đường dẫn không bắt đầu ở 1 và kết thúc ở mức 4? Và, nếu bạn có lý do chính đáng để làm như vậy, nếu địa hình của bạn là một trong những hướng đi về phía trước, một hướng có cùng chi phí khi đi ngược, bạn không phải tính toán đường dẫn ngược (1234 và 4321) –

+1

Bạn chỉ cần để hoán đổi các điểm bạn phải vượt qua. Trong trường hợp của bạn, bạn chỉ cần thử '1 -> 2 -> 3 -> 4' và' 1 -> 3 -> 2 -> 4'. – IVlad

Trả lời

2

Trước hết, bạn nên lưu trữ tất cả các phép tính trung gian. Khi bạn đã tính toán tuyến đường từ 1 đến 2, bạn sẽ không bao giờ tính toán lại lần nữa, chỉ cần tra cứu trong bảng. Thứ hai, nếu biểu đồ của bạn không được định hướng, một tuyến đường từ 2 đến 1 có cùng khoảng cách với tuyến đường từ 1 đến 2, vì vậy bạn không nên tính toán lại nó.

Và cuối cùng, trong mọi trường hợp, bạn sẽ có một thuật toán theo cấp số nhân với số điểm bạn cần vượt qua. Điều này rất giống với vấn đề người bán hàng đi du lịch, và nó sẽ chính xác là vấn đề này nếu bạn bao gồm tất cả các điểm có sẵn. Vấn đề là NP-complete, nghĩa là nó có độ phức tạp, theo cấp số nhân với số điểm tọa độ.

Vì vậy, nếu bạn có nhiều điểm mà bạn phải vượt qua, sự sụp đổ theo hàm mũ là không thể tránh khỏi.

+0

Ghi nhớ FTW! –

+0

Bạn có thể xem [bài viết wikipedia] (http://en.wikipedia.org/wiki/Traveling_Salesman_Problem) về vấn đề Người bán hàng Du lịch. Lưu ý rằng có các siêu chẩn đoán bạn có thể thử. Cá nhân, tôi đã thực hiện vui vẻ [tối ưu hóa thuộc địa kiến] (http://en.wikipedia.org/wiki/Ant_colony_optimization) –

1

Như một câu trả lời trước đã đề cập, vấn đề này là vấn đề về nhân viên bán hàng du lịch NP-complete.

Có phương pháp tốt hơn phương pháp bạn sử dụng. Người giải quyết TSP hiện đại là do Georgia Tech's Concorde solver. Nếu bạn không thể sử dụng chương trình tự do có sẵn của riêng mình hoặc sử dụng API của họ, tôi có thể mô tả các kỹ thuật cơ bản mà họ sử dụng.

Để giải quyết TSP, họ bắt đầu với một heuristic tham lam được gọi là Lin-Kernighan heuristic để tạo ra giới hạn trên. Sau đó, họ sử dụng nhánh và cắt trên một công thức lập trình số nguyên hỗn hợp của TSP. Điều này có nghĩa là họ viết một loạt các ràng buộc tuyến tính và số nguyên, khi được giải quyết, cung cấp cho bạn đường dẫn tối ưu của TSP. Vòng lặp bên trong của họ gọi một bộ giải mã lập trình tuyến tính như Qsopt hoặc Cplex để có giới hạn thấp hơn.

Như tôi đã đề cập, đây là nhà nước-of-the-nghệ thuật vì vậy nếu bạn đang tìm kiếm một cách tốt hơn để giải quyết TSP hơn những gì bạn đang làm, đây là tốt nhất. Họ có thể xử lý hơn 10.000 thành phố chỉ trong vài giây, đặc biệt là trên TSP có trọng số, đối xứng (mà tôi nghi ngờ là biến thể bạn đang làm việc).

Nếu số lượng điểm cuối bạn cần xử lý là nhỏ, theo thứ tự từ 10 đến 15, thì bạn có thể thực hiện tìm kiếm chi nhánh và giới hạn bằng cách sử dụng minimum spanning tree heuristic. Đây là một bài tập sách giáo khoa trong nhiều khóa học AI giới thiệu.Thêm điểm tham chiếu hơn là bạn có thể sẽ sống lâu hơn thời gian chạy thực tế của thuật toán, và bạn sẽ phải sử dụng Concorde thay thế.

Các vấn đề liên quan