蚁群算法(ACO)

article/2025/10/3 4:47:55

目录

ACO简介

基本原理

算法步骤

 流程图  

 参数意义 

 构建路径

 更新信息素

 实例演示(TSP问题)


ACO简介

        蚁群是自然界中常见的一种生物,人们对蚂蚁的关注大都是因为“蚁群搬家,天要下雨”之类的民谚。然而随着近代仿生学的发展,这种似乎微不足道的小东西越来越多地受到学者们地关注。1991年意大利学者M. Dorigo等人首先提出了蚁群算法,人们开始了对蚁群的研究:相对弱小,功能并不强大的个体是如何完成复杂的工作的(如寻找到食物的最佳路径并返回等)。在此基础上就诞生了蚁群算法(ant colony optimization, ACO),一种用来在图中寻找优化路径的机率型算法。该算法最初用来求解旅行商(Traveling Saleman Problem,TSP)问题。即求出某个商人从某一个点出发(原点),经过若干个给定的需求点,最终返回到原点所经过的最短路径。

基本原理

        蚂蚁在行走过的路上留下一种挥发性的激素(信息素),蚂蚁就是通过这种激素进行信息交流。蚂蚁趋向于走激素积累较多的路径。找到最短路径的蚂蚁总是最早返回巢穴,从而在路上留下了较多的激素。由于最短路径上积累了较多的激素,选择这条路径的蚂蚁就会越来越多,到最后所有的蚂蚁都会趋向于选择这条最短路径,但信息素会随着时间的推移而逐渐挥发。基于蚂蚁这种行为而提出的蚁群算法具有群体合作,正反馈选择,并行计算等三大特点。

算法步骤

       

  1. 初始化(各个参数): 在计算之初需要对相关的参数进行初始化,如蚂蚁数量m、信息素因子α、启发函数因子β、信息素挥发因子ρ、信息素常数Q、最大迭代次数t等等。
  2. 构建解空间: 将各个蚂蚁随机地放置于不同的出发点,对每个蚂蚁k(k=1,2,……,m),计算其下一个待访问的城市,直到所有蚂蚁访问完所有的城市。
  3. 更新信息素: 计算各个蚂蚁经过的路径长度L,记录当前迭代次数中的最优解(最短路径)。同时,对各个城市连接路径上的信息素浓度进行更新。
  4. 判断是否终止: 若迭代次数小于最大迭代次数则迭代次数加一,清空蚂蚁经过路径的记录表,并返回步骤二;否则终止计算,输出最优解。
     

 流程图  

 参数意义 

参数名称参数意义参数设置过大参数设置过小
蚂蚁数量m蚂蚁数量一般设置为目标数的1.5倍较为稳妥每条路径上信息素趋于平均,正反馈作用减弱,从而导致收敛速度减慢可能导致一些从未搜索过的路径信息素浓度减小为0,导致过早收敛,解的全局最优性降低
信息素常量Q信息素常量根据经验一般取值在[10,1000]会使蚁群的搜索范围减小容易过早的收敛,使种群陷入局部最优每条路径上信息含量差别较小,容易陷入混沌状态
信息素因子ɑ反映了蚂蚁运动过程中路径上积累的信息素的量在指导蚁群搜索中的相对重要程度。取值范围通常在[1, 4]之间。蚂蚁选择以前已经走过的路可能性较大,容易使随机搜索性减弱蚁群易陷入纯粹的随机搜索,使种群陷入局部最优
启发函数因子𝛽反映了启发式信息在指导蚁群搜索中的相对重要程度,蚁群寻优过程中先验性、确定性因素作用的强度取值范围在[0, 5]之间虽然收敛速度加快,但是易陷入局部最优蚁群易陷入纯粹的随机搜索,很难找到最优解
信息素挥发因子𝜌反映了信息素的消失水平,相反的1-𝜌反映了信息素的保持水平。取值范围通常在[0.2, 0.5]之间信息素挥发较快,容易导致较优路径被排除各路径上信息素含量差别较小,收敛速度降低
最大迭代次数t最大迭代次数一般取[100,500],建议取200运算时间过长可选路径较少,使种群陷入局部最优。

 构建路径

