整數規劃求解有向圖最短路徑問題環路解決方法

整數規劃求解有向圖最短路徑問題環路解決方法


在有向圖中,經常遇到給定起點和終點以及必經點,選擇一條權重最小的路徑這樣的問題。這種問題可以看做是旅行商問題(tsp)的變種,tsp問題是一種組合爆炸問題,當規模變大時,時間耗費十分巨大。

在數學上tsp可以使用整數規劃求解,通過求解最小值問題得出需要的路徑, 其正確性通過添加約束來保證的。

圖問題不可避免的遇到環路問題,解決環路問題在規模比較小的時候,可以通過遍歷圖中所有節點,尋找出所有環路,對環路添加約束,進行求解,此方法一定能夠得到最優解。但是隨着圖的規模變大,不可能把所有環路全部得出。

問題描述

給定一個帶權有向圖,起點,終點和必經節點子集,尋找從起點到終點的一條最短路徑,此路經必須經過必經節點子集,必經節點子集部分順序。

求解方法

整數規劃,第三方庫lpsolve

數學描述

設有向邊爲{x0 ,x1 ,x2 ,... ,xn }, 權重爲{w0 ,w1 ,w2 ,... ,wn }

minixiwi

s.t.

xbeginoutdegree=1

xbeginindegree=0

xendoutdegree=0

xendindegree=1

xnecessitynodeoutdegree=1

xnecessitynodeindegree=1

xnonnecessitynodeoutdegree<=1

xnonnecessitynodeindegree<=1

環路問題

  1. 對於尋路問題不可避免的存在環路,由於以上約束只是充分條件,環路的約束未添加,當使用整數規劃求解最小值,其解空間中很有可能得到帶有環路
    tsp要求所有節點必須經過,其去環約束是:

    將環路所在的子集中所有對外節點的入和對外節點的出都大於等於1

  2. 在此問題中可以借鑑tsp環路解決方案。此方案的等價方案是:

    構成環路的所有邊的數量小於等於邊數量-1,即構成環路的邊不能同時存在

  3. 以上是針對環路添加的約束,如果運行時間 不限制,以上破環方法總能找到最優解。

考慮到運行時間受限時,以上算法去環後,下一個環路很有可能就在上一個環路附近加入一個點構成新的環路,而通路節點不變,若給通路也加入約束時,就可以進一步縮小解空間,通路約束可以添加爲:

通路中所有邊的數量小於邊數量-1,即每次都要在通路中加入新的節點

通過以上約束,將會減小解空間,加快收斂速度,針對環路不是很多的情況運行時間都在1s內,就可以求出最優路徑。

  1. 然而,當環路中小環路比較多時,同構以上約束同樣很難在段時間內求解出最優解,需要進一步縮小解空間,其思路可以是:

儘量多的利用環路的先驗知識,儘可能多的破除環路,同理,儘量多的利用通路的先驗知識,破除儘量多的不可能的通路。

當環路附近有很多小環路:

circles

當通路附近有許多小通路:

roads

針對以上情況可以採取一下策略:

  1. 用整數規劃求解出帶有環路的解;
  2. 加入環路約束和通路約束;
  3. 遍歷環路節點附近的節點,如果可以和環路構成環路,添加約束;
  4. 遍歷通路附近的節點,如能構成通路,加入約束。

以上策略可用於破除環路和通路附近的小環和小通路。防止下一次求解在原地構成環路,但是其遍歷也是非常耗時的操作,需要衡量時間,選擇遍歷層數。

在程序運行過程中,最耗時的是lp求解部分,若能減少lp求解次數,能夠極大地提高收斂速度,而減少lp求解次數,可以在預處理時就,加入一些環路約束,其過程如下:

對起點,終點和必經節點進行一定層數的遍歷,若有環路存在,就加入到約束中,在程序中試過7層遍歷,前提是遍歷時間複雜度是O(n) ,耗時很短,若在7層以上時,其耗時的代價就不會取得好的效果。
這裏寫圖片描述


以上添加的約束基本上就包含了所有的環路優化策略,但是當環路如下圖所示時,整數規劃將會失去其求解優勢,尤其是權重都爲0,或很小的值時,還是暴力搜索,收斂速度快。
net


以上僅爲個人見解,歡迎指正。

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