基于子集的求解方式详见我的另一篇博文: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;
}