问题:项目开发遇到了一个行程规划问题,就是去一个城市几个地点拜访,要求串联的距离最短
思考:这是一个旅行商的问题,不过这个不需要回到起点,只要求到终点就完成拜访,于是百度了很久,最终采用蚁群算法。
介绍:用蚂蚁的行走路径表示待优化问题的可行解,整个蚂蚁群体的所有路径构成待优化问题的解空间。路径较短的蚂蚁释放的信息素量较多,随着时间的推进,较短的路径上累积的信息素浓度逐渐增高,选择该路径的蚂蚁个数也愈来愈多。最终,整个蚂蚁会在正反馈的作用下集中到最佳的路径上,此时对应的便是待优化问题的最优解。
思路:
1.设定一个起点,其他的都是需要拜访的点,所有点设为一个数组,循环设置每个点为起点,调用高德api获取这个点与其他各点之间的距离,自身点设为无穷大,获取到的是一个二维数组,为了性能,调用的是高德api的批量接口,防止频繁请求接口。
2.得到的二维数组既是一个点与各个点之间的距离,通过模拟蚁群算法,得到最优解
蚁群算法代码:
蚁群算法中主要有下面几个参数需要设定:
蚂蚁数量:
设M表示城市数量,m表示蚂蚁数量。m的数量很重要,因为m过大时,会导致搜索过的路径上信息素变化趋于平均,这样就不好找出好的路径了;m过小时,易使未被搜索到的路径信息素减小到0,这样可能会出现早熟,没找到全局最优解。一般上,在时间等资源条件紧迫的情况下,蚂蚁数设定为城市数的1.5倍较稳妥。
信息素因子:
信息素因子反映了蚂蚁在移动过程中所积累的信息量在指导蚁群搜索中的相对重要程度,其值过大,蚂蚁选择以前走过的路径概率大,搜索随机性减弱;值过小,等同于贪婪算法,使搜索过早陷入局部最优。实验发现,信息素因子选择[1,4]区间,性能较好。
启发函数因子:
启发函数因子反映了启发式信息在指导蚁群搜索过程中的相对重要程度,其大小反映的是蚁群寻优过程中先验性和确定性因素的作用强度。过大时,虽然收敛速度会加快,但容易陷入局部最优;过小时,容易陷入随机搜索,找不到最优解。实验研究发现,当启发函数因子为[3,4.5]时,综合求解性能较好。
信息素挥发因子:
信息素挥发因子表示信息素的消失水平,它的大小直接关系到蚁群算法的全局搜索能力和收敛速度。实验发现,当属于[0.2,0.5]时,综合性能较好。
信息素常数:
这个参数为信息素强度,表示蚂蚁循环一周时释放在路径上的信息素总量,其作用是为了充分利用有向图上的全局信息反馈量,使算法在正反馈机制作用下以合理的演化速度搜索到全局最优解。值越大,蚂蚁在已遍历路径上的信息素积累越快,有助于快速收敛。实验发现,当值属于[10,1000]时,综合性能较好。
最大迭代次数:
最大迭代次数值过小,可能导致算法还没收敛就已结束;过大则会导致资源浪费。一般最大迭代次数可以取100到500次。一般来讲,建议先取200,然后根据执行程序查看算法收敛的轨迹来修改取值。
蚂蚁类:
public class Ant implements Cloneable {
public int[] m_nPath = new int[PublicFun.N_CITY_COUNT];// 蚂蚁走过的路径
public double m_dbPathLength;// 蚂蚁走过的路径长度
public int[] m_nAllowedCity = new int[PublicFun.N_CITY_COUNT];// 蚂蚁没有去过的城市
public int m_nCurCityNo;// 当前所在城市的编号
public int m_nMovedCityCount;// 已经去过的城市数量
/*
* 初始化函数,蚂蚁搜索前调用该方法
*/
public void Init() {
for (int i = 0; i &l

本文介绍如何使用蚁群算法解决行程规划问题,通过模拟蚂蚁寻找最短路径的行为,找到拜访多个地点的最短路线。文章详细解释了蚁群算法的工作原理及关键参数设置,并提供了算法的具体实现代码。

4657

被折叠的 条评论
为什么被折叠?



