基於子集的求解方式詳見我的另一篇博文:https://blog.csdn.net/u011561033/article/details/93380842
由於子集S在程序中不好表示,並且隨着TSP模型增大,S的規模呈指數級上升,因此,本博文主要講述另一種TSP模型(可能叫做位勢法)。具體詳見.mod部分代碼(.dat和最終結果與基於子集求解TSP的博文中內容一致,因此此處不再重複贅述,詳見最開始的博文鏈接)。此處定義了range Snode=1..CityNum-1用於表示不考慮起點的TSP的點。
/*********************************************
* OPL 12.6.3.0 Model
* Author: ASUS
* Creation Date: 2019-6-21 at 下午5:42:13
*********************************************/
int CityNum = ...;//the number of city
range City =0..CityNum-1;
range SNode =1..CityNum-1;
float distance[City][City]=...;//the distance between city A and city B
dvar boolean visitCity[City][City];//City A to city B or not
dvar int u[City];
execute{
//u[0]=0;
for(var c1 in City)
for(var c2 in City)
if(c1<c2)distance[c1][c2]=distance[c2][c1];
}
minimize
sum(c1 in City)
sum(c2 in City)
distance[c1][c2]*visitCity[c1][c2];
subject to{
forall(c1 in City)
sum(c2 in City)
visitCity[c1][c2]==1;
forall(c2 in City)
sum(c1 in City)
visitCity[c1][c2]==1;
forall(c1 in City)
visitCity[c1][c1]==0;
forall(c1,c2 in SNode)
u[c1]-u[c2]+(CityNum-1)*visitCity[c1][c2]<=CityNum-2;
}