差分約束系統詳解


1.問題定義

    差分約束系統屬於線性規划問題。在一個差分約束系統中,線性規划矩陣A的每一行包含一個1和一個-1,A的所有其他元素都為0。因此,由Ax≤b給出的約束條件是m個差分約束集合,其中包含n個未知元。每個約束條件為如下形式的簡單線性不等式:xj-xi≤bk(1≤i, j≤n,1≤k≤m)。如下圖5維向量x滿足8個不等式的差分約束,我們可以把未知量x1,x2,x3,x4,x5化為如下8個不等式:

                                          

我們可以發現當x=(x1,x2,…,xn)是差分約束系統Ax≤b的一個解,d為任意常數。則x+d=(x1+d,x2+d,…,xn+d)也是該系統Ax≤b的一個解。因此這個不等式組要么無解,要么就有無數組解。

 

2.解決方案

    求解差分約束系統,可以轉化成圖論的單源最短路徑問題。觀察xj-xi<=bk,會發現它類似最短路中的三角不等式d[v] <= d[u] + w[u,v],即d[v] - d[u] <= w[u,v]。因此,以每個變量xi為結點,對於約束條件xj-xi<=bk,連接一條邊E(i,j),邊權為bk。求單源最短路徑,必須有一個源點,然后再求這個源點到其他所有點的最短路徑,我們可以增加一個原點s與所有其他點相連,邊權均為0,xi - x0 <= 0。上圖中的不等式於是轉化為下圖中的有向圖:

                                                        

    下面介紹解決差分約束問題的方法:Bellman-Ford算法。Bellman-Ford算法是用來解決有向圖中存在負權邊的單源最短路徑問題的。

①將除源點外的所有頂點的最短距離估計值,即 d[v] = +∞, d[s] = 0;

②反復對邊集E中的每條邊進行松弛操作,使得頂點集V中的每個頂點v的最短距離估計值逐步逼近其最短距離;

③判斷邊集E中的每一條邊的兩個端點是否收斂。如果存在未收斂的頂點,則算法返回false,表明問題無解;否則算法返回true,問題有解,並且從源點可到達的頂點v的最短距離保存在d[v]中。

算法偽代碼如下:

Bellman-Ford()
{
   for each vertex v ∈ G do             //初始化

         d[v] = +∞

   d[s] = 0

  

   for i = 1 to n-1 do

      for each edge(u, v) ∈ G do

         if d[v] > d[u] + w(u, v) then   //松弛操作

            d[v] = d[u] + w(u, v)

 

   for each edge(u, v) ∈ G do

       if d[v] > d[u] + w(u, v) then    //檢查是否存在回路

          return false

   return true

 }


 

圖中任意一條最短路徑既不能包含負權回路,也不會包含正權回路,所以最多包含n-1條邊,從源點s出發每進行一遍松弛操作時,多生成了了從s出發層次為1的樹,而最短邊路徑最多為n-1,故只需要循環n-1次。最后計算的d[v]即為差分不等式的一組解。

 

3.算法優化

    Bellman-Ford算法的時間復雜度為O(VE),我們引入SPFA算法作為其優化算法,也就是進行隊列優化,初始化時將源s加入隊列每次從隊列中取出一個元素,並且對所有與之相鄰的點進行松弛,若某個相鄰的點松弛成功,則將其入隊,直到隊列為空時SPFA算法結束。


轉載自:http://hi.baidu.com/qinning199/item/65d270215bb365182a0f1c07


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



差分約束系統詳解 差分約束系統詳解 差分約束系統詳解 差分約束系統詳解 差分約束詳解 差分約束系統 差分約束系統 差分約束系統 差分約束系統 差分約束系統
 
粤ICP备14056181号  © 2014-2021 ITdaan.com