2012-01-06 48 views
11

Tôi cần tìm một đường đi ngắn nhất thông qua một đồ thị vô hướng có các nút là trọng số thực (dương và âm). Các trọng số này giống như các tài nguyên mà bạn có thể đạt được hoặc mất đi bằng cách nhập nút.Thuật toán/giải pháp đơn giản nhất cho một cặp đường đi ngắn nhất thông qua biểu đồ không có trọng số thực là gì?

Tổng chi phí (tổng tài nguyên) của đường dẫn không phải là rất quan trọng, nhưng nó phải lớn hơn 0 và độ dài phải là ngắn nhất có thể.

Ví dụ xem xét một đồ thị như sau:

A-start node; D-end node 

A(+10)--B(0)--C(-5) 
    \  | /
     \ |/
D(-5)--E(-5)--F(+10) 

Con đường ngắn nhất sẽ là A-E-F-E-D

thuật toán Dijkstra một mình không làm như lừa, bởi vì nó không thể xử lý các giá trị âm. Vì vậy, tôi nghĩ về một vài giải pháp:

Đầu tiên sử dụng thuật toán Dijkstra để tính toán chiều dài của một đường đi ngắn nhất từ ​​mỗi nút đến nút thoát, không cân nhắc trọng số. Điều này có thể được sử dụng như một số loại giá trị chẩn đoán như trong A *. Tôi không chắc chắn nếu giải pháp này có thể làm việc, và cũng rất tốn kém. Tôi cũng nghĩ về việc thực hiện thuật toán Floyd – Warshall, nhưng tôi không chắc chắn làm thế nào.

Một giải pháp khác là tính toán đường đi ngắn nhất với thuật toán Dijkstra không xem xét trọng số và sau khi tính toán tổng tài nguyên của đường dẫn nhỏ hơn 0, đi qua từng nút để tìm nút lân cận có thể tăng nhanh tổng tài nguyên, và thêm nó vào đường dẫn (nhiều lần nếu cần). Giải pháp này sẽ không hoạt động nếu có một nút có thể đủ để tăng tổng tài nguyên, nhưng xa hơn con đường ngắn nhất được tính toán.

Ví dụ:

A- start node; E- end node 
A(+10)--B(-5)--C(+40) 
     \ 
     D(-5)--E(-5) 

Bạn có thể giúp tôi giải quyết vấn đề này?

EDIT: Nếu khi tính đường đi ngắn nhất, bạn đạt đến điểm tổng số tài nguyên bằng 0, đường dẫn đó không hợp lệ vì bạn không thể tiếp tục nếu không còn xăng nữa.

+0

Trong ví dụ này, A-E-A-E-D có phải là giải pháp hợp lệ không? – mbeckish

+0

Có giá trị. – foobars

+2

Thoạt nhìn, có vẻ như có 2 cách để tăng tổng tài nguyên - 1) đi chệch khỏi đường đi ngắn nhất để tìm nút nguồn cao gần đó và 2) dao động giữa hai nút trên đường đi ngắn nhất với tổng tăng tài nguyên ròng. Sau đó, các trick là để tìm ra một heuristic để xác định tùy chọn để lựa chọn. – mbeckish

Trả lời

2

Điều này dường như không phải là giải pháp thanh lịch, nhưng với khả năng tạo ra các đường dẫn theo chu kỳ, tôi không thấy cách nào khác. Nhưng tôi sẽ giải quyết nó lặp đi lặp lại. Sử dụng ví dụ thứ hai - Bắt đầu với một điểm tại A, cho giá trị A của nó. Di chuyển một 'biến' - bây giờ tôi có hai điểm, một tại B với một giá trị là 5, và một tại D cũng với một giá trị của 5. Di chuyển một lần nữa - bây giờ tôi có 4 điểm để theo dõi. C: 45, A: 15, A: 15, và E: 0. Nó có thể là một ở E có thể dao động và trở nên hợp lệ vì vậy chúng tôi không thể quăng nó ra được nêu ra. Di chuyển và tích lũy, vv Lần đầu tiên bạn đạt đến nút kết thúc với một giá trị tích cực bạn đã thực hiện (mặc dù có thể có các đường dẫn tương đương bổ sung đi vào cùng một lượt)

