MIT演算法導論公開課之第18課 最短路徑演算法、Bellman和差分約束系統
Bellman-Ford 演算法
圖G=(V,E),選取s∈V作為圖的原點,此演算法可計算最短路徑δ(s,v)(v∈V)或報告出圖中存在負權值的環路。
Exercise
在路徑中存在負權值的環路時,將δ(s,v)設定為-∞。
Bellman-Ford 演算法偽碼
d[s] ← 0
for each v∈V-{s}
d[v] ← ∞
for i ← 1 to |V|-1
for each edge(u,v)∈E
if d[v] > d[u]+w(u,v)
d[v] ← d[u]+w(u,v) //鬆弛步驟
for each edge(u,v)∈E
if d[v] > d[u]+w(u,v)
報告圖中存在負權值的環路
else
δ(s,v)=d[v]
執行時間Time=O(V·E)。
- Ex:
注:每次選取邊的順序可以是都不一樣的,這裡為了簡單描述都採取了一樣的順序。
Bellman-Ford 演算法正確性
線性規劃(Linear Programming)
- 給定一個m x n階的矩陣A,一個m階的向量b和一個n階的向量c,目標是找到一個n階的向量x,能夠最大化cT·x且滿足約束條件Ax<=b,或是說明沒有符合要求的x存在。
- 圖解:
線性規劃問題解法
單一演算法(simplex algorithm):
最古老的演算法,最壞情況下執行時間為指數階的,但在實際使用中效果還不錯。
橢球演算法(ellipsoid algorithm):
理論上是第一個在多項式時間內解決線性規劃的演算法,但在實際使用中效果差。
內點法(interior point method):
在多項式時間內解決線性規劃,在實際使用中也很實用。
隨機抽樣(random sampling):
兩位MIT教授發明的演算法,理論上效果不錯。
線性可行性問題
找到x滿足約束條件Ax<=b,而不用最大化cT·x(找到可行解即可)。 此問題的複雜度並不比線性規劃問題低。
差分約束系統(System of difference constraints):
一個差分約束系統是一個線性可行性問題,矩陣A的每一行只有一個1,一個-1,其他值都為0。
即每一個描述約束條件的不等式都只包含兩個變數和一些數字,xj-xi<=wij。
Ex:
- 問題:
x1-x2<=3
x2-x3<=-2
x1-x3<=2 - 解:
x1=3
x2=0
x3=2
- 問題:
約束圖:
將xj-xi<=wij轉化為:
由此可知轉化後的圖G=(V,E),|V|=n,|E|=m。
與xj<=xi+wij類似的形式d[vj]<=d[vi]+wij。
Ex:
定理:
如果約束圖存在負權值的環路,那麼相應的差分約束系統無解。
證明:
假設v1 → v2 → … → Vk → V1是一個負權值的環路。
則有:
x2-x1<=w12
x3-x2<=w23
.
.
.
x1-xk<=wk1
左側相加為0,右側相加為負數,從而證明了差分約束無解。定理:
如果約束圖不存在負權值的環路,那麼相應的差分約束系統有解。
證明:
在約束圖G中加入一個新的頂點s,並加入從頂點s到其他所有頂點的邊,權值都設為1。
這樣就可以在此圖上執行Bellman-Ford演算法求最短路徑。
設xi=δ(s,vi)
要滿足xj-xi<=wij
即證δ(s,vj)-δ(s,vi)<=w(vi,vj)
δ(s,vj)<=δ(s,vi)+ w(vi,vj)
由反正法此式可知顯然成立,即Bellman-Ford演算法求得的鍵值即為可行解。
差分約束系統時間:
使用Bellman-Ford演算法,執行時間為O(m·n)。Exercise:
使用Bellman-Ford演算法獲得的差分約束系統的解,滿足xi<=0,xj-xi<=wij,且得到的是Max(x1+x2+…+xn)和Min(max xi – min xi)(儘可能的密集)的解。
最小化了線性規劃範數。
VLSI佈局問題
將一堆電路零件放在一起,要求它們之間有個距離限制。
一維上的佈局可抽象成差分約束問題,進而使用Bellman-Ford演算法求得儘可能緊湊的積體電路佈局方案。
- 其他應用:
例如視訊剪輯方案的制定。