欢迎光临散文网 会员登陆 & 注册

如何求解有条件的“多旅行商问题”

2020-07-28 22:08 作者:数学建模学习交流  | 我要投稿

友情提示:本文将在上一篇推送的基础上探讨有条件的多旅行商问题,因此在阅读本篇内容前请先观看上一篇的内容:

模拟退火解决“多旅行商问题”

(点击上方标题查看)


上一篇推送中,我介绍了用模拟退火求解MTSP(多旅行商问题)的思路,模拟退火里面最重要的一个步骤就是如何定义解以及怎么去产生新解,假设现在有n+1个城市,第0号为起始城市,其他城市编号为1至n,一共有m个可以派遣的旅行商,那么我们生成的解应该为:

m-1个0 和 1至n 组成的一个随机排序

而产生新解的方法和TSP中一致,分别是交换法,移位法和倒置法。


如果大家动手编程实现了上文的思路的话,应该会发现下面这个现象:无论初始旅行商的个数是多少,我们得到的最优解中都只有一个旅行商参与了旅行,其他的旅行商都不出门(也就是最终得到的解中,m-1个0位于整个序列的最前面或者最后面),那么这时候的MTSP问题退化为了TSP问题

为什么会出现这个现象呢?其实你好好考虑下也不难理解:MTSP中多个旅行商都要从起始城市出发最终再返回到起始的城市,这里面实际上就造成了旅行效率的降低。

以2个旅行商为例,假设起始城市用图中红色的*表示,下图是两个旅行商都参与旅行时绘制出来的图像,如果我们只让一个旅行商参与旅行的话,得到的总旅行距离一定会小于等于现在的距离。

我们只需要利用初中学的两边之和大于第三边就能证明这一点,将下图中原来的x和y两个边去掉,并增加一个新的边z,很明显z≤x+y:

从上图可以看出,这个时候整个路径构成了一个闭环,即形成了TSP的解。

同样的道理,如果参与旅行的旅行商数量更多,那么最终经过的路径也会越大,这就是MTSP得到的解总会变得和TSP一样的原因。


那么,多旅行商问题存在的意义是什么呢?

答案是可以加入限制条件!


比如我们这里可以加入一个或者多个这样的限定条件:

(1)每个旅行商访问的城市数量有一个限制范围,例如不超过10个城市,不少于5个城市;

(2)每个旅行商总的旅行距离有一个限制范围;

(3)需要访问的城市上存在着时间上的约束,例如派遣专家去各地调研,A地接待时间是7月10日至15日,B地接待时间是7月13日至19日,C地……


事实上在上个推送中我们提过,在运筹学中有一个很著名的问题:车辆路径问题(Vehicle Routing Problem,VRP),这个问题有很多种不同的变形(引入了不同的限定条件),也是运筹学界目前研究的热点问题之一,我们介绍的多旅行商问题就是车辆路径问题的一种,因此VRP这才是正统问题!大家在看完本节的推送后,可以自己搜索VRP中里面相对较为简单的CVRP和VRPTW,如果能解决这两个问题的话,解决其他更难的问题也会有很好的思路了。


那么,怎么用模拟退火解决这种带有约束条件的问题呢?

这里给大家一点思路,我们可以在模拟退火的目标函数中动手脚,只需要在目标函数中加入违背约束的惩罚项即可!

这里我举一个简单的例子,假如现在有101个城市,其中0号城市是起始城市,有5个旅行商可以供你调遣,且按照计划每个旅行商最多能访问m个城市。假设每个旅行商每单位行程你需要支付的差旅成本为10元,每派遣一个旅行商的固定成本为10000元,如果某个旅行商访问的城市数超过了m个,则需要给予一定的补偿费,每多出一个城市给予的补偿费为x元,那么怎样安排旅行商的分配方案可以使得总的成本最低?那么在模拟退火算法中,你的目标函数应该是怎样的呢?

10*总行程长度+10000*派遣的旅行商个数+补偿费



这里的补偿费实际上就是我们对违背了最大访问城市约束的一个惩罚,如果这里的x取得特别特别大的话,那么公司在安排任务时绝对不会选择让某个旅行商去超过最大访问城市数的方案;如果x取得较小的话,公司可能会权衡这个补偿费用和其他两项花费的大小,而这不就是很多企业选择让员工加班的理由吗?

因此,在有约束的MTSP编程进行求解中,我们需要做的就是改变这里的目标函数的计算,而以上的分析过程就是我们整体建模的思路!


希望大家在这两篇推送中能有所收获,如果觉得讲的不错的话,请在本文下方点赞支持哦!



如何求解有条件的“多旅行商问题”的评论 (共 条)

分享到微博请遵守国家法律