2016-07-04 18 views
5

Tôi tiếp tục cố gắng để google này, nhưng kết quả tôi tìm thấy chỉ là thêm vào sự nhầm lẫn của tôi. Có vẻ như nó có thể được sử dụng cho cả hai? Nếu vậy, nó được thiết kế cho theo mặc định và những gì cần phải thay đổi để làm cho nó hoạt động theo cách không mặc định (cho dù đó là đạo diễn hay không được hướng dẫn)?Thuật toán của Dijkstra cho đồ thị có hướng hoặc không được chiếu?

Edit: để tham khảo, tôi đã có một vấn đề học kỳ cuối cùng mà tôi đã được đưa ra một danh sách như thế này (sân bay):

AER,KZN,1.8835 
ASF,KZN,1.3005 
ASF,MRV,1.1204 
CEK,KZN,1.9263 
CEK,OVB,1.6733 
DME,KZN,1.7892 
DME,NBC,2.2319 
DME,UUA,2.3786 
EGO,KGD,1.4649 
EGO,KZN,1.2603 
GYD,NBC,2.0755 

Tôi đã nói với nó được đạo diễn, và được yêu cầu tìm ra con đường ngắn nhất. Tôi đưa nó vào thuật toán của Dijkstra mà tôi tìm thấy trên Github (nó là một midterm máy tính mở nên chúng ta không có đủ thời gian để viết thuật toán từ đầu) và giáo sư của tôi nói con đường ngắn nhất mà nó trả về là không chính xác và thậm chí không phải là một con đường có thể bởi vì danh sách được cho là được hướng dẫn. Tôi đã không chắc chắn nếu tôi có nghĩa vụ phải sau đó sửa đổi các thuật toán hoặc danh sách để thực hiện điều chỉnh này. Nó đã kết thúc được trường hợp con đường ngắn nhất thứ 2 nó trở lại thực sự là con đường ngắn nhất, nhưng tôi vẫn tự hỏi vấn đề là gì.

Trả lời

14

Nó có thể được áp dụng cho cả hai. Đây là lý do tại sao:

Một đồ thị vô hướng về cơ bản là giống như một đạo đồ thị với hai chiều kết nối (= hai kết nối theo hướng ngược nhau) giữa các nút được kết nối.

Vì vậy, bạn không thực sự phải làm bất cứ điều gì để làm cho nó hoạt động cho một đồ thị vô hướng. Bạn chỉ cần biết tất cả các nút có thể truy cập từ mọi nút nhất định thông qua ví dụ: an danh sách kề kề.

+0

Vì vậy, nếu danh sách của tôi không bao gồm mục trùng lặp nhưng được đảo ngược cho mỗi cạnh, nó sẽ cho tôi đường dẫn ngắn nhất được hướng dẫn? Bởi vì tôi đã được cho biết danh sách mà tôi đã được chỉ dẫn, nhưng việc thực hiện Dijkstra của tôi đã sử dụng đã cho tôi một con đường ngắn nhất. – Austin

+2

Vâng, điều này nghe có vẻ như việc thực hiện bạn tìm thấy diễn giải các mục trong danh sách của bạn như là không được hướng dẫn, mà không phải là những gì bạn muốn, do đó bạn có lẽ nên chỉ thực hiện các thuật toán chính mình. Những cái tôi biết thường chỉ sử dụng một danh sách kề (đó là một danh sách chứa thông tin về các nút mà bạn có thể tiếp cận từ một nút cho trước * => các kết nối được hướng dẫn *). Đây là lý do tại sao tôi nói bạn không phải làm bất cứ điều gì để làm cho nó hoạt động cho đồ thị vô hướng, tuy nhiên, nếu thuật toán của bạn vì lý do gì tự động diễn giải các kết nối như hai chiều nó cần phải được thay đổi. – Keiwan

+0

@Keiwan Bài đăng này https://stackoverflow.com/questions/22649416/why-cant-prims-or-kruskals-algorithms-be-used-on-a-directed-graph cho biết thuật toán prims sẽ thất bại đối với đồ thị được chỉ dẫn. Vì vậy, Dijkstras mà gần giống như mồi cũng sẽ thất bại cho các ví dụ được đưa ra trong bài viết. – WSS

