干货|蚁群算法求解带时间窗的车辆路径规划问题(附Java代码及详细注解)

摘要:
蚁群算法通过模仿蚂蚁“每次在经过的较短路径上留下信息素”的行为,通过信息素记录下较优结果,不断逼近最优解。用蚁群算法解决VRPTW的过程主要分为以下几步:1.初始化蚂蚁信息;2.为每位agents构造完整路径;3.更新信息素;4.迭代,保存最优解。不过,VRPTW仅是一个载体,目的是为了深入了解蚁群算法的运行机制。对比之下,每次迭代时蚁群算法可能需要跟更多花费时间。从测试结果来看,蚁群算法确实没有禁忌搜索高效。

CSDN的朋友们,大 家 好 呀 !

我是微信公众号【程序猿声】的小编,来到CSDN与各位交流学习。
我们的公众号由华中科技大学管理学院管理科学与工程专业的学生自发组建,分享运筹优化算法和一些新奇有趣的计算机方面内容。我们注重干货分享,自行编写大量代码供大家学习交流,涉及各类运筹学相关的启发式、精确式算法,解决相关的TSP、VRP等问题。

今天小编带大家了解一种群体仿生类算法:蚁群算法。我们以VRPTW为例,介绍蚁群算法与之对应的操作流程,并在文末附上小编原创代码,供大家学习交流。

蚁群算法解决VRPTW目录:

蚁群算法简介

蚁群系统(Ant System或Ant Colony System)一种群体仿生类算法,灵感来源于在蚂蚁觅食的过程。学者们发现,单个蚂蚁的行为比较简单,但是蚁群整体却可以体现一些智能的行为,例如可以在不同的环境下找到到达食物源的最短路径
经进一步研究发现,蚂蚁会在其经过的路径上释放一种可以称之为“信息素”(phenomenon)的物质,蚁群内的蚂蚁对信息素具有感知能力,它们会沿着信息素浓度较高路径行走,而每只路过的蚂蚁都会在路上留下信息素。这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了。

蚁群算法通过模仿蚂蚁“每次在经过的较短路径上留下信息素”的行为,通过信息素记录下较优结果,不断逼近最优解。

蚁群算法与VRPTW

VRPTW在之前的推文里已经提到过多次了,这里不再详细介绍。感兴趣的朋友可以进入公众号查看过去的推文:

通过上面的介绍,大家不难想到,蚁群算法的关键在于信息素的利用。在蚁群寻找食物时,每次都由一只蚂蚁从头开始寻找(不同于禁忌搜索或遗传算法的邻域动作);每次寻找的不同点在于信息素的改变:不断往信息素浓的路径靠近。
用蚁群算法解决VRPTW的过程主要分为以下几步:
1.初始化蚂蚁信息(以下用agents表示);
2.为每位agents构造完整路径;
3.更新信息素;
4.迭代,保存最优解。

算法的关键在第二步。当你在客户点i时,如何找到下一个服务的客户j?
我们用以下公式计算客户j被服务的概率:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

代码测试

这次代码是由小编亲自编写的,由于是第一次编写ACS的VRPTW代码,有不周之处还请多包涵。
具体代码就不在此展示了,有兴趣的朋友可以在公众号内输入【ACSVRP】不带【】即可下载对应Java代码。

这里展示一下代码的运行情况。对Solomon Benchmark C101算例的测试效果如下:
25点(迭代次数1000,算例最优解191.3):
在这里插入图片描述
50点(迭代次数1000,算例最优解362.4):
在这里插入图片描述
100点(迭代次数1000,算例最优解827.3):
在这里插入图片描述
从测试数据来看,结果似乎不是很好。。。不过,VRPTW仅是一个载体,目的是为了深入了解蚁群算法的运行机制。
小编在测试时发现,参数设置地不同对结果还是有一定影响的。推荐的参数已经默认设置在代码中。

笔记总结

大致了解了蚁群算法对VRPTW的求解过程后,我的第一感觉是,和禁忌搜索的思路其实很像:两者都是利用过去搜索的“记忆”指导下一步走向。禁忌禁止一些方向,信息素引导一些方向。但两者又有很大区别:禁忌搜索作为邻域搜索类算法,每次都在旧解里变换出新解;蚁群算法却需要重新派出蚂蚁走完全程。对比之下,每次迭代时蚁群算法可能需要跟更多花费时间。从测试结果来看,蚁群算法确实没有禁忌搜索高效。当然,这可能和小编个人编写代码的能力有关。

但不可否认的是,大自然的智慧确实不同寻常,在每一个领域都闪耀着光辉,如此美妙绝伦。

代码下载

扫描下方二维码,登录公众号【程序猿声】,输入【ACSVRP】不带【】即可免费获取相关代码!

也可以访问作者github下载对应代码:点击这里!

在这里插入图片描述

免责声明:文章转载自《干货|蚁群算法求解带时间窗的车辆路径规划问题(附Java代码及详细注解)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇简单方法编写在群晖ds218play上运行的shCSS3之边框图片border-image下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#刷遍Leetcode面试题系列连载(1)

目录 系列教程索引 为什么要刷LeetCode 刷LeetCode有哪些好处? LeetCode vs 传统的 OJ LeetCode刷题时的心态建设 C#如何刷遍LeetCode 选项1: VS本地Debug + 在线验证后提交 选项2: VS Code本地Debug + 在 LeetCode 插件中验证和提交 安装C#相关插件 配置 .NET...

基于Qt的A*算法可视化分析

代码地址如下:http://www.demodashi.com/demo/13677.html 需求之前做过一个无人车需要自主寻找最佳路径,所以研究了相关的寻路算法,最终选择A算法,因为其简单易懂,是入门级的寻路算法。但是在验证的算法的时候,没有直观的感受,总是觉得会有什么问题,所以我就写了一个可视化的A算法验证,界面基于Qt开发。项目说明本项目主要分为2...

HBase中的压缩算法比较 GZIP、LZO、Zippy、Snappy [转]

网址: http://www.cnblogs.com/panfeng412/archive/2012/12/24/applications-scenario-summary-of-compression-algorithms.html GZIP、LZO、Zippy/Snappy是常用的几种压缩算法,各自有其特点,因此适用的应用场景也不尽相同。这里结合相关工...

openssl3.0 加密算法库编程精要 04 详解 EVP API 消息摘要

4.1 消息摘要的概念   消息摘要有好几个名字,比如单项散列函数,Hash 函数,它是一个将可变长度的输入串转换为一个固定长度的输出 串的函数。大多数消息摘要算法都是公开的,它的安全性依赖于它的单向性,如果仅获取到消息摘要的结果,想要从结果 反推出原文几乎是不可能的事情。并且对于输入串的细微改变,都会引发输出串的雪崩式变化,所以消息摘要一般用于校 验数据...

机器学习 —— 概率图模型(推理:团树算法)

  在之前的消息传递算法中,谈到了聚类图模型的一些性质。其中就有消息不能形成闭环,否则会导致“假消息传到最后我自己都信了”。为了解决这种问题,引入了一种称为团树(clique tree)的数据结构,树模型没有图模型中的环,所以此模型要比图模型更健壮,更容易收敛。 1.团树模型   链模型是一种最简单的树模型,其结构如下图所示,假设信息从最左端传入则有以下式...

TCP的拥塞控制

1.引言        计算机网络中的带宽、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做拥塞。        拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制是一个全局性的过程,和流量控制不同,流量控制指点对点通信量的...