今天为大家讲解使用蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题。在讲解蚁群算法求解VRPTW问题之前,不知道各位是否观察过现实生活中蚂蚁是怎么觅食的,说得形象一点的话就是成群的蚂蚁前赴后继地找食物吃。大家应该也很容易理解,蚂蚁一般是成群出动,一旦一个蚂蚁找到了食物,那后面的蚂蚁肯定跟着前面蚂蚁的步伐才会有食物吃。
一 | 蚂蚁觅食图片演示
下面用下面几幅图演示蚂蚁觅食的过程:
01 | 初始状态
初始3只蚂蚁都在“起点”出发准备去寻找食物,每只蚂蚁都必须经过前往若干个“中转点”,然后才能到达“食物”点。每只蚂蚁都不想自己走更长的路,都想走最短的路找到“食物”。
02 | 蚂蚁1开始觅食
蚂蚁1从起点出发后,凭借自己的嗅觉果断前往“中转点2”,然后从“中转点2”直接到达了“食物”点。蚂蚁在所行走的路径上都会留有信息素,目的是为了让后续的蚂蚁能感知到自己的“功劳”。蚂蚁1果断为后面的蚂蚁留下了“信息素”。
03 | 蚂蚁2开始觅食
蚂蚁2嗅觉很好,一下子就闻到了蚂蚁1留下的信息素,所以果断跟着蚂蚁1的步伐来到了“中转点2”,然后直接到达了“食物”点。蚂蚁2也不吃独食,所以也留下了“信息素”,这时候很明显“起点->中转点2->食物”的这条路径上的“信息素”增多。
04 | 蚂蚁3开始觅食
现在只剩下蚂蚁3了,它能否跟着蚂蚁1和蚂蚁2的步伐快速地找到食物呢?
我们这只蚂蚁3啊,它比较傲娇,虽然闻到了“信息素”,但它不相信蚂蚁1和蚂蚁2走的路是最短距离的,它自己要另辟蹊径。所以它自己从“起点”出发后,来到了“中转点1”,然后从“中转点1”出发后也找到了“食物”点。蚂蚁3认为自己走的路是最短距离的,所以傲娇的留下了“信息素”。
二 | VRPTW问题描述与数学模型
01 | 问题描述
VRPTW是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行车路线,目标是使得客户的需求得到满足,并能在一定的约束下,达到诸如路程最短、成本最小等目的。
02 | 数学模型
目标函数(1)表示最小化总成本=1000*车辆使用数目+车辆行驶总距离;
三 | 算法设计
01 | 符号定义
信息素浓度
顾客之间距离
能见度
顾客j的左时间窗
顾客j的右时间窗
到达顾客j的时间
顾客j的等待时间
顾客j的时间窗宽度
02 | 蚂蚁从i点出发如何确定将要到达的j点
比如说现在需要服务6个顾客,编号分别为123456,现在我们采用蚂蚁觅食的思想为蚂蚁规划路径,蚂蚁从配送中心0出发,应该如何选择第1个要服务的顾客呢?
蚂蚁总不会扔个骰子,看哪面朝上吧。这个时候我们需要综合考虑信息素浓度、能见度、等待时间和时间窗宽度,来为在i点的蚂蚁确定下一个前进的点j。
为什么要考虑这四个因素?我们一个个来进行解释。
(1)蚁群算法的精髓就是信息素浓度,我们一开始讲了有了信息素浓度,其它蚂蚁才会跟随前人的步伐前进,也就是说往“更优”的解进行搜索。
(2)可以看出能见度越大,表示两个顾客之间的距离越小,蚂蚁也不喜欢“舍近求远”的。(3)等待时间过长,蚂蚁估计都快睡着了,哪还有心思去服务其它的顾客呢?
(4)时间窗宽度越窄表示这个顾客的需求越急迫,蚂蚁也很理性的,知道要先服务急迫的顾客。
那究竟该如何把上述四个因素用数学公式表达出来呢?
r是[0,1]的随机数,r0我们取0.5。
03 | 如何构造一只蚂蚁的完整路径
当蚂蚁在i点找不到可以访问的顾客时,即
举个例子,一共有6个顾客,那么一条完整的蚂蚁路径长度就为6。
假设蚂蚁从配送中心0出发,第一个访问的是顾客3,第二个访问的是顾客5,第三个访问的是顾客1,这时蚂蚁在顾客1找不到可以访问的顾客,所以蚂蚁必须返回配送中心0;这时蚂蚁从0重新出发依次访问顾客4、顾客2和顾客6,最终返回配送中心0,至此这只蚂蚁的路径全部构建完毕,即为351426。
04 | 如何将一只蚂蚁构建的完整路径解码成配送方案
还是继续上述的例子,这只蚂蚁构建的完整路径为351426,那么我们从头依次进行解码。
先把顾客3预先添加到第1条路径中,此时第1条路径只有顾客3,检查这条路径是否满足载重量约束和时间窗约束,检查完发现满足约束,于是把顾客3添加到第1条路径中,更新路径1,即为[3];
然后再将顾客5预先添加到第1条路径中,此时第1条路径为[3,5],检查是否满足约束,检查完发现满足约束,于是更新路径1,即为[3,5];
然后再将顾客1预先添加到第1条路径中,此时第1条路径为[3,5,1],检查是否满足约束,检查完发现满足约束,于是更新路径1,即为[3,5,1];
然后再将顾客4预先添加到第1条路径中,此时第1条路径为[3,5,1,4],检查是否满足约束,检查完发现不满足约束,则路径1解码完毕。
同理继续依次将剩余的426进行解码。
最终解码出的配送方案为(0代表配送中心)
第1条路径:0->3->5->1->0
第2条路径:0->4->2->6->0
05 | 如何更新信息素
我们在一 | 蚂蚁觅食图片演示这部分演示了蚂蚁如何进行觅食,我们也了解了蚂蚁在所经过的路径上会留下自己的信息素,那么一只蚂蚁在构建完一条完整的路径后,如何更新信息素
呢?比如说顾客数目为10,那么
上面所讲的是对一只蚂蚁的信息素进行更新,那么如果有10只蚂蚁的话,该怎么更新信息素呢?
这里我们采用的是只更新“最优蚂蚁”的信息素,“最优蚂蚁”就是这只蚂蚁构建出的完整路径所解码出来的配送方案的总成本最小。
06 | 蚁群算法流程图
四 | 参考
1.Solomon M M , Cordeau J , Etudes H , etal. The VRP with Time Windows[M]// The Vehicle Routing Problem. 1999.
2.李琳, 刘士新, 唐加福. 改进的蚁群算法求解带时间窗的车辆路径问题[J]. 控制与决策, 2010(09):102-106.
五 | 代码运行结果展示
输入数据,1个配送中心(0表示配送中心),25个顾客,车辆载重量为200,这组数据当前最优解是:车辆使用数目为3,车辆行驶总距离为191.3。
我们用自己编写的蚁群算法将上述数据跑一遍,
如果各位小伙伴有需求,可以添加小编QQ 934569572,添加好友时请注明来意。
关注微信公众号:优化算法交流地,提取文章中的MATLAB代码
往期精选