【基礎算法】【ACM】差分約束系統與最短路算法

樸素差分約束系統的求解

樸素的差分約束系統是一個不等式組的集合,集合中每一個不等式都形如Ai – Aj <= Xk。對差分約束系統的求解也就是要對不等式組求得任意一組或者滿足某種最優性質的一組可行解。差分約束系統在各種計算機和實際的調度問題中都有應用,也可以對某些優化問題的求解提供幫助。

 

最樸素的差分約束系統可以將不等式組的求解轉換成有向圖上的單源最短路求解問題,可以利用Dijkstra算法Bellman-Ford算法或者SPFA算法等經典的單源最短路算法進行求解,下面着重介紹一下如何將不等式組的求解轉化爲圖上單源最短路問題。

 

討論不等式Aij <= Xj – Xi <= Bij,我們可以將其轉化爲兩個僅含有小於等於號的線性不等式:

       Xi – Xj <= -Aij

       Xj – Xi <= Bij

 

在ACM系列競賽中,經常有調度類的問題具有以上形式的約束或者具有能夠轉化爲以上形式的約束條件。

 

將每一個約束變量對應到有向圖中的一個結點,每個小於等於號的不等式對應一條有向邊,假如有n個約束變量,m個不等式約束,那麼我們就能得到一個n個點,m條有向邊的有向圖,記dist(i)爲源點到第i號結點的最短路徑的長度。

 

對於上面提到的第二個不等式,能夠繼續轉化爲Xj <= Xi + Bij。得到的這個式子形式很容易聯想到三角不等式,如果讓Xi表示源點到i號結點的最短路徑長度,也就說Xi ≡ dist(i),那麼從j號結點連一條長度爲Bij的有向邊到i號結點,那麼由於最短路的模型,就有dist(i) <= dist(j) + Bij,這樣一來也就滿足了相應的不等式約束條件。通過以上的轉化,有向圖中的一條邊u->v就對應了有關Xu和Xv的一個不等式約束。

 

可以進一步分析發現該問題要麼無解,要麼有無窮多的解。因爲如果有一組滿足條件的解(X1, X2, X3, …, Xn)那麼對於任意的常數k,(X1 + k, X2 + k, X3 + k, …, Xn +k)也是一組可行解。那麼就需要藉助一個基準值來表示一類解集,該基準也可以做爲單源最短路算法中需要用到的源點。

 

一般的解決方案是加入一個新的約束變量X0,讓其對應dist(0),同時在有向圖中加入0號結點作爲源點。加入源點之後還需要從源點連出一些有向邊,也就是加入一些約束方程。對於每一個約束變量Xi,加入一個新的不等式Xi – X0 <= 0,同時也在有向圖中連一條從源點0到第i號結點長度爲0的有向邊。由於X0對應源點到自身的最短路徑長度,那麼有dist(0) = 0,進而有dist(i) <= 0。這樣相當於將0定義爲一個最大值,所得到的一組解裏面每個Xi都會是0或者負數,最後可以全部加上Xi裏面最小的那個數來構造一組等價的非負的解。

 

通過以上的討論,已經能夠將每一項形如Aij <= Xj – Xi <= Bij的不等式集合求解轉化爲等價的有向圖上的單源最短路問題利用經典算法進行求解。不過對於該問題而言,進行更深入的討論和研究有極大的實際意義,該問題的變體與求解方法值得討論。下面將就以下問題進行更加深入的討論:

 

  1. 如果該問題無解,該如何判斷
  2. 如果有多組解的情況下,按照之前討論的方法所求得的解滿足什麼條件,是否能求出滿足其他最優性條件的解
  3. 如果約束變量集X中有一些是固定的常數,問題是否能夠求解
  4. 形如aijXi – bijXj <= Aij的不等式組能否求解
  5. 能否擴展到其他形式的約束問題求解
  6. 實際應用情況

解的存在性

在上一節中,討論了一種將差分約束系統的求解轉化爲一個等價的有向圖上的單源最短路求解問題。轉化所得到的有向圖中可能會有很多權值爲負的邊,這樣就引申出來圖上負環這樣一個圖論上面的問題。

 

如果一個有向圖上存在負環,也就是存在一個邊的序列( V1 -> V2, V2 - > V3, …, V(n-1) -> Vn, Vn -> V1 ),同時這些邊的權值和爲負數。對於該序列上涉及到的每一個結點,都可以通過無限地在這個環上面循環,來不斷地減小源點到它的距離,也就是約束變量Xi和dist(i)的值會不斷變小,並不會收斂到某個具體的解。

 

//這一部分可以具體的證明

 

差分約束系統的不可滿足性就是導致對於有向圖上出現負環的原因,也就是說可以通過判斷有向圖上是否存在負環來判斷該差分約束系統是否有解。有向圖單源最短路常用的求解算法中Bellman-Ford算法和SPFA算法是可以在求解的同時判斷有沒有負環的,所以可以利用這兩個算法來求解樸素的差分約束系統,同時可以判斷問題是否有解。

 

求得解的性質

在上文中討論的解法中,所得到的每個約束變量的值Xi都對應了源點到一個相應的結點的最短路徑的長度,所求得的解集本質上是確定且唯一的。如果按照之前介紹設額外的一個約束變量以及源點的解決方法,那麼求出來的一組解滿足這樣的一些性質:

  1. 每一個變量的解都是滿足約束條件下的最大解。
  2. 不考慮源點的情況下,原圖中可能會有多個弱聯通塊,不同的弱聯通塊的結點之間不存在差分約束關係,他們的解之間互不影響,但是共同以0作爲最高值參考

 

可以發現,按照上文的算法構造出來的解是具有侷限性的。不考慮源點的有向圖中屬於不同的弱聯通塊的點之間是沒有約束關係的,但是它們都以同樣的0作爲了最大值的參考標準。也就是說,實際上算法求出來的原本屬於不同弱聯通塊的變量的解不能反應他們之間的實際大小關係,單獨把某個弱聯通塊的一組解全部加上一個常數k也是滿足條件的一組解。那麼總的來說得到的一組解實質上具有這樣的形式(Xi1 + Ki, Xi2 + Ki, …, Xini + Ki, …),其中i1表示原圖中第i個弱聯通塊的第1個點的編號,Ki表示第i個弱聯通塊所整體加上的常數。如果要區分不同的弱聯通塊來得到變量的解的話,可以通過並查集來判斷某個結點屬於哪個弱聯通塊。

 

以上討論的都是關於變量在約束關係中能夠取得的相對最大值,事實上變量不一定要取得最大值。若對於某個變量Xi,能取到的最大值是dist(i),而期望的取值是dist(i) – k,也就是比能取到的最大值恰好小k。那麼我們可以再加入一個虛擬的結點i’,我們把原本連向i號點的邊連向i’,從i點連出的邊不變,然後加入一條從i’連線i的長度爲-k的邊。這樣一來dist(i’)在沒有負環的情況下,就會取得之前dist(i)的值,然後經過新加入的 i’ -> i 的約束,dist(i)就會取到比之前恰好小k的值。但是另一個矛盾產生了,變量的取值有時候並不能無限地小,所以我們不能總是用剛剛討論的方法來讓某個變量取得次大的值。這個時候在加入i’ -> i 這樣一條邊的時候判斷一下是否會形成負環就能解決這個問題,只要不會形成負環,那麼Xi就能通過這個方法取得比最大解恰好小k的解。

 

當然,利用上述的方法只能對單個變量進行這樣的調整,對於多個變量的解的調整,可能因爲變量之間的約束關係,解的結果之間會出現相互影響。如果是要將“Xi取得恰好比最大解小k的解”這個問題重複多次,可以每次重新構圖進行求解,而如果是同時求解這些問題,建立的圖所求出來的解實際上是隱含了一個先後關係,考慮的問題實際上是“Xi取得恰好比在前面n個結點取得次大解的情況下能取得的最大解小k的解”。這個問題的具體意義也可以引發更加深入的討論,本文不予深究。

 

部分變量已知的差分約束系統

在實際的場景中,差分約束系統中往往存在許多常量,也就是已知一些變量的取值不能變,同時有m個不等式約束,在這種情況下對其他變量的取值進行求解。部分變量已知的差分約束系統具有較高的研究價值,在此介紹一種基於不等式變化的簡單求解方法。

 

我們先將已經給定的變量取值確定下來,然後對於差分約束系統中的某個涉及到給定變量的不等式Xj – Xi <= Bij,考慮下述三種情況:

  1. Xi的取值已知。這種情況下不等式轉化爲 Xj <= B,由於上一節中討論的內容我們可以知道,算法中得到的dist(j)是取值的最大值,那麼將dist(j)初始設爲B即可。
  2. Xj的取值已知。這種情況下不等式轉化爲 Xi >= B,類似情況1,只要在算法執行的過程中判斷Xi是否會小於B即可,若某一時刻dist(i) < B,則該問題無解。
  3. Xi和Xj的取值都已知。這種情況下得到一個不等式A <= B,如果滿足直接忽略即可,如果不滿足,則該問題無解

 

可以發現不管是那種情況只要對模型進行一點點調整即可,但是對於情況2會出現一些問題。原本介紹的最簡單的求解方式通過引入了一個源點0來給出了一個最大的0,其他的都是以0爲基準得到的相對的大小,也就是可以隨意同時加上常數k的一組解。而在給定部分變量的情況下,就不能同時加上常數k來得到另一組解了,這樣的情況下需要將已知的一些值作爲基準來進行判斷。

 

