题目
旅行售货员问题有一个推销员从城市1出发,要遍访城市2,3,…,n各一次,最后返回城市1。
已知从城市i到j的旅费为,问应该按照怎样的次序访问这些城市,使得总旅费最少?
思路:将TSP表示成整数规划模型。
需要满足条件:
①访问城市i后必须要有一个即将访问的确切城市;
②访问城市j前必须要有一个刚刚访问过的确切城市;
③通过添加约束条件来避免子巡回的产生:u(i)-u(j)+n x(ij)≤n-1,2≤i≠j≤n。
证明略;
代码
MODEL:
SETS:
CITY/1..5/:U;
LINK(CITY,CITY):
DIST,!距离矩阵;
X;
ENDSETS
N=@SIZE(CITY);
DATA:!距离矩阵,它并不需要是对称的;
DIST=@QRAND(1);!随机产生,这里可改为你要解决的问题的数据;
ENDDATA
!目标函数;
MIN=@SUM(LINK:DIST*X);
@FOR(CITY(K):
!进入城市K;
!#ne# 若两个运算符不相等,则为true;否则为flase;
@SUM(CITY(I)|I#NE#K:X(I,K))=1;
!离开城市K;
@SUM(CITY(J)|J#NE#K:X(J,K))=1;
);
!保证不出现子圈;
!#gt# 若左边的运算符严格大于右边的运算符,则为true;否则为flase;
@FOR(CITY(I)|I#GT#1:
@FOR(CITY(J)|J#GT#1 #AND# I #NE# J:
U(I)-U(J)+N*X(I,J)<=N-1)
);
!限制U的范围以加速模型的求解,保证所加限制并不排除掉TSP问题的最优解;
@FOR(CITY(I)|I#GT#1:U(I)<=N-2);
!定义X为0/1变量;
@FOR(LINK:@BIN(X));
END