蚁群算法介绍

article/2025/10/3 6:39:34

前言:本篇文章主要讲述蚁群算法以及相关算法的matlab实现

一、蚁群算法

        蚁群算法是在20世纪90年代由澳大利亚学者Marco Dorigo等人通过观察蚁群觅食的过程,发现众多蚂蚁在寻找食物的过程中,总能找到一条从蚂蚁巢穴到食物源之间的最短路径。随后他们在蚂蚁巢穴到食物源之间设置了一个障碍,一段时间以后发现蚂蚁又重新走出了一条到食物源最短的路径。通过对这种现象的不断研究,最后提出了蚁群算法。蚁群算法在解决旅行商问题(即TSP问题)时,取得了比较理想的结果。

                                         

二、基本人工蚁群算法原理

       当蚂蚁外出寻找食物或者返回到巢穴时候,都会释放一种特殊的信息素来标示进行的轨迹,有了这种信息传递机制,蚂蚁才能顺利的返回,进一步研究发现,这种信息素不仅能被统同一个蚁群的其他蚂蚁感受到,而且其强度也能被其他蚂蚁所感知到,蚂蚁会倾向于向信息素浓度高的路径移动,而在移动的过程中又会留下新的信息素。这样,经过蚂蚁越多的路径其信息素浓度也会越来越高,最后,几乎所有的蚂蚁都会走信息素浓度最高的城市,就会在蚂蚁巢穴与食物源之间形成一条最短的取食路径。M.Dorigo将真实蚁群的这种行为抽象为人工蚁群算法,在一方面将真实蚁群中最重要的信息机制赋予给了人工蚁群,另一方面让人工蚁群具备了真实蚁群所不具备的一些其他特征。

       运用人工蚁群算法求解TSP问题时的基本原理是:将m个蚂蚁随机地放在多个城市,让这些蚂蚁从所在的城市出发,n步(一个蚂蚁从一个城市到另外一个城市为1步)之后返回到出发的城市。如果m个蚂蚁所走出的m条路经对应的中最短者不是TSP问题的最短路程,则重复这一过程,直至寻找到满意的TSP问题的最短路径为止。为了说明这一个算法下面用一个算法流程图来表示一下:

                                                                              

三、人工蚁群算法的数学模型

(一)算法的相关参数

在算法中用到的变量比较多,而每个变量的对算法最终收敛的结果影响程度也不一样,在这里把一些重要的参数说明一下。

\tau _{ij} :城市i和城市j之间边e_{ij}上信息素的残留强度

\Delta\tau _{ij}:一次循环后边e_{ij}上信息素的增量

\Delta \tau_{ij}^{k}:一次循环之后蚂蚁k对边e_{ij}上信息素的贡献量

\eta _{ij}:城市i,j之间的能见度,反映了由城市i转移到城市j的启发程度

d_{ij}:城市i到城市j之间的距离

p_{ij}^{k}:蚂蚁k从当前所在的城市到下一个城市去的概率

tabu(k):禁忌表,用于存放第k只蚂蚁已经走过的城市

Q:信息素总量,信息素总信息量为蚂蚁循环一周后向经过路径释放信息素的总量

\rho:信息素残留系数,由于蚂蚁释放的信息量回随着时间的转移而逐渐挥发,以至于路径上的信息素不能无限递增,该系数太小时会降低算法的全局搜素能力,过大时容易使算法陷入局部最优,影响全局搜素能力。

m:蚂蚁总数,在TSP问题中,每次循环当中,每只蚂蚁所走出的每条路径为TSP问题的候选解,m只蚂蚁一次循环所走出来的m条路经为TSP问题的一个解子集,所以这个解子集越大则算法的全局搜索能力越强,但是过大会使算法的收敛速度降低。如果m太小的话,算法也很容易就陷入局部最优,过早的出现停滞现象,(ps:王老师讲过曾经见到一个学生在论文中让一个蚂蚁去跑路径,老师开玩笑说,估计把这只蚂蚁就给累死了)所以选择合理的蚂蚁总数是非常重要的。

 \alpha:信息启发因子,反映了蚂蚁在从城市i向城市j移动时,这两个城市之间道路上所累积的信息素在指导蚂蚁选择城市j的程度,即蚁群在路径搜素中随即性因素作用的强度。

\beta:期望值启发式因子,反映了蚂蚁在从城市i向城市j转移时候期望值\eta _{ij}在指导蚁群搜素中的相对重要程度。其大小反映了蚁群在道路搜素中的先验性、确定性等因素的强弱,\alpha\beta的大小也会影响算法的收敛性。

 (二) 算法过程中的关键步骤

