簡體   English   中英

對於通過實加權無向圖的單對最短路徑,最簡單的算法/解決方案是什么?

[英]What's the simplest algorithm/solution for a single pair shortest path through a real-weighted undirected graph?

我需要通過無向圖找到最短路徑,其節點是實數(正和負)加權。 這些權重就像您可以通過輸入節點獲得或松散的資源。

路徑的總成本(資源總和)不是很重要,但必須大於0,並且長度必須盡可能短。

例如,考慮如下圖:

A-start node; D-end node

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

最短的路徑是AEFED

Dijkstra的算法本身並不起作用,因為它無法處理負值。 所以,我想了幾個解決方案:

首先使用Dijkstra算法計算從每個節點到出口節點的最短路徑的長度,而不考慮權重。 這可以像A *中的某種啟發式值一樣使用。 我不確定這個解決方案是否可行,而且成本也很高。 我也想過實現Floyd-Warshall的算法,但我不確定如何。

另一個解決方案是使用Dijkstra算法計算最短路徑而不考慮權重,如果在計算路徑的資源總和后它小於零,則通過每個節點找到可以快速增加資源總和的相鄰節點,並將其添加到路徑(如果需要,可以多次)。 如果有一個節點足以增加資源總和,但距計算的最短路徑更遠,則此解決方案將不起作用。

例如:

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

你能幫我解決這個問題嗎?

編輯:如果在計算最短路徑時,您到達資源總和等於零的點,該路徑無效,因為如果沒有更多的汽油則無法繼續。

編輯:我沒有讀好這個問題; 問題比常規的單源最短路徑問題更先進。 我現在要離開這篇文章,只是為了給你另一個你可能覺得有用的算法。

即使在存在具有負權重的邊緣的情況下, Bellman-Ford算法也解決了單源最短路徑問題。 但是,它不處理負循環 (圖中的圓形路徑,其權重和為負)。 如果你的圖形包含負周期,那么你可能遇到了麻煩,因為我相信這會使問題NP完全(因為它對應於最長的簡單路徑問題 )。

這似乎不是一個優雅的解決方案,但考慮到創建循環路徑的能力,我沒有看到它的方法。 但我會迭代地解決它。 使用第二個示例 - 從A處的點開始,給它A的值。 移動一個'轉彎' - 現在我有兩個點,一個在B,值為5,另一個在D也值為5.再次移動 - 現在我有4個要跟蹤的點。 C:45,A:15,A:15,E:0。可能E上的那個可以振盪並變得有效,所以我們不能把它扔掉。 移動和累積等。第一次到達具有正值的結束節點時,您已完成(盡管在同一回合可能有其他等效路徑)

顯然有問題的是跟蹤點的數量會很快上升,我認為你的實際圖形比例子復雜得多。

我會像Mikeb建議的那樣做:在可能狀態的圖表上進行廣度優先搜索,即(位置,燃料左) - 對。

使用示例圖表:

由示例圖生成的狀態圖

  • 八角形:燃料耗盡
  • 框:由於空間原因省略了子節點

搜索此圖表, 如果存在此類路徑,則保證廣度優先為您提供實際到達目標的最短路徑。 如果沒有,您將不得不放棄一段時間(搜索x個節點之后,或者當您到達的分數大於所有負分數的絕對值的節點時),因為圖形可以包含無限循環。

如果你想找到最便宜的路徑(燃料方式),你必須確保在找到目標時不立即中止,因為你可能會發現多條相同長度的路徑,但費用不同。

嘗試將最小權重的絕對值(在本例中為5)添加到所有權重。 這將避免負面的ciclic路徑

當前的最短路徑算法需要計算到每個節點的最短路徑,因為它在一些節點上組合解決方案,這將有助於調整其他節點中的最短路徑。 無法僅為一個節點制作它。

祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM