蚂蚁算法蚁群算法-原理-思路-步骤-程序实现

❀算法介绍

历史

蚁群优化算法是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。

背景

现实世界中,(初始状态)每个蚂蚁将在一定范围内随机游走,并通过在所经过路径上选留信息素的方式,不断把相关的食物信息反馈给蚁群。如果其他蚂蚁发现了那条路径,那么这些妈蚁很可能不再保持原来的随机游走,而跟随这条路径**(一条路径上的信息素越多,其他蚂蚁选择这条路径的可能性越大)**。如果由该路径他们最终发现了食物,那么他们将在这条路径上继续增加信息素。由于这条路径上信息素的不断增加,最终所有蚂蚁将找到食物。

❀算法原理

  • 蚁群算法试验中,在各个蚂蚁在没有事先告诉它们食物在什么地方的前提下开始寻找;
  • 其次,要让蚂蚁找到食物,就需要让它们遍历空间上的所有点
  • 再次,如果要让蚂蚁找到最短的路找食物。当一只找到食物以后,它会向环境释放一种信息素,吸引其他的蚂蚁过来,这样越来越多的蚂蚁会找到食物。
  • 但有些蚂蚁并没有像其它蚂蚁一样总重复同样的路,它们会另辟蹊径,**如果令开辟的道路比原来的其他道路更短,那么更多的蚂蚁被吸引到这条较短的路上来。**最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。

  1. 假设,dij为节点i到节点j距离,节点i、j上的信息素含量用τij(t)表示。先选定一个起始节点,将所有u个蚂蚁放在起点处,所有路径上信息素含量相同,蚂蚁k根据各条路径上信息素分布的大小选择下一个移动节点,加入禁忌表List来记录每一只蚂蚁经过节点的顺序,防止蚂蚁再次经过该节点,蚂蚁经过所有指定的节点即完成了一次算法的迭代。在蚂蚁搜索路径节点的过程中,t时刻下,蚂蚁k从节点i移动至节点j的移动概率p为:

  1. 其中,allowedk表示蚂蚁k从当前节点移动到下一个所有可能经过节点的集合。依据上述内容α为信息素启发式因子,代表路径上信息素存在的多少,信息素多表示该路径通过的蚂蚁多,反之少量蚂蚁通过。β为期望启发因子,表示蚂蚁在选择该路径节点重要性的考虑,其值越大,说明移动到此点的几率越大,启发式函数ηij(t)计算方法为:

  1. 由上式可以看出启发函数ηij(t)和dij对于每一只蚂蚁成反比关系,节点之间的距离越长,启发函数的值越小。当所有的蚂蚁完成一次循环后,各个城市间链接路径上的信息素浓度需进行更新。首先是信息素挥发,其次是蚂蚁在它们所经过的边上释放信息素,其中ρ为信息素挥发系数,且0<ρ≤1,计算公式为:

当(i,j)在Lk上
=dij,当蚂蚁构建的路径长度dij越小,则路径上各条边就会获得更多的信息素,则在以后的迭代中就更有可能被其他的蚂蚁选择。每当蚂蚁完成一次循环后,便清空禁忌表,重新回到初始城市,准备下一次周游。
除此之外还可以通过更新改进信息素规则和启发函数可以缩小全局路径和理论最优路径差值。

❀算法步骤

  • 1.对相关参数进行初始化,如蚁群规模(蚂蚁数量)u、信息素重要程度因子α、启发函数重要程度因子β、信息素挥发因子ρ、信息素释放总量Q、最大迭代次数itermax。

    2.构建解空间,将各个蚂蚁随机地置于不同的出发点,计算每个蚂蚁k(k=1,2,3…m)下一个待访问城市,直到所有蚂蚁访问完所有城市。

    3.更新信息苏计算每个蚂蚁经过路径长度Lk(k=1,2,…,m),记录当前迭代次数中的最优解(最短路径)。同时,对各个城市连接路径上信息素浓度进行更新。

    4.判断是否终止若iter<itermax,则令iter=iter+1,清空蚂蚁经过路径的记录表,并返回步骤2;否则,终止计算,输出最优解。

❀程序实现

