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

article/2025/10/3 6:36:26

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

❀算法介绍

历史

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

背景

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

❀算法原理

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

蚁群算法原理(该图来自Theresa Meggie et al.)

  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
在已有程序上做了修改与补充。


http://chatgpt.dhexx.cn/article/pf6lD2cr.shtml

相关文章

蚁群算法原理及其实现(python)

蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法&#xff0c;它是由意大利学者Dorigo M等人于1991年首先提出&#xff0c;并首先使用在解决TSP&#xff08;旅行商问题&#xff09;上。 之后&#xff0c;又系统研究了蚁群算法的基本原理和数学模型. 蚁群算法的基本思想: 蚁群…

智能算法——蚁群算法

1、原理 蚁群算法是受到对真实蚂蚁群觅食行为研究的启发而提出。生物学研究表明&#xff1a;一群相互协作的蚂蚁能够找到食物和巢穴之间的最短路径,而单只蚂蚁则不能。生物学家经过大量细致观察研究发现,蚂蚁个体之间的行为是相互作用相互影响的。蚂蚁在运动过程中,能够在它所…

蚁群算法理解与实现

蚁群算法&#xff0c;也是优化算法当中的一种。蚁群算法擅长解决组合优化问题。蚁群算法能够有效的解决著名的旅行商问题&#xff08;TSP&#xff09;&#xff0c;不止如此&#xff0c;在其他的一些领域也取得了一定的成效&#xff0c;例如工序排序问题&#xff0c;图着色问题&…

蚁群算法(ACO)学习笔记

蚁群算法笔记 最近阅读论文&#xff0c;提到几种常见的搜索算法&#xff0c;于是对比学习一下。本文转载数据之巅大神文章对蚁群算法进行简单介绍&#xff0c;并用C语言编码实现蚁群算法来解决旅行商&#xff08;TSP&#xff09;问题。 1 蚁群算法基本原理 1.1 算法综述 对于…

【智能算法第一期】蚁群算法原理和多种改进方法

1. 什么是蚁群算法&#xff1f; 蚁群算法的本身来源于一种生物的自然现象&#xff0c;即蚂蚁在寻找食物过程中发现路径的行为&#xff0c;是一种模拟进化的算法。蚁群算法的寻优快速性是由通过正反馈式的信息传递和积累来实现的&#xff0c;分布式计算特征可以避免算法的早熟收…

蚁群算法

文章目录 一、蚁群算法原理二、蚁群算法参数改变测试 一、蚁群算法原理 蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法&#xff0c;它是由意大利学者Dorigo M等人于1991年首先提出&#xff0c;并首先使用在解决TSP&#xff08;旅行商问题&#xff09;上。之后&#xff0c…

蚁群算法详解

1、算法背景及原理 蚁群算法是一种智能优化算法&#xff0c;在TSP商旅问题上得到广泛使用。蚁群算法于1992年由Marco Dorigo首次提出&#xff0c;该算法来源于蚂蚁觅食行为。由于蚂蚁没有视力&#xff0c;所以在寻找食物源时&#xff0c;会在其经过的路径上释放一种信息素&…

Linux:详解 用户,用户组的解释创建等。

文章目录 Linux中用户和组的类型1、Linux下的用户可以分为三类2、Linux中的组有以下两类3、Linux中用户和用户组的配置文件&#xff08;1&#xff09;用户账号文件——/etc/passwdpasswd&#xff08;2&#xff09;用户密码文件——/etc/shadow&#xff08;3&#xff09;用户组账…

linux用户和用户组权限

Linux常规操纵 : 多用户操作 1.1 linux的用户与用户组理论 1.1.1 概述 Linux是一个真实的、完整的多用户多任务操作系统,多用户多任务就是可以在系统上建立多个用户,而多个用户可以在同一时间内登录同一个系统执行各自不同的任务,而互不影响。 root :系统维护 www:网页…

将用户添加到docker用户组

普通用户使用docker命令的时候经常会提示权限不足 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: …