Rõ ràng là có vấn đề trong đó số điểm theo dõi sẽ tăng khá nhanh và tôi cho rằng biểu đồ thực tế của bạn phức tạp hơn nhiều so với ví dụ.

+0

chắc chắn giải quyết được vấn đề, nhưng nó phải hiệu quả hơn – foobars

+0

Ngoài ra, nếu một số đường dẫn đến 0 tại một số điểm, nó sẽ bị loại bỏ. Nó chỉ là một cách nó nên được. Nếu bạn hết xăng, bạn sẽ không thể tiếp tục. Tôi quên đề cập đến nó trong phần mô tả, xin lỗi về điều đó. – foobars

0

Thử thêm giá trị tuyệt đối của trọng lượng minimun (trong trường hợp này là 5) vào tất cả các trọng số. Điều đó sẽ tránh các đường dẫn tiêu cực ciclic

Thuật toán đường dẫn ngắn nhất hiện tại yêu cầu tính toán đường đi ngắn nhất tới mọi nút bởi vì nó đi kết hợp các giải pháp trên một số nút sẽ giúp điều chỉnh đường đi ngắn nhất trong các nút khác. Không có cách nào để làm cho nó chỉ cho một nút.

Chúc may mắn

+0

oh! cũng ở đây [link] (http://stackoverflow.com/questions/2655880/how-to-optimize-dijkstra-algorithm-for-a-single-shortest-path-between-2-nodes) một số người cố gắng tối ưu hóa dijsktra khi u chỉ cần các giải pháp cho 1 nút – jorgeu

+0

Tôi không nghĩ rằng sẽ làm việc - trọng lượng kết quả sẽ là A: 15, E: 0, D: 0; để lại ấn tượng rằng A-E-D là một con đường hợp lệ. – Mikeb

4

Chỉnh sửa: Tôi không đọc đủ câu hỏi; vấn đề là nâng cao hơn so với một vấn đề đường dẫn ngắn nhất nguồn đơn thông thường. Tôi sẽ rời khỏi bài đăng này ngay bây giờ chỉ để cung cấp cho bạn một thuật toán khác mà bạn có thể thấy hữu ích.

Bellman-Ford algorithm giải quyết vấn đề đường đi ngắn nhất nguồn đơn, ngay cả khi có các cạnh có trọng số âm. Tuy nhiên, nó không xử lý tiêu cực chu kỳ (đường tròn trong biểu đồ có tổng trọng số âm). Nếu biểu đồ của bạn chứa các chu kỳ âm, có thể bạn đang gặp rắc rối, bởi vì tôi tin rằng làm cho vấn đề NP-hoàn thành (vì nó tương ứng với longest simple path problem).

1

Tôi sẽ làm điều đó tương tự như những gì Mikeb đề xuất: thực hiện tìm kiếm theo chiều rộng trên biểu đồ các trạng thái có thể, tức là (vị trí, nhiên liệu-trái) -pairs.

Sử dụng đồ thị ví dụ của bạn:

State graph resulting from your example graph

  • hình bát giác: Ran ra khỏi nhiên liệu
  • Boxes: nút Child bỏ qua vì những lý do không gian

Tìm kiếm đồ thị này rộng-đầu tiên là đảm bảo cung cấp cho bạn tuyến đường ngắn nhất thực sự đạt được mục tiêu nếu tuyến đường như vậy tồn tại. Nếu không, bạn sẽ phải từ bỏ sau một thời gian (sau khi x nút tìm kiếm, hoặc có thể khi bạn đạt đến một nút có điểm số lớn hơn giá trị tuyệt đối của tất cả các điểm âm được kết hợp), vì biểu đồ có thể chứa vòng vô hạn.

Bạn phải đảm bảo không hủy ngay lập tức khi tìm mục tiêu nếu bạn muốn tìm đường đi rẻ nhất (nhiên liệu khôn ngoan) vì bạn có thể tìm thấy nhiều đường dẫn có cùng độ dài, nhưng với chi phí khác nhau.