我们知道蚂蚁是根据信息素的浓度来判断所走的路线的,但是事实上,不是说哪条路的信息素浓度高蚂蚁就一定走哪条路,而是走信息素浓度高的路线的概率比较高。那么首先我们就需要知道蚂蚁选择走每个城市的概率,然后通过轮盘赌法(相当于转盘)确定蚂蚁所选择的城市。

概率公式 :

 更新信息素

根据不同的规则我们可以将蚁群算法分为三种模型——蚁周模型(Ant-Cycle)、蚁量模型(Ant-Quantity)和蚁密模型(Ant-Density)。蚁周模型是完成一次路径循环后,蚂蚁才释放信息素,其利用的是全局信息。蚁量模型和蚁密模型蚂蚁完成一步后就更新路径上的信息素,其利用的是局部信息。本文章使用的是最常见的蚁周模型。

 实例演示(TSP问题)

 旅行商问题(TSP问题)。假设有一个旅行商人要拜访全国31个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择要求是:所选路径的路程为所有路径之中的最小值。全国31个省会城市的坐标为[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975]。

import numpy as np
import math
import matplotlib.pyplot as pltclass TSP():def __init__(self):# 初始化参数self.antcount = 50  # 蚂蚁数量self.alpha = 1  # 信息素重要程度因子self.beta = 5  # 启发函数重要程度因子self.rho = 0.1  # 信息素挥发因子self.Q = 100  # 信息素常量self.max_iter = 200  # 最大迭代次数self.iter = 1  # 迭代计数器self.city_location = np.array([[1304, 2312], [3639, 1315], [4177, 2244], [3712, 1399], [3488, 1535],[3326, 1556], [3238, 1229], [4196, 1044], [4312, 790], [4386, 570],[3007, 1970], [2562, 1756], [2788, 1491], [2381, 1676], [1332, 695],[3715, 1678], [3918, 2179], [4061, 2370], [3780, 2212], [3676, 2578],[4029, 2838], [4263, 2931], [3429, 1908], [3507, 2376], [3394, 2643],[3439, 3201], [2935, 3240], [3140, 3550], [2545, 2357], [2778, 2826],[2370, 2975]])self.city_num = len(self.city_location)  # 城市数量self.distance = np.zeros((self.city_num, self.city_num))  # 城市距离矩阵self.eta = np.zeros((self.city_num, self.city_num))  # 启发因子(距离的倒数)self.information = np.ones((self.city_num, self.city_num))  # 信息素矩阵self.path = np.zeros((self.antcount, self.city_num)).astype(int)  # 路径矩阵self.r_best = np.zeros((self.max_iter, self.city_num)).astype(int)  # 每次迭代的最优路径self.d_best = np.zeros(self.max_iter)  # 每次迭代的最短距离def get_dictance(self):for i in range(self.city_num):for j in range(self.city_num):if i != j:self.distance[i][j] = math.sqrt(np.power((self.city_location[i][0] - self.city_location[j][0]), 2) + \np.power((self.city_location[i][1] - self.city_location[j][1]), 2))else:self.distance[i][j] = 100000self.eta = 1.0 / self.distance  # 启发因子(距离的倒数)def get_firstplace(self):  # 将antcount只蚂蚁放到city_num个城市上if self.antcount <= self.city_num:self.path[:, 0] = np.random.permutation(range(self.city_num))[:self.antcount]else:leave = self.antcount - self.city_num  # 剩下几个蚂蚁n = 1self.path[:self.city_num, 0] = np.random.permutation(range(self.city_num))while leave > self.city_num:self.path[self.city_num * n:self.city_num * (n + 1), 0] = np.random.permutation(range(self.city_num))leave = leave - self.city_numn += 1self.path[self.city_num * n:self.antcount, 0] = np.random.permutation(range(self.city_num))[:leave]def get_nextplace(self):  # 选择下一步走哪个城市self.length = np.zeros(self.antcount)  # 每次迭代每只蚂蚁走过的总路程for i in range(self.antcount):unvisit = list(range(self.city_num))  # 创建每只蚂蚁未走过的城市列表visit = self.path[i, 0]  # 每只蚂蚁走过的城市unvisit.remove(visit)  # 删除走过的城市for j in range(1, self.city_num):probability = np.zeros(len(unvisit))for k in range(len(unvisit)):  # 下一个城市的概率probability[k] = np.power(self.information[visit][unvisit[k]], self.alpha) * \np.power(self.eta[visit][unvisit[k]], self.beta)# 累积概率 轮盘赌选择cousumprobability = (probability / sum(probability)).cumsum()cousumprobability -= np.random.rand()# 下一步该走的城市next = unvisit[list(cousumprobability > 0).index(True)]self.path[i, j] = nextunvisit.remove(next)self.length[i] += self.distance[visit][next]  # 第i只蚂蚁走过的路程visit = nextself.length[i] += self.distance[visit][self.path[i, 0]]  # 回到开始的城市def get_best(self):  # 得到最优路径和最短距离if self.iter == 1:self.r_best[self.iter - 1] = self.path[self.length.argmin()].copy()self.d_best[self.iter - 1] = self.length.min()else:if self.length.min() > self.d_best[self.iter- 2]:self.r_best[self.iter - 1] = self.r_best[self.iter - 2]self.d_best[self.iter - 1] = self.d_best[self.iter - 2]else:self.r_best[self.iter - 1] = self.path[self.length.argmin()].copy()self.d_best[self.iter - 1] = self.length.min()def update_infor(self):  # 更新信息素j=0information_increase = np.zeros((self.city_num, self.city_num))  # 信息素增加矩阵for i in range(self.antcount):for j in range(self.city_num - 1):information_increase[self.path[i, j]][self.path[i][j + 1]] += self.Q / self.length[i]information_increase[self.path[i][j+1]][self.path[i,0]]+= self.Q / self.length[i]# 信息素矩阵更新self.information = (1 - self.rho) * self.information + information_increaseself.iter += 1def paint(self):# 绘图x = []y = []road = []for i in range(len(self.r_best[-1])):x.append(self.city_location[self.r_best[-1][i]][0])y.append(self.city_location[self.r_best[-1][i]][1])road.append(self.r_best[-1][i])x.append(x[0])  #回到开始城市y.append(y[0])road.append(road[0])plt.figure(figsize=(30, 30))plt.rcParams['font.family'] = ['Fangsong'] #设置字体for i in range(len(x)):#注释plt.annotate(str(road[i]) + ':' + '(' + str(x[i]) + ',' + str(x[i]) + ')',xy=(x[i], y[i]), xytext=(x[i] + 0.5, y[i] + 0.5), color='r')plt.plot(x, y, 'g-o')plt.title('最短距离:' + str(self.d_best[-1]), fontsize=40)plt.xlabel('x', fontsize=40)plt.ylabel('y', fontsize=40, rotation='horizontal')plt.show()plt.figure()plt.title("迭代距离变化")  # 距离迭代图plt.plot([i for i in range(1, len(self.d_best) + 1)], self.d_best)plt.xlabel("迭代次数")  # 迭代次数plt.ylabel("距离")  # 距离值plt.show()def run(self):self.get_dictance()while self.iter<=self.max_iter:self.get_firstplace()self.get_nextplace()self.get_best()self.update_infor()print('蚁群最优路径', self.r_best[-1])print('最优解', self.d_best[-1])self.paint()if __name__ == '__main__':tsp=TSP()tsp.run()


 