def getdistmat(coordinates):num = coordinates.shape[0]distmat = np.zeros((52, 52))for i in range(num):for j in range(i, num):distmat[i][j] = distmat[j][i] = np.linalg.norm(coordinates[i] - coordinates[j])return distmat//初始化
distmat = getdistmat(coordinates)
numant = 45  // 蚂蚁个数
numcity = coordinates.shape[0]  // 城市个数
alpha = 1  // 信息素重要程度因子
beta = 5  // 启发函数重要程度因子
rho = 0.1  // 信息素的挥发速度
Q = 1//信息素释放总量
iter = 0//循环次数
itermax = 275//循环最大值
etatable = 1.0 / (distmat + np.diag([1e10] * numcity))  // 启发函数矩阵,表示蚂蚁从城市i转移到矩阵j的期望程度
pheromonetable = np.ones((numcity, numcity))  // 信息素矩阵
pathtable = np.zeros((numant, numcity)).astype(int)  // 路径记录表
distmat = getdistmat(coordinates)  // 城市的距离矩阵
lengthaver = np.zeros(itermax)  // 各代路径的平均长度
lengthbest = np.zeros(itermax)  // 各代及其之前遇到的最佳路径长度
pathbest = np.zeros((itermax, numcity))  // 各代及其之前遇到的最佳路径长度
//核心点-循环迭代
while iter < itermax:// 随机产生各个蚂蚁的起点城市if numant <= numcity:  // 城市数比蚂蚁数多pathtable[:, 0] = np.random.permutation(range(0, numcity))[:numant]else:  // 蚂蚁数比城市数多,需要补足pathtable[:numcity, 0] = np.random.permutation(range(0, numcity))[:]pathtable[numcity:, 0] = np.random.permutation(range(0, numcity))[:numant - numcity]length = np.zeros(numant)  # 计算各个蚂蚁的路径距离for i in range(numant):visiting = pathtable[i, 0]  # 当前所在的城市unvisited = set(range(numcity))  # 未访问的城市,以集合的形式存储{}unvisited.remove(visiting)  # 删除元素;利用集合的remove方法删除存储的数据内容for j in range(1, numcity):  # 循环numcity-1次,访问剩余的numcity-1个城市# 每次用轮盘法选择下一个要访问的城市listunvisited = list(unvisited)probtrans = np.zeros(len(listunvisited))for k in range(len(listunvisited)):probtrans[k] = np.power(pheromonetable[visiting][listunvisited[k]], alpha) \* np.power(etatable[visiting][listunvisited[k]], alpha)cumsumprobtrans = (probtrans / sum(probtrans)).cumsum()cumsumprobtrans -= np.random.rand()k = listunvisited[(np.where(cumsumprobtrans > 0)[0])[0]]# 元素的提取(也就是下一轮选的城市)pathtable[i, j] = k  # 添加到路径表中(也就是蚂蚁走过的路径)unvisited.remove(k)  # 然后在为访问城市set中remove()删除掉该城市length[i] += distmat[visiting][k]visiting = klength[i] += distmat[visiting][pathtable[i, 0]]  # 蚂蚁的路径距离包括最后一个城市和第一个城市的距离# 包含所有蚂蚁的一个迭代结束后,统计本次迭代的若干统计参数lengthaver[iter] = length.mean()if iter == 0:lengthbest[iter] = length.min()pathbest[iter] = pathtable[length.argmin()].copy()else:if length.min() > lengthbest[iter - 1]:lengthbest[iter] = lengthbest[iter - 1]pathbest[iter] = pathbest[iter - 1].copy()else:lengthbest[iter] = length.min()pathbest[iter] = pathtable[length.argmin()].copy()# 更新信息素changepheromonetable = np.zeros((numcity, numcity))for i in range(numant):for j in range(numcity - 1):changepheromonetable[pathtable[i, j]][pathtable[i, j + 1]] += Q / distmat[pathtable[i, j]][pathtable[i, j + 1]]  # 计算信息素增量changepheromonetable[pathtable[i, j + 1]][pathtable[i, 0]] += Q / distmat[pathtable[i, j + 1]][pathtable[i, 0]]pheromonetable = (1 - rho) * pheromonetable + changepheromonetable  # 计算信息素公式iter += 1  # 迭代次数指示器+1print("iter(迭代次数):", iter)# 做出平均路径长度和最优路径长度
fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10))
axes[0].plot(lengthaver, 'k', marker=u'')
axes[0].set_title('Average Length')
axes[0].set_xlabel(u'iteration')axes[1].plot(lengthbest, 'k', marker=u'')
axes[1].set_title('Best Length')
axes[1].set_xlabel(u'iteration')
fig.savefig('average_best.png', dpi=500, bbox_inches='tight')
plt.show()# 作出找到的最优路径图
bestpath = pathbest[-1]
plt.plot(coordinates[:, 0], coordinates[:, 1], 'r.', marker=u'$\cdot$')
plt.xlim([-100, 2000])
plt.ylim([-100, 1500])for i in range(numcity - 1):m = int(bestpath[i])n = int(bestpath[i + 1])plt.plot([coordinates[m][0], coordinates[n][0]], [coordinates[m][1], coordinates[n][1]], 'k')
plt.plot([coordinates[int(bestpath[0])][0], coordinates[int(n)][0]],[coordinates[int(bestpath[0])][1], coordinates[int(n)][1]], 'b')
ax = plt.gca()
ax.set_title("Best Path")
ax.set_xlabel('X axis')
ax.set_ylabel('Y_axis')plt.savefig('best path.png', dpi=500, bbox_inches='tight')
plt.show()


❀参考文献