3

Biểu đồ được hướng dẫn chỉ có nghĩa là các cạnh nối các đỉnh có thể kết nối theo một cách, nhưng không phải là kết nối kia. Điều này có nghĩa là một đỉnh có thể tiếp giáp với một đỉnh khác, nhưng đỉnh khác có thể không tiếp giáp với đỉnh đầu tiên.

Trong ngữ cảnh của thuật toán Dijkstra, liệu biểu đồ có được hướng hoặc không được định hướng không quan trọng. Thuật toán của Dijkstra chỉ đơn giản là tham khảo các đỉnh liền kề của một đỉnh. Đó là danh sách kề này mà bạn sẽ phải sửa đổi nếu bạn đang thay đổi một đồ thị từ hướng đến vô hướng.

+0

Tôi hỏi vì tôi đã thực hiện Github của Dijkstra để tìm đường đi ngắn nhất trong danh sách các sân bay, nơi người hướng dẫn của tôi cho biết danh sách này được cho là đạo diễn, nhưng con đường ngắn nhất mà nó quay trở lại là con đường ngắn nhất. Vì vậy, trong trường hợp này tôi sẽ phải thay đổi danh sách chứ không phải là thuật toán? – Austin

+1

Bạn phải đảm bảo rằng danh sách sân bay chứa thông tin chỉ đường và thuật toán của bạn sẽ lưu ý các chỉ đường trong biểu đồ. Tìm ra một trong những điều kiện (hoặc cả hai) không hài lòng và điều chỉnh cho phù hợp. Nó có lẽ sẽ có lợi hơn cho bạn để thực hiện các thuật toán cho mình mặc dù, vì nó có vẻ như đó là cho công việc học tập. Tham chiếu là không sao, nhưng thoát khỏi thói quen sao chép. Ví dụ: –

+0

Vì vậy, nó có nên nhìn thấy 'AER, KZN, 1.8835' như là một cạnh đạo diễn và yêu cầu 'KZN, AER, 1,8835' ngoài làm việc theo hai chiều? Bởi vì tôi không tin rằng danh sách của tôi có cả hai mục, nhưng nó vẫn được coi là thứ tự ngược lại như các cạnh. Điều này có bình thường không? – Austin

3

Thuật toán Djikstras thường dành cho Tích cực biểu đồ có trọng số. Có lẽ bạn đang bối rối với thuật toán tìm kiếm đầu tiên (BFS), mà về cơ bản là Djikstras cho đồ thị không có trọng số. Sự khác biệt (giữa Djikstras và BFS), là khi bạn đang đối phó với các đường có trọng số, chúng ta phải xem xét điều chỉnh chi phí đường dẫn (trọng số) & các quyết định mà các nút truy cập sau hiện tại.

1

Bạn có thể sử dụng thuật toán Dijkstra trong cả đồ thị được hướng và không được chiếu, vì bạn chỉ cần thêm cạnh vào PriorityQueue khi bạn có cạnh để chuyển từ danh sách kề của bạn. Ví dụ: nếu một trong các nút của tôi có cạnh từ A đến B của trọng lượng 3, thì nếu nó được hướng từ BI sẽ không thể thêm cạnh vào A, trong khi AI có thể thêm nó vào B.

Giống như các câu trả lời khác, đảm bảo bạn không nhầm lẫn với trọng số. Thuật toán Dijkstra chạy trên các đồ thị cân nặng tích cực, nếu không hàng đợi ưu tiên sẽ là vô dụng.

Trong ví dụ của bạn, thuật toán Dijkstra sẽ hoạt động vì biểu đồ được cân bằng (tích cực) và đã hướng các cạnh.

Lỗi có thể là các cạnh đã được phân bổ kép dưới dạng biểu đồ không được chiếu. Bạn nên cẩn thận khi phân tích cú pháp các cạnh ở đầu vào các đối tượng của bạn để không nhân đôi các cạnh trong danh sách kề.

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