0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题...

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第1张图片
蚁群算法求解VRPTW问题https://www.zhihu.com/video/1235315908018298880

今天为大家讲解使用蚁群算法ACO)求解带时间窗的车辆路径VRPTW)问题。在讲解蚁群算法求解VRPTW问题之前,不知道各位是否观察过现实生活中蚂蚁是怎么觅食的,说得形象一点的话就是成群的蚂蚁前赴后继地找食物吃。大家应该也很容易理解,蚂蚁一般是成群出动,一旦一个蚂蚁找到了食物,那后面的蚂蚁肯定跟着前面蚂蚁的步伐才会有食物吃。


一 | 蚂蚁觅食图片演示

下面用下面几幅图演示蚂蚁觅食的过程:


01 | 初始状态

初始3只蚂蚁都在“起点”出发准备去寻找食物,每只蚂蚁都必须经过前往若干个“中转点”,然后才能到达“食物”点。每只蚂蚁都不想自己走更长的路,都想走最短的路找到“食物”。

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第2张图片

02 | 蚂蚁1开始觅食

蚂蚁1从起点出发后,凭借自己的嗅觉果断前往“中转点2”,然后从“中转点2”直接到达了“食物”点。蚂蚁在所行走的路径上都会留有信息素,目的是为了让后续的蚂蚁能感知到自己的“功劳”。蚂蚁1果断为后面的蚂蚁留下了“信息素”。

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第3张图片

03 | 蚂蚁2开始觅食

蚂蚁2嗅觉很好,一下子就闻到了蚂蚁1留下的信息素,所以果断跟着蚂蚁1的步伐来到了“中转点2”,然后直接到达了“食物”点。蚂蚁2也不吃独食,所以也留下了“信息素”,这时候很明显“起点->中转点2->食物”的这条路径上的“信息素”增多

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第4张图片

04 | 蚂蚁3开始觅食

现在只剩下蚂蚁3了,它能否跟着蚂蚁1和蚂蚁2的步伐快速地找到食物呢?

我们这只蚂蚁3啊,它比较傲娇,虽然闻到了“信息素”,但它不相信蚂蚁1和蚂蚁2走的路是最短距离的,它自己要另辟蹊径。所以它自己从“起点”出发后,来到了“中转点1”,然后从“中转点1”出发后也找到了“食物”点。蚂蚁3认为自己走的路是最短距离的,所以傲娇的留下了“信息素”。

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第5张图片

二 | VRPTW问题描述与数学模型


01 | 问题描述

VRPTW是指一定数量的客户,各自有不同数量的货物需求,配送中心向客户提供货物,由一个车队负责分送货物,组织适当的行车路线,目标是使得客户的需求得到满足,并能在一定的约束下,达到诸如路程最短、成本最小等目的。


02 | 数学模型

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第6张图片

目标函数(1)表示最小化总成本=1000*车辆使用数目+车辆行驶总距离;

表示顾客集合,约束(2)限制每个顾客只能被分配到一条路径;约束(3)~(5)表示车辆k在路径上的流量限制;约束(6)~(8)表示时间窗约束;约束(9)表示载重量约束。

三 | 算法设计


01 | 符号定义

信息素浓度

顾客之间距离

能见度

顾客j的左时间窗

顾客j的右时间窗

到达顾客j的时间

顾客j的等待时间

顾客j的时间窗宽度


02 | 蚂蚁从i点出发如何确定将要到达的j点

比如说现在需要服务6个顾客,编号分别为123456,现在我们采用蚂蚁觅食的思想为蚂蚁规划路径,蚂蚁从配送中心0出发,应该如何选择第1个要服务的顾客呢?

蚂蚁总不会扔个骰子,看哪面朝上吧。这个时候我们需要综合考虑信息素浓度能见度等待时间时间窗宽度,来为在i点的蚂蚁确定下一个前进的点j。

为什么要考虑这四个因素?我们一个个来进行解释。

(1)蚁群算法的精髓就是信息素浓度,我们一开始讲了有了信息素浓度,其它蚂蚁才会跟随前人的步伐前进,也就是说往“更优”的解进行搜索。

(2)可以看出能见度越大,表示两个顾客之间的距离越小,蚂蚁也不喜欢“舍近求远”的。(3)等待时间过长,蚂蚁估计都快睡着了,哪还有心思去服务其它的顾客呢?

(4)时间窗宽度越窄表示这个顾客的需求越急迫,蚂蚁也很理性的,知道要先服务急迫的顾客。

那究竟该如何把上述四个因素用数学公式表达出来呢?

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第7张图片

r是[0,1]的随机数,r0我们取0.5。

表示车辆k从i点出发后可以访问(
同时满足载重量约束和时间窗约束)的顾客集合。

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,那么

就是
11行11列(PS:因为还需要把配送中心加进去)。我们用下面这个公式更新信息素,其中Q为一个常数,我们设为5,TD为该只蚂蚁所构建完整路径的车辆行驶总距离。

上面所讲的是对一只蚂蚁的信息素进行更新,那么如果有10只蚂蚁的话,该怎么更新信息素呢?

这里我们采用的是只更新“最优蚂蚁”的信息素,“最优蚂蚁”就是这只蚂蚁构建出的完整路径解码出来的配送方案总成本最小。


06 | 蚁群算法流程图

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第8张图片

四 | 参考

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。

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第9张图片

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第10张图片

我们用自己编写的蚁群算法将上述数据跑一遍,

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第11张图片

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第12张图片

0x80070035找不到网络路径_蚁群算法(ACO)求解带时间窗的车辆路径(VRPTW)问题..._第13张图片

如果各位小伙伴有需求,可以添加小编QQ 934569572,添加好友时请注明来意

关注微信公众号:优化算法交流地,提取文章中的MATLAB代码

往期精选

  • 遗传算法(GA)求解带时间窗的车辆路径(VRPTW)问题MATLAB代码
  • 禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版附 MATLAB代码)
  • 节约算法(CW)构造带时间窗的车辆路径(VRPTW)问题初始解MATLAB代码
  • 遗传算法求解0-1背包问题(附matlab源代码)
  • 多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)
  • 多目标优化 | NSGA-II进阶教程(全网首个三目标优化教程)
  • 遗传算法(GA)求解VRPTW问题(附MATLAB代码)
  • 机器学习 | 基于遗传算法的BP神经网络优化算法(附MATLAB代码)
  • 遗传算法求解车间调度问题(附MATLAB代码)
  • VRPTW合集 [CW节约算法,TS(硬约束版),TS(惩罚函数版),LNS四种方法对比(附MATLAB代码)]
  • 多目标优化 | NSGA-II
  • word转换为pdf后图片失真的解决办法(全网首发)
  • 机器学习 | 简单实现Bp神经网络
  • 二维装箱问题之BL法修正版(附MATLAB代码)
  • 快速入门文献管理软件-EndNote X9
  • 最小二乘法(附MATLAB代码)
  • NSGA-II多目标优化算法讲解(附MATLAB代码)
  • 基于人工势场法的机器人二维路径规划(附MATLAB代码)
  • 基于粒子群算法的多目标搜索算法讲解(附MATLAB代码)
  • 蚁群算法通俗讲解(附MATLAB代码)
  • 混合粒子群算法通俗讲解(附MATLAB代码)

你可能感兴趣的:(composer,完整路径才能访问,floyed,最短路径的数目,matlab求最短路径代码,蚁群算法matlab,函数)