http://chatgpt.dhexx.cn/article/6mZweTDg.shtml

相关文章

蚁群算法及其应用

产生背景 20世纪90年代初&#xff0c;意大利科学家Marco Dorigo等受蚂蚁觅食行为的启发&#xff0c;提出蚁群算法(Ant Colony Optimization&#xff0c;ACO)。 一种应用于组合优化问题的启发式搜索算法。 在解决离散组合优化方面具有良好的性能。 基本思想 信息素跟踪&#…

蚁群算法原理及python代码实现

本文转载自&#xff1a;https://blog.csdn.net/fanxin_i/article/details/80380733 蚁群算法(AG)是一种模拟蚂蚁觅食行为的模拟优化算法&#xff0c;它是由意大利学者Dorigo M等人于1991年首先提出&#xff0c;并首先使用在解决TSP&#xff08;旅行商问题&#xff09;上。 之后…

蚁群算法原理以及应用

关键词:启发式算法 蚁群算法 迭代 正反馈 1.蚁群算法(ant colony algorithm,ACA)起源和发展历程 Marco Dorigo等人在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从而能快速的找到目标,于是在1991年在其博士论文中首次系统地提…

蚁群算法浅谈

本文参考&#xff1a;http://www.cnblogs.com/biaoyu/archive/2012/09/26/2704456.html http://blog.163.com/ykn_2010/blog/static/1420333362012111411258466/ 简介 蚁群算法(ant colony optimization, ACO)&#xff0c;又称蚂蚁算法&#xff0c;是一种用…

