簡體   English   中英

具有兩種成本的有向無環圖中的最短路徑

[英]Shortest Path in a Directed Acyclic Graph with two types of costs

我得到一個有向無環圖 G = (V,E),可以假設它是拓撲有序的(如果需要)。 G 中的邊有兩種類型的成本——名義成本 w(e) 和尖峰成本 p(e)。

目標是找到從節點 s 到節點 t 的最短路徑,該路徑最小化以下成本:sum_e (w(e)) + max_e (p(e)),其中總和和最大值取自小路。

標准動態規划方法表明這個問題可以在 O(E^2) 時間內解決。 有沒有更有效的方法來解決它? 理想情況下,O(E*polylog(E,V)) 算法會很好。

- - 編輯 - - -

這是我使用動態編程找到的 O(E^2) 解決方案。

首先,按升序排列所有成本 p(e)。 這需要 O(Elog(E)) 時間。

其次,定義由狀態 (x,i) 組成的 state 空間,其中 x 是圖中的一個節點,而 i 在 1,2,...,|E| 中。 它表示“我們在節點 x 中,到目前為止我們看到的最高邊權 p(e) 是第 i 個最大的”。

令 V(x,i) 為從 s 到 x 的最短路徑(在經典意義上)的長度,其中遇到的最高 p(e) 是第 i 個最大的。 對於 x 的任何前任 y 和 1,...,|E| 中的任何 j,給定 V(y,j) 很容易計算 V(x,i) (有兩種情況需要考慮 - 邊緣 y->x 具有第 j 個最大權重,或者沒有)。

在每個 state (x,i) 處,此計算找到大約 deg(x) 值的最小值。 因此復雜度為 O(|E| * sum_(x\in V) deg(x)) = O(|E|^2),因為每個節點都與 |E| 相關聯不同的狀態。

我看不出有什么方法可以得到你想要的復雜性。 這是我認為在現實生活中實用的算法。

首先,將圖簡化為僅st之間的頂點和邊,並進行拓撲排序,以便您可以在 O(E) 時間內輕松找到最短路徑。

令 W(m) 為路徑 max(p(e)) <= m 的最小總和(w(e)) 成本,並令 P(m) 為這些最短路徑中最小的 max(p(e))。 問題解決方案對應於某個成本 m 的 W(m)+P(m)。 請注意,我們可以在 O(E) 時間內同時找到 W(m) 和 P(m),方法是找到一條最短的 W-cost 路徑,使用 P-cost 打破關系。

m 的相關值是實際發生的 p(e) 成本,因此請對這些成本進行排序。 然后使用 Kruskal 算法變體找到將s連接到t的最小 m,並計算 P(infinity) 以找到最大的相關 m。

現在我們有一個可能是最好的 m 值的區間 [l,h]。 區間內的最佳可能結果是 W(h)+P(l)。 制作一個按最佳可能結果排序的間隔優先級隊列,並重復刪除具有最佳可能結果的間隔,並且:

  • 如果最佳結果 = 實際結果 W(l)+P(l) 或 W(h)+P(h),則停止
  • 如果 l 和 P(h) 之間沒有 p(e) 成本,則停止
  • 如果最佳結果與實際結果之間的差異在某個可接受的公差范圍內,則停止; 或者
  • 如果您超出了一些計算預算,請停止
  • 否則,在 l 和 P(h) 之間選擇 ap(e) 成本 t,找到一條最短路徑得到 W(t) 和 P(t),將區間拆分為 [l,t] 和 [t,h],並且將它們放回優先級隊列並重復。

獲得准確結果的最壞情況復雜度仍然是 O(E 2 ),但是在如何停止方面有很多經濟性和很大的靈活性。

這只是一個 2 近似值,而不是一個近似方案,但也許它會激發某人想出一個更好的答案。

使用二分搜索,找到最小尖峰成本 θ*,使得 C(θ) 是使用尖峰成本 ≤ θ 的邊的 st 路徑的最小名義成本,我們有 C(θ*) = θ*。 每個解決方案的標稱成本或尖峰成本至少與 θ* 一樣大,因此 θ* 導致 2 近似解決方案。

二進制搜索中的每個測試都涉及在尖峰成本 ≤ θ 的子集上運行 Dijkstra,因此該算法需要時間 O(|E| log 2 |E|),好吧,如果你想了解它並使用斐波那契堆, O((|E| + |V| log |V|) log |E|)。

暫無
暫無

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

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