重新回顧一下之前的做法。引入新的源點0,使得對每個約束變量Xi加入不等式 Xi – X0 <= 0,這樣一來就使得所有的變量Xi的取值是小於等於源點的取值X0的,X0也就表示了最大值。同樣地,在部分變量已知的情況下這個性質依然不會改變,但是之前的做法爲了理解和實現上的方便,完全使用了單源最短路的模型,也就是有dist(0) = 0,源點到自身的距離爲0,實質上是讓0作爲了最大值的基準。在有變量取值固定的情況下顯然不能將0作爲最大值的基準,這是不符合邏輯的,但是X0的取值就是最大值這一性質依然是不會變的。單源最短路的模型中,dist(0)也可以設爲其他非0的值,在該問題中可以考慮將其設爲一個足夠大的數INF即可解決以上問題。在單源最短路的算法中dist(0)不是0的情況下也能夠求解,但是求得的解是總體加上了dist(0)之後的結果,但是由於相對大小關係還是不變的所以解依然能夠得到保證。

 

這樣可以整理一下得到新的做法:

  1. 將之前做法中dist(0)初始設爲一個足夠大的數INF。
  2. 對於所有包含給定變量的不等式條件,根據以上三種情況進行判斷,將情況1的點dist初始值設爲計算得到的B,將情況2的點進行標記,在後續的最短路算法過程中若其dist小於某個臨界值A則問題無解,將情況3產生的常量不等式的真值進行判斷
  3. 按照之前的算法建圖進行最短路算法。

 

最後得到的一組解裏面,如果某個變量的取值接近INF,那麼意味着它跟初始已經給定的變量無關,只反應它跟其他接近INF的變量之間需要滿足的相對大小關係。剩下的變量所得到的值就是真實的最大解。

 

值得注意的是,以上含有已知變量的差分約束系統的求解也可以結合上一節討論的內容來求得部分的次優解或者對不同的弱聯通塊分別求解,具體方法就是本節與上一節的內容直接結合,在此不再贅述。

 

帶有係數的差分約束系統問題

在以上的差分約束系統的討論中,對於不等式Xi – Xj <= Aij,Xi和-Xj的係數都是1,接下來討論給其加上與不等式相關的正係數aij和bij的情況下如何求解。

 

首先確定如果係數跟變量是綁定的,那麼該問題就沒有意義。假如變量Xi有一個固定的係數ai,那麼實際上我們可以把aiXi當作一個整體Xi‘來求解,最後得到的Xi‘除上ai就能得到初始的Xi。所以接下來我們討論的係數是與不等式有關的,也就是說不等式的形式變成了aijXi – bijXj <= Aij。

 

下面介紹一種簡單直觀的求解方式。在把一個不等式通過前面幾節討論的方法轉換成一條有向邊的過程中,同時記錄一下邊的另外兩個參數aij和bij。然後我們可以在單源最短路模型當中修改一下鬆弛方程/狀態轉移方程,得到這樣一個轉移:dist(i) <= (bij*dist(j) + Aij) / aij,只需修改單源最短路算法中的鬆弛操作的代碼即可,在SPFA算法中依然能夠正確地得到答案,同時也能夠判斷負環。在Bellman-Ford以及其他最短路算法中是否依然有效,並未進行考證,本文也不對相關內容進行論述。

 

其他形式的約束問題

經過研究發現差分約束系統能夠用於某些涉及求和的線性規劃問題的求解,這些問題在實際的場景中也有着廣泛的應用。

 

首先是一類區間的規劃問題,對一個長度爲n的序列,有m個約束條件,每個約束條件是某個區間的和在[L, R]範圍內,要求任意一組可行解。形式化的描述爲m個形如L <= Xl + X(l+1) + … + X(r-1) + Xr <= R的不等式的約束問題求解。

 

該問題可以利用前綴和的思想,構造一個新的序列Yi = X1 + X2 + … + Xi。這樣一來不等式就轉化爲了L <= Yr - Y(l-1) <= R,形式與樸素的差分約束系統相同,進而能夠使用本文所介紹的方法來求得各種滿足某些條件的解。

 

接下來對區間的規劃問題進行擴展,可以發現只要能夠通過求前綴和的方式將問題轉化爲樸素的差分約束問題,那麼就能直接對齊進行求解。如果給定一顆有向的樹,每個點向它的兒子結點連邊,這樣的一顆樹,或者具有與這種形式的樹類似拓撲結構的對象,我們就可以通過求前綴的方式來對其中的一個小的區間段的權值和進行求解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章