[1]张丽珍,何龙,吴迪,杜战其.改进型蚁群算法在路径规划中的研究[J].制造业自动化,2020,42(02):55-59.
[2]肖艳秋,焦建强,乔东平,杜江恒,周坤.蚁群算法的基本原理及应用综述[J].轻工科技,2018,34(03):69-72.
[3]程序算法https://blog.csdn.net/haoxun03/article/details/104209214haoxun03
在已有程序上做了修改与补充。

蚂蚁算法蚁群算法-原理-思路-步骤-程序实现相关推荐

  1. 【其他】结构技术优化算法--蚁群算法(ant colony optimization)

    目录 1 遗传基因算法 2 模拟退火算法 2.1爬山算法 2.2随机概率优化 3 群体智能算法 3.1蚁群算法 3.2粒子群算法 4总结 1 遗传基因算法 遗传算法(Genetic Algorithm ...

  2. python闭环最短路径_深度学习经典算法 | 蚁群算法解析

    蚁群算法基本思想 蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题.根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发 ...

  3. 深度学习经典算法 | 蚁群算法解析

    蚁群算法基本思想 蚁群算法的基本原理来源于自然界中蚂蚁觅食的最短路径问题.根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发 ...

  4. 智能算法---蚁群算法介绍

    蚁群算法是一种群智能算法,也是启发式算法.基本原理来源于自然界蚂蚁觅食的最短路径原理. (一)蚁群算法的由来 蚁群算法最早是由Marco Dorigo等人在1991年提出,他们在研究新型算法的过程中, ...

  5. 蚁群优化算法的JAVA实现_优化算法|蚁群算法的理解及实现

    蚁群算法 1. 蚁群算法基本原理 蚁群算法(Ant Colony Algorithm, ACA)由Marco Dorigo于1992年提出. 蚁群原理: 蚁群算法的基本原理来源于自然界觅食的最短路径原 ...

  6. 【进阶一】Python实现MDCVRP常见求解算法——蚁群算法(ACO)

    基于python语言,实现蚁群算法(ACO)对多车场车辆路径规划问题(MDCVRP)进行求解. 目录 往期优质资源 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6. ...

  7. matlab教程蚁群算法,蚁群算法怎样用MATLAB仿真

    蚁群算法采用matlab开发的仿真平台:算法实现,路径显示,人机交互控制等 希望对你有帮助! 是可以运行的 %    the procedure of ant colony algorithm for ...

  8. Python实现VRP常见求解算法——蚁群算法(ACO)

    基于python语言,实现经典蚁群算法(ACO)对车辆路径规划问题(CVRP)进行求解. 目录 优质资源 1. 适用场景 2. 求解效果 3. 问题分析 4. 数据格式 5. 分步实现 6. 完整代码 ...

  9. 【进阶四】Python实现(MD)HVRP常见求解算法——蚁群算法(ACO)

    蚁群算法+Split 求解异构车辆路径规划问题 目录 信息传递 1. 适用场景 2. 求解效果 3. 代码分析 4. 数据格式 5. 分步实现 6. 完整代码 参考 信息传递 python实现6种智能 ...

  10. 计算智能-群智能算法-蚁群算法matlab实现

    方法一:Main_0 信息素跟随蚂蚁一步一变化(已完成,信息素变化函Pheromones_Change_0) 方法二:Main_1 信息素在蚂蚁走完一圈后一次性变化(Main1已完成,信息素变化函数P ...

最新文章

  1. vmware workstation 安装esx 启动vt功能
  2. java 获取jsp路径_java如何获取jsp页面上传的文件路径
  3. 地脚螺钉直径系列_百科:螺栓、螺钉、螺丝三个概念,别再傻傻分不清!
  4. 提升的控件 paint()事件被遮挡_设计锦囊 | 提升产品易用性案例分享
  5. WebsiteSpark是免费软件吗?
  6. pandas的基本使用
  7. Speed Up YUM!
  8. python里textfield_Django:为什么我的CharField没有得到类vTextField?
  9. 循环上传导致oom_java之OOM排查
  10. 软件测试学生管理系统课程设计,软件测试课程设计-ERP进销存管理系统(1)
  11. windows下检測文件改变
  12. MAC使用CodeSign查看已签名的文件的数字签名情况
  13. Java基础——学生管理系统
  14. 中文翻译The Django Book
  15. P800刷英文WM6教程以及常见问题整理
  16. HBuilder制作表格式的简历
  17. 2020年叉车司机证考试题库及叉车司机试题解析
  18. 人工智能在广告行业的应用
  19. Linux项目实战——五子棋(单机人人对战版)
  20. 20种梦幻摄影调色luts预设

热门文章

  1. 如何识别服务器网站有病毒,网站有病毒怎么解决?
  2. 驱动概念(uboot命令)
  3. MAC系统/虚拟机中的chm打不开
  4. Unity-MD5加密
  5. 单片机常用C代码汇总
  6. 一次关于聚合根的激烈讨论
  7. 什么是java框架结构_Java框架概述
  8. Vue-01 —创建一个Vue实例
  9. Vue进阶-异步动态加载组件
  10. iOS编程比较好开源的完整项目iOS编程比较好开源的完整项目