1. 程式人生 > >差分約束與最短路徑

差分約束與最短路徑

差分約束問題(Difference constraints)

一類特殊的線性規劃(Linear Program)問題,例如求一個可行n維解向量X,使得其滿足以下m個式子:

利用“最短路徑”解決差分約束問題

①建立一個圖,包含n個結點,m條邊;且對Xj - Xi ≤ Wij,edge(Vi, Vj) = Wij

②增加結點V0,從V0出發引入n條權重為0的邊連結到各個原有結點

③以V0為源結點,利用Bellman-Ford演算法求V0到每個結點的最短路徑δ(V0, Vi)

若存在負權環,則解不存在;若Bellman-Ford執行良好,則Xi = δ(V0, Vi)

*⑤若要求Xi ≤ 0,則此方法求得的∑Xi最大(解的最大化)

*⑥此方法求的的max{Xi} - min{Xi}最小(L1範數跨度最小)

演算法的證明

分為兩部分證明:

①證明:存在負權環時解不存在

反證法。假設X使得其成立,則約束條件Xj - Xi ≤ Wij的左邊相加為0,右邊相加為負數,則0 ≤ 負數,矛盾

②證明:不存在負權環時解存在

δ(V0, Vj) ≤ δ(V0, Vi)​​​ + Wij     <=>     Xj - Xi ≤ Wij

演算法的優化

優化前,演算法的執行時間(n+1個結點,m+n條邊):O(n²+mn)

優化:沒有必要引入結點V0,只需要將所有結點的初始值由+∞改為0即可

優化後:O(mn)