【转载】蚁群算法原理及实现

转自&#xff1a;https://blog.csdn.net/yy2050645/article/details/80820287 蚁群算法 蚁群算法&#xff0c;也是优化算法当中的一种。蚁群算法擅长解决组合优化问题。蚁群算法能够有效的解决著名的旅行商问题&#xff08;TSP&#xff09;&#xff0c;不止如此&#xff0c;在…

蚁群算法原理及c++实现

参考博客 https://blog.csdn.net/Oudasheng/article/details/84994336 https://blog.csdn.net/wayjj/article/details/72809344#commentsedit https://blog.csdn.net/Oudasheng/article/details/84994336 https://www.cnblogs.com/mahaitao/p/5572095.html https://www.cnblogs…

10分钟搞懂蚁群算法

蚂蚁几乎没有视力&#xff0c;但他们却能够在黑暗的世界中找到食物&#xff0c;而且能够找到一条从洞穴到食物的最短路径。它们是如何做到的呢&#xff1f; 蚂蚁寻找食物的过程 单只蚂蚁的行为及其简单&#xff0c;行为数量在10种以内&#xff0c;但成千上万只蚂蚁组成的蚁群却…

蚁群算法的简单理解

蚁群优化算法是意大利学者等人在世纪年代初提出的一种源于生物世界的新型启发式仿生算法。它是从自然界中蚂蚁觅食过程的协作方式得到启发而研究产生的。 在自然界中&#xff0c;蚁群可以在其觅食的过程中逐渐寻找到食物源与巢穴之间的最短路径。单个蚂蚁在运动过程中能够分泌…

蚁群算法原理及matlab代码实现

蚁群算法基本原理&#xff1a; 背景&#xff1a; 在自然界中&#xff0c;生物群体所表现出的智能得到越来越多的关注&#xff0c;许多的群智能优化算法都是通过对群体智能的模拟而实现的。其中模拟蚂蚁群体觅食的蚁群算法成为一种主要的群智能算法。 算法原理&#xff1a; 在…

蚁群算法介绍

前言&#xff1a;本篇文章主要讲述蚁群算法以及相关算法的matlab实现 一、蚁群算法 蚁群算法是在20世纪90年代由澳大利亚学者Marco Dorigo等人通过观察蚁群觅食的过程&#xff0c;发现众多蚂蚁在寻找食物的过程中&#xff0c;总能找到一条从蚂蚁巢穴到食物源之间的最短路径。随…

优化算法3--蚁群算法(原理)

1 算法简介 优化问题在科学和工业领域都非常重要。这些优化问题的实际例子有时间表调度、护理时间分配调度、列车调度、容量规划、旅行商问题、车辆路径问题、群店调度问题、组合优化等。为此&#xff0c;开发了许多优化算法。蚁群优化就是其中之一。 蚁群优化(Ant colony op…

蚁群算法(实例帮助理解)

1. 算法简介1.1 算法起源1.2 算法应用 2. 基本原理3. 算法设计3.1 算法步骤3.2 参数意义及设置3.3 构建路径3.4 更新信息素浓度3.5 判断是否中止 4. 实例演示&#xff08;TSP问题&#xff09; 1. 算法简介 1.1 算法起源 蚁群算法(ant colony optimization, ACO)&#xff0c;又…

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

蚂蚁算法蚁群算法-原理-思路-步骤-程序实现 ❀算法介绍 历史 蚁群优化算法是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出&#xff0c;其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法&#xff0c;…

蚁群算法原理及其实现(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;会在其经过的路径上释放一种信息素&…