linux添加用户和用户组

原文地址&#xff1a;linux添加用户和用户组 – 自我的进化http://www.shanxing.top/?p181 用户 创建用户&#xff1a;useradd <用户名> 设置密码&#xff1a;passwd <用户名>删除用户&#xff1a;userdel <用户名> 用户组&#xff1a; 新建用户组&#x…

用户,用户组与权限

一.用户与用户组 1.用户的分类 root用户:系统唯一,真实,可登录系统,可操作系统任何文件的用户,拥有最高权限 虚拟用户:这类用户被称为伪用户,不具有登录能力,但是系统不可缺少这类用户,例如bin,daemon,ssh等,一般是系统创建,也可手动创建 普通用户:具有登录能力,但是只能操作…

重拾Linux(三)用户和用户组管理

Linux是一个多用户多任务的操作系统&#xff0c;任何一个想要使用系统资源的用户&#xff0c;都必须向系统管理员申请一个账号&#xff0c;然后用这个账号的身份进入系统。每创建一个账号&#xff0c;如果没有指定新增用户的家目录&#xff0c;则会在 /home 目录下创建一个和新…

查看linux创建了哪些用户组,Linux查看用户属于哪些组/查看用户组下有哪些用户...

一、关于/etc/group格式的讨论 在说/etc/group格式的时候,网上很多文章都会说是“组名:组密码:组ID:组下用户列表”,这说法对了解/etc/group格式是没问题的,但如果碰到“查看用户属于哪些组/查看用户组下有哪些用户”这个问题上,这种说法会很误导人。 测试发现“组下用户列…

linux用户删组,如何在 Linux 下删除用户组(groupdel 命令)

在 Linux 下&#xff0c;用户组用来组织和管理用户账户。用户组的目的主要是为了定义一系列权限&#xff0c;例如&#xff1a;针对一个资源的读&#xff0c;写&#xff0c;执行&#xff0c;并且将这些权限在用户组的用户之间共享。 一个新的用户组可以通过groupadd命令来创建。…

Linux的用户组与权限

组与权限 Linux的用户与权限一.账户管理1.0 创建用户useradd1.1 示例:1.1.1添加一般用户1.1.2.为新添加的用户添加组1.1.3.创建一个系统用户1.1.4.为新添加的用户指定home目录下1.1.5.建立用户且定制ID1.1.6.添加一个不能登录的账号 2.0 用户账号存储文件2.1每一行对应一个用户…

Windows用户和用户组

下图是Windows操作系统上用户组及其描述&#xff0c;描述部分主要说明了该用户组的权限。 Administrator是默认管理员组 &#xff08;可以将账户加入该组让用户具有管理员权限&#xff09; Guest&#xff1a; 访客使用&#xff08;默认禁用&#xff09; Window默认会有这四个用…

linux用户和用户组详解(一)

一、基本概念 &#xff08;一&#xff09;基本介绍 Linux作为一种多用户的操作系统(服务器系统)&#xff0c;允许多个用户同时登陆到系统上&#xff0c;并响应每个用户的请求。任何需要使用操作系统的用户&#xff0c;都需要一个系统账号&#xff0c;账号分为&#xff1a;管理…

Windows 用户组管理

Windows 用户组管理 一、用户组1. 概述2. 管理组 内置组账户1. 需要人为添加成员的内置组2. 动态包含成员的内置组 一、用户组 1. 概述 组是一些用户的集合&#xff0c;组内的用户自动具备为组所设置的权限。 2. 管理组 新建组&#xff1a; 在本地用户和组界面选择组&#…

Linux用户和用户组详解

今天继续给大家介绍Linux基础知识&#xff0c;本文主要给大家介绍Linux用户和用户组。 一、Linux用户和用户组 &#xff08;一&#xff09;用户和用户组简介 与windows类似&#xff0c;Linux也有用户和用户组的概念。在Linux系统中&#xff0c;每次登录系统都必须以一个用户…