旅行商問題(TSP)的兩種模型

TSP簡介

一個商人從一點出發,經過所有點後返回原點。它需要滿足:除起點和終點外,所有點當且僅當經過一次;起點與終點重合;所有點構成一個連通圖。要求:得到這個商人經過所有點的最短路程。

TSP模型表示

設x[i][j]是一個0-1變量,其中1表示點i與點j之間有連邊,0表示這兩點之間無連邊,值得注意的是:x[i][j]不一定等於x[j][i]。

設c[i][j]表示點i到點j的距離,同理,c[i][j]不一定等於c[j][i]。

目標函數:

min sum(x[i][j]*c[i][j]) i,j分別遍歷(博客中插入公式不會,暫且這麼表示,該公式是一個二維for循環,分別遍歷i和j)

約束條件:

根據題目描述:所有點經過且只經過一次,並且構成一個環,因此任意一點的出度等於入度等於1,即需要滿足如下兩個約束:

1.sum(x[i][j])=1,遍歷i (該公式表示點j的入度等於1)

2.sum(x[i][j])=1,遍歷j (該公式表示點i的出度等於1)

若只有以上兩個約束條件,則形成的解中可能會產生若干個獨立的環,即所有點不能構成一個連通塊。爲打破子環的存在,還需加入一個約束條件。基於不同的角度,有兩種不同的約束方式,從而產生兩種不同的TSP數學模型,鑑於網上對兩種模型的比較較少,且介紹較爲簡單,同時由於前面幾個目標函數和約束1 2 的意義明確,因此本博文主要想介紹這兩種不同的約束的理由及各自優缺點。

A:sum(x[i][j])<=|S|-1;其中S表示任意一個點的子集(S集合中點的個數大於等於2個,小於CityNum個),例如:TSP中有3個點 a b c,則S表示{a,b},{a,c},{b,c}中的任意一個。上式中i和j在S集合中遍歷。解釋:若不滿足該約束,則存在一個TSP的點的子集,使得sum(x[i][j])>=|S|,我們可以很快知道sum(x[i][j]),遍歷i和j表示對應子圖中連邊數量(因爲x[i][j]=1表示從i到j有連邊),那麼當該子圖構成一個環時,邊的個數等於點的個數。因此,添加該約束能夠保證任意子圖不存在子環,從而保證所有點形成一個連通塊。具體cplex的代碼可以參考我的另一篇博文:https://blog.csdn.net/u011561033/article/details/93380842

B:u[i]-u[j]+(CityNum-1)*x[i][j]<=CityNum-2; i,j 從2個點開始遍歷。該公式新定義了一個變量,不用任何初始化操作。需要注意的是這邊的i和j是從2個點開始遍歷的,即需要把起點去掉。該公式也能滿足不存在環。因爲若x[i][j]=1,表示i到j有連邊,那麼原約束就變成:u[i]-u[j]<=-1 即 u[j]>=u[i]+1它保證u[t]從起點開始隨着商人的行走一直遞增,若存在子環,例如a-b-c-a,則會出現u[a]<u[b]<u[c]<u[a],從而導致不等式遞推不成立,因此,若滿足公式:u[i]-u[j]+(CityNum-1)*x[i][j]<=CityNum-2;就能保證不存在環。因此,不把起點也包括在內是非常重要的。我就因爲一開始把起點包括在內,導致出現了很多錯誤。

綜上所述,兩種TSP模型各有優缺點,其中A模型易於理解,但隨着數據規模增大會導致S的規模呈指數級上升。B模型理解稍微要難於A模型,但其約束表示方便,便於計算。綜合分析上述兩個模型,我認爲還是B模型更好,更能在程序中進行表示。具體cplex的代碼可以參考我的另一篇博文:https://blog.csdn.net/u011561033/article/details/93408062

據說當點的規模超過100時,上述cplex代碼中的兩種方法都將不再適用,需要加入column generate的技巧,等我嘗試後再更新。

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