旅行商问题是一种十分重要的问题,在生产生活中都有重要应用。其变式也很多。这里讨论一下不闭合的旅行商问题的Matlab表示,并用相应函数来表示其产生的路径。
不闭合的旅行商问题,也就是起点和终点不需要重合,寻找连接所有点的最短路径的问题。
做理论研究时可能就要另起一个话题了,但是对于编程求解来说,因为实现环路是把原始的城市编号集(例如50个城市,那么现在编号集就有50个数据)直接在尾部添加编号集的第一个数据,这样就成为51个数据了,所以只要去掉这一步,就成为不闭合的TSP了。这是对原理的解释,不同人写的程序的具体实现不同。有的是采用编号集增加数据,有的是采用计算路径长度时算上首尾的距离等等。
以下是对百度知道里面找到的已有算法(点击打开链接)进行的整理和补充优化(原算法用于求解闭合的,这里修改为不闭合的):
数据样本:
C=[1304 2312
3639 1315
4177 2244
3712 1399
3488 1535
3326 1556
3238 1229
4196 1004
4312 790
4386 570
3007 1970
2562 1756
2788 1491
2381 1676
1332 695
3715 1678
3918 2179
4061 2370
3780 2212
3676 2578
4029 2838
4263 2931
3429 1908
3507 2367
3394 2643
3439 3201
2935 3240
3140 3550
2545 2357
2778 2826
2370 2975
];
处理:
结果:
代码解释:
函数ACATSP.m的第74行注释掉了,这样在计算路径长度时就不计首与尾的连接了,也就是成为了不闭合的TSP问题。
函数DrawRoute.m的第8和9行注释掉了,所以作出的图也就是不闭合的了。
这两个关键点保证计算和图示都是不闭合的TSP问题。