Lingo解决旅行售货员问题(Traveling Saleman Problem)

文章讨论了旅行售货员问题(TSP),通过将其转化为整数规划模型,设定旅行顺序、约束条件以避免子巡回,并使用随机距离矩阵举例。模型中涉及目标函数优化和0/1变量定义,以找到总旅费最小的路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

旅行售货员问题有一个推销员从城市1出发,要遍访城市2,3,…,n各一次,最后返回城市1。
已知从城市i到j的旅费为c_{ij},问应该按照怎样的次序访问这些城市,使得总旅费最少?
思路:将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

结果示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值