1、上面讲了蚂蚁在选择下一个要转移的城市时候是基于概率选择的,当然这个概率不是随机概率,而是其中的一些参数来决定。假定在t时刻,蚂蚁从目前所在的i城市要选择转移去的下一个j城市,概率大小为p_{ij}^{k}

                                  p_{ij}^{k}(t)=\left\{\begin{matrix} & \frac{\tau_{ij}^{k}\eta _{ij}^{\beta }}{\sum_{s\in allowed_{k}}\tau_{is}^{k}(t)\eta_{is}^{\beta}(t)} &j\in allowed_{k} \\ \\ &0 &otherwise \end{matrix}\right.

其中allowed_{k}表示允许蚂蚁k下一步可容许去的城市的集合,\tau_{ij}^{\alpha}为边e_{ij}上的信息素因数,\eta_{ij}^{\beta}为城市i,j间能见度因数。至于这个过程具体是怎么实现的,在程序中会有相关的源码。

2、对任意两个城市i,j之间道路对应的边e_{ij}信息素增量按照下式进行:

                                                \left\{\begin{matrix} &\tau_{ij}(t+1)=\rho\tau_{ij}(t)+\Delta \tau_{ij}(t,t+1)\\ \\&\Delta\tau_{ij}(t,t+1)=\Sigma_{k=1}^{m}\Delta\tau_{ij}^{k}(t,t+1) \end{matrix}\right.

其中,\Delta\tau_{ij}^{k}(t,t+1)为蚂蚁k对边e_{ij}上所贡献的信息素增量,\Delta\tau_{ij}(t,t+1)是经过边e_{ij}的所有蚂蚁对边e_{ij}的信息素量贡献,\rho为信息素残留系数。对于\Delta\tau_{ij}^{k}(t,t+1)的调整方式不同,可以将蚁群算法分为三种模型:蚁密模型、蚁量模型和蚁周模型。

 2.1 蚁密模型

   在蚁密模型当中,每一只蚂蚁在经过城市i,j时,对该边e_{ij}所贡献的信息素增量为常量,每个单位长度是Q:

                                         a

 2.2 蚁量模型

   在蚁量模型中,一只蚂蚁k在经过城市i,j之间边e_{ij}时,对该边所贡献的信息素增量为变量,即每单位长度上为Q/d_{ij},它与城市i,j之间的路径长度d_{ij}有关,具体为:

                                        \Delta\tau_{ij}^{k}(t,t+1)=\left\{\begin{matrix} &Q/d_{ij} &e_{ij}\\ & 0 & otherwise \end{matrix}\right

2.3 蚁周模型

   上述两种模型,对两城市之间边e_{ij}上信息素贡献的增量在蚂蚁k经过边的同时完成,而蚁周模型对边e_{ij}信息素的增量是在本次循环结束时才进行更新调整。一只蚂蚁在经过城市i,j时对边e_{ij}上贡献的增量为每单位长度Q/L_{k}L_{k}为蚂蚁在本次循环走出路径的长度。

                                        \Delta\tau_{ij}^{k}(t,t+1)=\left\{\begin{matrix} &Q/L_{k} &e_{ij}\\ &0 &otherwise \end{matrix}\right

 本文章就是基于蚁周模型来实现的,介绍完上述的几个关键步骤以后,就要用matlab来实现了。

四、算法的matlab实现

下面给出了matlab实现代码,其中的注释都是自己看懂了之后加上的,

%算法的第一步是先初始化
clear 
m=50;                                   %蚂蚁总数
alpha=1;                                %信息度启发因子
beta=2;                                 %期望值启发式因子
Rho=0.6;                                %信息素挥发因子 
NC_max=100;                             %最大循环次数
Q=80;                                   %信息素增量     
C=[5.326,2.558;4.276,3.452; 4.819,2.624; 3.165,2.457;0.915,3.921;4.637,6.026; 1.524,2.261;3.447,2.111;3.548,3.665; 2.649,2.556;4.399,1.194;4.660,2.949; 1.479,4.440; 5.036,0.244;2.830,3.140;1.072,3.454;5.845,6.203;0.194,1.767;1.660,2.395;2.682,6.072];%20个城市
% 初始化
n=size(C,1);                            %表示n个城市
D=zeros(n,n);                           
for i=1:nfor j=1:nif i~=j                         %表示同一个城市之间的距离不存在D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;elseD(i,j)=eps;end% D(j,i)=D(i,j);end
end
Eta=1./D;                               %城市与城市之间的能见度,在基于概率转移时用到这个参数
Nc=1;                                   %循环计数器
Tau=ones(n,n);                          %信息素浓度矩阵——n*n的单位阵  
Tabu=zeros(m,n);                        %禁忌表  ——m*n的零阵
Road_best=zeros(NC_max,n);              %每次循环最佳路径 最大循环次数*n个城市零阵
Roadlength_best=inf.*ones(NC_max,1);    %每次循环最佳路径的长度  最大循环次数*1 单位阵 
Roadlength_ave=zeros(NC_max,1);         %每次循环的路径的平均值
%将蚂蚁随机分布在n个城市
while Nc<=NC_max                        %小于最大循环次数就继续执行randpos=[];                        for i=1:(ceil(m/n))                 %分多少次将蚂蚁分布完randpos=[randpos,randperm(n)];  %循环产生的是20个城市的随机数,都在一行endTabu(:,1)=(randpos(1,1:m));         %取前m个城市编号
%每只蚂蚁基于概率选择转移去下一个j城市    for j=2:n                           %从第二个城市开始选择for i=1:m                      visited=Tabu(i,1:(j-1));    %表示已经经过的城市,初始化是出发城市J=zeros(1,(n-j+1));         %存放还没有经过的城市  1*19.....1 零阵P=J;                        Jc=1;                      for k=1:n                   if length(find(visited==k))==0  %查找已经经过的城市里面有没有kJ(Jc)=k;            %没有的话,就把城市k记录进未经过城市矩阵里面Jc=Jc+1;           endend
%计算待选城市的概率for k=1:length(J)            P(k)=(Tau(visited(end),J(k))^alpha)*(Eta(visited(end),J(k))^beta);%目前经过的城市到下一个所有城市的概率大小endP=P/sum(P);%按照概率选取下一个城市Pcum=cumsum(P);              select=find(Pcum>=rand);     to_visit=J(select(1));      Tabu(i,j)=to_visit;          endendif Nc>=2                           Tabu(1,:)=Road_best(Nc-1,:);    end
%记录本次迭代最佳路线L=zeros(m,1);for i=1:mR=Tabu(i,:);                      %第一只蚂蚁的路线赋给矩阵Rfor j=1:(n-1)                     L(i)=L(i)+D(R(j),R(j+1));     %每一只蚂蚁所走的路径长度endL(i)=L(i)+D(R(1),R(n));           %加上最后一个点到起始点的路径endRoadlength_best(Nc)=min(L);           %本次循环的所有路径中的最短路径放在Roadlength_best中pos=find(L==Roadlength_best(Nc));     %找出最短路径的所有蚂蚁Road_best(Nc,:)=Tabu(pos(1),:);       %只取第一只蚂蚁的路径Roadlength_ave(Nc)=mean(L);           %本次循环所有路径的平均值Nc=Nc+1;                              % 跟新信息素delta_Tau=zeros(n,n);                for i=1:m                             for j=1:(n-1)delta_Tau(Tabu(i,j),Tabu(i,j+1))=delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);enddelta_Tau(Tabu(i,n),Tabu(i,1))=delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);endTau=(1-Rho).*Tau+delta_Tau;          %这里运用的是蚁周模型          
% 禁忌表清零                                 Tabu=zeros(m,n);                   
end
pos=find(Roadlength_best==min(Roadlength_best));
shortest_route=Road_best(pos(1),:);
shortest_length=Roadlength_best(pos(1));figure(1)
subplot(1,2,1)
% subplot(1,2,1)
N=length(R);
scatter(C(:,1),C(:,2));
hold on
plot([C(shortest_route(N),1),C(shortest_route(1),1)],[C(shortest_route(N),2),C(shortest_route(1),2)],'g');
hold on
for ii=2:Nplot([C(shortest_route(ii-1),1),C(shortest_route(ii),1)],[C(shortest_route(ii-1),2),C(shortest_route(ii),2)],'g');hold on
end
grid on
title('TSP问题优化结果');
xlabel('x')
ylabel('y')
subplot(1,2,2)
plot(Roadlength_best)
hold on
plot(Roadlength_ave)
grid on
title('平均距离与最短距离')
legend('Roadlength\_best','Roadlength\_ave')
xlabel('cycle-index')
ylabel('length')

经过100次循环,对20个城市求最优路径,结果是23.70,执行之后的效果图如下:

                        

五、参考文献

[1] 李人厚,王拓. 智能控制理论和方法[M]. 西安电子科技大学出版社, 1999.

[2] 蚁群算法_三名狂客的博客-CSDN博客_蚁群算法

[3] Select=find(Pcum>=rand);_百度知道

                                                                                                                                                   编辑:高宇航

                                                                                                                                              2018年11月5日于西安交通大学


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

相关文章

优化算法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;会在其经过的路径上释放一种信息素&…

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默认会有这四个用…