基本蚁群算法
蚁群算法
两阶段算法(Two Phase Algorithm)
算法举例
(3)以P0为起点,以P4为终点,求下图最短路径L
Dijkstra算法 动态规划 L为 P0→P6 → P3 → P4. 总长度为97km。
(4)根据最短路进行分组,最短路由三条分支组成,即
P0→P5 → P8 → P7 → P6 → P0. 33km,5.9t
0 0
4 10 17 0
节约法(Saving Method)
算法举例
点对之间连接的距离节约值
连接点 3-4 2-3 7-8 6-7 1-7 节约里程 19 18 17 16 13 连接点 1-2 1-6 6-8 2-4 1-3 节约里程 12 11 10 9 8 连接点 1-8 2-7 5-8 2-6 4-5 节约里程 5 5 4 3 3 连接点 5-7 3-7 5-6 节约里程 3 1 1
Cij P0 P5 P8 P0 0 P5 8 0 P8 22 18 0 P7 33 29 28 P6 33 29 28 P1 ∞ ∞ 37 P2 ∞ ∞ ∞ P3 ∞ ∞ ∞ P4 ∞ ∞ ∞
P7
P6 P1 P2 P3 P4
0
16
0
25
20 0
35
30 22 0
∞
42 34 30 0
∞
∞ ∞ ∞ 22 0
节约法(Saving Method)
算法举例
求初始解
令Ii={i},i=1,2,· · · ,8;最短路长li=2C0i;载重量ri=Ri;标记 (合并次数)B1=B2=· · · =B8=0.
按节约里程从大到小合并路径 8
P3 P29 10P15 NhomakorabeaP4
11
蚁群算法
6
假设蚂蚁每经过一处所留下的信息素为一个单 位,则经过36个时间单位后,所有开始一起出 发的蚂蚁都经过不同路径从 D 点取得了食物, 此时 ABD 的路线往返了 2 趟,每一处的信息素 为4个单位,而 ACD的路线往返了一趟,每一 处的信息素为2个单位,其比值为2:1 寻找食物的过程继续进行,则按信息素的指导 ,蚁群在 ABD 路线上增派一只蚂蚁(共 2 只) ,而ACD路线上仍然为一只蚂蚁。再经过36个 时间单位后,两条线路上的信息素单位积累为 12和4,比值为3:1。
[ ij (t )] [ij (t )] , 若j alk [ is (t )] [is (t )] k Pij (t ) s alk 0, 否则
式中,alk ( allowedk )=(C-tabuk )表示蚂蚁 k 下一步允许选择的城市 α为信息启发式因子
ij(t n) (1 ) ij(t ) ij(t )
ij(t ) ij (t )
k
m
k 1
信息素更新的三种策略: (1)Ant-Cycle模型中,
ij (t )
k
Q ,若第k只蚂蚁在本次循环中经过(i,j) Lk
0
,否则
(2)Ant-Quantity模型,
ij (t )
k
Q dij
,若第k只蚂蚁在t和t+1之间经过(i,j)
0
,否则
(3)Ant-Density模型
ij (t )
k
Q
,若第k只蚂蚁在t和t+1之间经过(i,j)
0
,否则
其中, Q 表示信息素强度,表示蚂蚁循环一次所 释放的信息素总量; L k 为第 k 只蚂蚁在本次循环 中所走路径的总长度。d为城市间的距离。 注: 2 和 3 都是利用局部信息,而 1 利用整体信息, 所以我们经常用1。
蚁群算法概述
蚁群算法概述一、蚁群算法蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来寻找最优解决方案的机率型技术。
它由Marco Dorigo于1992年在他的博士论文中引入,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。
蚂蚁在路径上前进时会根据前边走过的蚂蚁所留下的分泌物选择其要走的路径。
其选择一条路径的概率与该路径上分泌物的强度成正比。
因此,由大量蚂蚁组成的群体的集体行为实际上构成一种学习信息的正反馈现象:某一条路径走过的蚂蚁越多,后面的蚂蚁选择该路径的可能性就越大。
蚂蚁的个体间通过这种信息的交流寻求通向食物的最短路径。
蚁群算法就是根据这一特点,通过模仿蚂蚁的行为,从而实现寻优。
这种算法有别于传统编程模式,其优势在于,避免了冗长的编程和筹划,程序本身是基于一定规则的随机运行来寻找最佳配置。
也就是说,当程序最开始找到目标的时候,路径几乎不可能是最优的,甚至可能是包含了无数错误的选择而极度冗长的。
但是,程序可以通过蚂蚁寻找食物的时候的信息素原理,不断地去修正原来的路线,使整个路线越来越短,也就是说,程序执行的时间越长,所获得的路径就越可能接近最优路径。
这看起来很类似与我们所见的由无数例子进行归纳概括形成最佳路径的过程。
实际上好似是程序的一个自我学习的过程。
3、人工蚂蚁和真实蚂蚁的异同ACO是一种基于群体的、用于求解复杂优化问题的通用搜索技术。
与真实蚂蚁通过外激素的留存/跟随行为进行间接通讯相似,ACO中一群简单的人工蚂蚁(主体)通过信息素(一种分布式的数字信息,与真实蚂蚁释放的外激素相对应)进行间接通讯,并利用该信息和与问题相关的启发式信息逐步构造问题的解。
人工蚂蚁具有双重特性:一方面,他们是真实蚂蚁的抽象,具有真实蚂蚁的特性,另一方面,他们还有一些在真实蚂蚁中找不到的特性,这些新的特性,使人工蚂蚁在解决实际优化问题时,具有更好地搜索较好解的能力。
人工蚂蚁与真实蚂蚁的相同点为:1.都是一群相互协作的个体。
蚁群算法——精选推荐
蚁群算法⼀、蚁群算法蚁群算法是在20世纪90年代由澳⼤利亚学者Marco Dorigo等⼈通过观察蚁群觅⾷的过程,发现众多蚂蚁在寻找⾷物的过程中,总能找到⼀条从蚂蚁巢⽳到⾷物源之间的最短路径。
随后他们在蚂蚁巢⽳到⾷物源之间设置了⼀个障碍,⼀段时间以后发现蚂蚁⼜重新⾛出了⼀条到⾷物源最短的路径。
通过对这种现象的不断研究,最后提出了蚁群算法。
蚁群算法在解决(即TSP问题)时,取得了⽐较理想的结果。
⼆、基本⼈⼯蚁群算法原理运⽤⼈⼯蚁群算法求解TSP问题时的基本原理是:将m个蚂蚁随机地放在多个城市,让这些蚂蚁从所在的城市出发,n步(⼀个蚂蚁从⼀个城市到另外⼀个城市为1步)之后返回到出发的城市。
如果m个蚂蚁所⾛出的m条路经对应的中最短者不是TSP问题的最短路程,则重复这⼀过程,直⾄寻找到满意的TSP问题的最短路径为⽌。
为了说明这⼀个算法下⾯⽤⼀个算法流程图来表⽰⼀下:三、蚁群算法中涉及到的参数及其符号::蚂蚁数量,约为城市数量的1.5倍。
如果蚂蚁数量过⼤,则每条路径上的信息素浓度趋于平均,正反馈作⽤减弱,从⽽导致收敛速度减慢;如果过⼩,则可能导致⼀些从未搜索过的路径信息素浓度减⼩为0,导致过早收敛,解的全局最优性降低:信息素因⼦,反映了蚂蚁运动过程中积累的信息量在指导蚁群搜索中的相对重要程度,取值范围通常在[1, 4]之间。
如果信息素因⼦值设置过⼤,则容易使随机搜索性减弱;其值过⼩容易过早陷⼊局部最优:启发函数因⼦,反映了启发式信息在指导蚁群搜索中的相对重要程度,取值范围在[3, 4.5]之间。
如果值设置过⼤,虽然收敛速度加快,但是易陷⼊局部最优;其值过⼩,蚁群易陷⼊纯粹的随机搜索,很难找到最优解:信息素挥发因⼦,反映了信息素的消失⽔平,相反的反映了信息素的保持⽔平,取值范围通常在[0.2, 0.5]之间。
当取值过⼤时,容易影响随机性和全局最优性;反之,收敛速度降低:信息素常数,表⽰蚂蚁遍历⼀次所有城市所释放的信息素总量。
蚁群算法的原理及其基本模型
蚁群算法的原理及其基本模型作者:徐大柱沈林来源:《旅游纵览·行业版》2013年第09期蚁群算法是受自然界中真实蚁群集体行为的启发而提出的一种基于种群的模拟进化算法,属于带构造性的随机搜索算法.本文对应用蚁群算法求解连续空间优化问题作了一些探索性研究,以基本蚁群算法的性能分析为背景,探讨了蚁群算法的构成、性能及特点,对基本蚁群算法作了一系列详细的阐述。
一、蚁群算法的基本模型为了便于理解,下面以TSP问题为例说明蚁群算法的基本模型,对于其它问题,可以对此模型稍作修改,便可应用,首先引入以下符号:——蚁群中蚂蚁的总数目;——TSP规模(即城市数目);——城市和城市之间的距离();——时刻位于城市的蚂蚁数;——时刻蚂蚁从城市转移到城市的期望度,为启发式因子.在TSP问题中,称为能见度;——时刻在城市和城市之间的路径上的信息素量,在算法的初始时刻,将只蚂蚁随机放在个城市,并设各条路径上的信息素量(为常数);——时刻蚂蚁从城市转移到城市的概率.在城市的蚂蚁选择路径时按概率决定转移方向,即式中和分别表示路径上的信息素量和启发式因子的重要程度,用表示当前蚂蚁已走过的城市,={1,2,3,…,n}-,表示蚂蚁下一步允许选择的城市(人工蚂蚁有记忆功能,这是实际蚂蚁所不具备的)。
为了避免残留信息素过多而引起启发信息被淹没,在每只蚂蚁走完一步或者完成对个城市的遍历后,要对各条路径上的信息素进行如下调整:式中表示信息素残留系数,为了防止信息素的无限积累,的取值范围应在0到1之间,表示在本次循环后留在到路径上的信息素增量,表示第只蚂蚁在本次循环中留在路径上的信息素量。
二、基本模型的实现步骤从蚁群算法的模型中,我们可以看出,蚁群寻找最短路径实际上是一个递推过程,便于在计算机上实现。
为了便于理解,下面以TSP问题为例来阐述蚁群算法的具体实现步骤。
第一步:初始化.令时间,循环次数设置最大迭代次数的值,将只蚂蚁随机放到个城市,并将每只蚂蚁的出发点城市号放入禁忌表中.令(为常数),,设定、、的值;第二步:;第三步:对所有蚂蚁,以当前城市为起点,选择下一个要去的城市,首先从个城市中找到每只蚂蚁未走过的城市(即),蚂蚁个体根据状态转移概率公式(3-1)计算概率,选择概率最大的城市号前进;第四步:修改禁忌表指针,即将每只蚂蚁到达的新城市号移到该蚂蚁个体的禁忌表中;第五步:若禁忌表未满,即城市未遍历完,则跳到第三步继续执行,否则执行第六步;第六步:根据式(3-2)和式(3-3)更新每条路径上的信息量;第七步:若满足结束条件,即如果,则循环结束,输出最佳路径,否则,清空禁忌表并转到第二步继续执行。
蚁群算法(ACO)解决TSP问题
蚁群算法(ACO)解决TSP问题⼀、蚁群算法1.基本原理蚁群算法(Ant Colony Optimization,ACO)是⼀种基于种群寻优的启发式搜索算法,有意⼤利学者M.Dorigo等⼈于1991年⾸先提出。
该算法受到⾃然界真实蚁群集体在觅⾷过程中⾏为的启发,利⽤真实蚁群通过个体间的信息传递、搜索从蚁⽳到⾷物间的最短路径等集体寻优特征,来解决⼀些离散系统优化中的困难问题。
经过观察发现,蚂蚁在寻找⾷物的过程中,会在它所经过的路径上留下⼀种被称为信息素的化学物质,信息素能够沉积在路径上,并且随着时间逐步挥发。
在蚂蚁的觅⾷过程中,同⼀蚁群中的其他蚂蚁能够感知到这种物质的存在及其强度,后续的蚂蚁会根据信息素浓度的⾼低来选择⾃⼰的⾏动⽅向,蚂蚁总会倾向于向信息素浓度⾼的⽅向⾏进,⽽蚂蚁在⾏进过程中留下的信息素⼜会对原有的信息素浓度予以加强,因此,经过蚂蚁越多的路径上的信息素浓度会越强,⽽后续的蚂蚁选择该路径的可能性就越⼤。
通常在单位时间内,越短的路径会被越多的蚂蚁所访问,该路径上的信息素强度也越来越强,因此,后续的蚂蚁选择该短路径的概率也就越⼤。
经过⼀段时间的搜索后,所有的蚂蚁都将选择这条最短的路径,也就是说,当蚁巢与⾷物之间存在多条路径时,整个蚁群能够通过搜索蚂蚁个体留下的信息素痕迹,寻找到蚁巢和⾷物之间的最短路径。
蚁群算法中,蚂蚁个体作为每⼀个优化问题的可⾏解。
⾸先随机⽣成初始种群,包括确定解的个数、信息素挥发系数、构造解的结构等。
然后构造蚁群算法所特有的信息素矩阵每只妈蚁执⾏蚂蚊移动算⼦后,对整个群体的蚂蚁做⼀评价,记录最优的蚂蚁。
之后算法根据信息素更新算⼦更新信息素矩阵,⾄此种群的⼀次选代过程完成。
整个蚂蚁群体执⾏⼀定次数的选代后退出循环、输出最优解。
2.术语介绍(1)蚂蚁个体。
每只蚂蚁称为⼀个单独的个体,在算法中作为⼀个问题的解。
(2)蚂蚁群体。
⼀定数量的蚂蚁个体组合在⼀起构成⼀个群体,蚂蚁是群体的基本单位。
蚁群算法
tabu(k)满吗?
N
Y 更新最佳路线,清空tabu(k), NC+1
2.2 参数选择
• 2.2.1 信息素更新模型的选择 前面介绍关于 k 有三种实现方法,分别 ij 对应三种不同的模型,称为蚁周模型(antcycle)、蚁密模型(ant-quantity)、蚁量模型 (ant-density)。这里我们给出这三种AS系统 基本模型的实验结果。
r 1 r ij
1
* ij
若边(i,j)是第r只蚂蚁路径的一部分
否则
3.3 蚁群系统(ACS)
蚁群系统是AS算法的改进版本,改进之处: • 采用了与AS不同的伪随机比例游历选择概率; • 不仅有信息素释放,还有信息素挥发,且只对 精英蚂蚁执行 • 增加了局部信息素更新。
伪随机比例选择规则:第K只蚂蚁在结点i处选择结点j作为 下一个结点的计算公式为
蚁群优化算法
1.蚁群算法的背景和概述
平时我们观察蚂蚁在寻 找食物的过程,总可以 发现条密集很多蚂蚁的 轨迹线路,大多数蚂蚁 都沿着这条线路往返与 食物与巢穴。那么这条 路是如何形成的呢?
• 据昆虫学家的观察和研究,发现蚂蚁有能力在没有 任何可见提示下找出从蚁穴到食物源的最短路径, 并且能随环境变化适应性地搜索新的路径,产生新 的选择。 • 生物学家和仿生学家研究发现,蚂蚁在觅食走过的 路径上释放一种蚂蚁特有的分泌物—信息激素 (Pheormnoe)。蚂蚁个体之间正是通过这种信息 激素进行信息传递,从而能相互协作,完成复杂任务。 在一定范围内蚂蚁能够察觉到这种信息激素并指 导它的行为,当一些路径通过的蚂蚁越多,则留下的 信息激素轨迹也就越多,招致后来更多的蚂蚁选择 该路径的概率也越高,于是越发增加了该路径的信 息素强度。
蚁群算法
4.蚁群算法应用
信息素更新规则
1.蚁群算法简述 2.蚁群算法原理
最大最小蚂蚁系统
3.蚁群算法改进
4.蚁群算法应用
最大最小蚂蚁系统(MAX-MIN Ant System,MMAS)在基本AS算法的基础 上进行了四项改进: (1)只允许迭代最优蚂蚁(在本次迭代构建出最短路径的蚂蚁),或者至今 最优蚂蚁释放信息素。(迭代最优更新规则和至今最优更新规则在MMAS 中会被交替使用)
p( B) 0.033/(0.033 0.3 0.075) 0.081 p(C ) 0.3 /(0.033 0.3 0.075) 0.74 p( D) 0.075 /(0.033 0.3 0.075) 0.18
用轮盘赌法则选择下城市。假设产生的 随机数q=random(0,1)=0.05,则蚂蚁1将会 选择城市B。 用同样的方法为蚂蚁2和3选择下一访问 城市,假设蚂蚁2选择城市D,蚂蚁3选择城 市A。
蚁群算法
1.蚁群算法简述 2.蚁群算法原理 3.蚁群算法改进 4.蚁群算法应用
1.蚁群算法简述 2.蚁群算法原理
3.蚁群算法改进
4.蚁群算法应用
蚁群算法(ant colony optimization, ACO),又称蚂蚁 算法,是一种用来在图中寻找优 化路径的机率型算法。 由Marco Dorigo于1992年在他 的博士论文中提出,其灵感来源 于蚂蚁在寻找食物过程中发现路 径的行为
4.蚁群算法应用
例给出用蚁群算法求解一个四城市的TSP 3 1 2 3 5 4 W dij 1 5 2 2 4 2
假设蚂蚁种群的规模m=3,参数a=1,b=2,r=0.5。 解:
满足结束条件?
蚁群算法的基本原理
蚁群算法的基本原理蚁群算法 (Ant Colony Optimization, ACO) 是一种基于群体智能的优化算法,模拟了蚂蚁在寻找食物时候的行为,被广泛应用于求解组合优化问题、路径规划等领域。
蚁群算法的基本思路蚁群算法的基本思路是通过模拟蚂蚁在寻找食物的过程中释放信息素来获取全局最优解。
具体过程如下:1.初始化信息素: 首先,需要在所有可行解的路径上放置一些信息素。
在开始时,信息素值可以选择为等量的值或一些默认值。
2.蚁群搜索: 一开始,所有的蚂蚁都分别随机选择一个节点作为起点,并开始在网络中搜索。
蚂蚁行动的过程中,会根据路径上信息素浓度的大小来选择下一步的方向。
同时,每只蚂蚁都会记录其所经过的路径和信息素值。
3.信息素更新: 每只蚂蚁到达终点之后,计算其所经过路径的费用,然后根据一定的规则更新路径上的信息素。
较优的路径上将会添加更多的信息素,使下一次蚂蚁选择该路径的概率更大。
4.重复搜索: 重复上面的步骤,直到满足一个停止条件为止。
一种常见的停止条件是达到预定的迭代次数。
蚁群算法的优势蚁群算法在解决组合优化问题时,具有以下的优势:1.全局优化能力极强: 因为每只蚂蚁都只关注自己所经过的路径上的信息素值,所以可以同时搜索并更新多个路径,从而有可能找到全局最优解。
2.能够避免陷入局部最优: 蚁群算法可以通过信息素的挥发、说长存、信息素值的启发式更新等手段来避免陷入局部最优解。
3.易于扩展和并行化: 蚁群算法通常是一种并行的算法,可以很轻松地应用于分布式计算环境中。
蚁群算法的应用蚁群算法在解决组合优化问题、路径规划、调度等方面有着广泛的应用,如下所示:1.旅行商问题: 蚁群算法可以用于解决旅行商问题。
2.线性规划问题: 蚁群算法可以用于求解线性规划问题。
3.路径规划问题: 蚁群算法可以用于车辆路径规划问题。
4.调度问题: 蚁群算法可以用于作业车间调度问题。
蚁群算法是一种基于群体智能的优化算法,模拟了蚂蚁在寻找食物时候的行为。
蚁群算法的基本原理与改进
A
1
蚁群算法
蚁群算法(ant colony alogrithm)是一种模拟进化算法。 蚁群算法(又称为人工蚁群算法)是由意大利学者M.Dorigo,
V.Mahiezzo,A.Colorni等人受到人们对自然界中真是蚁群集体 行为的研究成果的启发而首先提出来的。这个算法的主要目的是在 图中寻找优化路径的机率算法。 蚁群算法最早是为了解决TSP问题(即旅行商问题)。 TSP问题的要求:路径的限制是每个城市只能拜访一次;最后 要回到原来出发的城市。求得的路径路程为所有路径之中的最小 值。
并不要求所有的蚂蚁都找到最优模板,而只需要一只找到最优模板即可。如果 要求所有的蚂蚁都找到最优模板,反而影响了计算效率。 蚁群算法收敛速度慢、易陷入局部最优。蚁群算法中初始信息素匮乏。 蚁群算法一般需要较长的搜索时间,其复杂度可以反映这一点;而且该方法容 易出现停滞现象,即搜索进行到一定程度后,所有个体发现的解完全一致,不 能对解空间进一步进行搜索,不利于发现更好的解。
(4)它是一种全局优化的方法;不仅可用于求解单目标优化问题,而 且可用于求解多目标优化问题;
(5)它是一种启发式算法;计算复杂性为 O(NC*m*n2),其中NC 是 迭代次数,m 是蚂蚁数目,n 是目的节点数目。
A
13
下面是对蚁群算法的进行过程中采用的规则进行的一些说明。
范围
蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半 径(一般是3),那么它能观察到的范围就是3*3个方格世界,并且 能移动的距离也在这个范围之内。
最后,经过一段时间运行,就可能会出现一条最短的路径被大 多数蚂蚁重复着。
A
3
基本原理
蚁群算法是对自然界蚂蚁的寻径方式进行模似而得出的一种仿生算 法。
《蚁群算法实验室》流程图
《蚁群算法实验室》流程图目前蚁群算法主要用在组合优化方面,基本蚁群算法的思路是这样的:1. 在初始状态下,一群蚂蚁外出,此时没有信息素,那么各自会随机的选择一条路径。
2. 在下一个状态,每只蚂蚁到达了不同的点,从初始点到这些点之间留下了信息素,蚂蚁继续走,已经到达目标的蚂蚁开始返回,与此同时,下一批蚂蚁出动,它们都会按照各条路径上信息素的多少选择路线(selection),更倾向于选择信息素多的路径走(当然也有随机性)。
3. 又到了再下一个状态,刚刚没有蚂蚁经过的路线上的信息素不同程度的挥发掉了(evaporation),而刚刚经过了蚂蚁的路线信息素增强(reinforcement)。
然后又出动一批蚂蚁,重复第2个步骤。
每个状态到下一个状态的变化称为一次迭代,在迭代多次过后,就会有某一条路径上的信息素明显多于其它路径,这通常就是一条最优路径。
关键的部分在于步骤2和3:步骤2中,每只蚂蚁都要作出选择,怎样选择呢?selection过程用一个简单的函数实现:蚂蚁选择某条路线的概率=该路线上的信息素÷所有可选择路线的信息素之和假设蚂蚁在i点,p(i,j)表示下一次到达j点的概率,而τ(i,j)表示ij两点间的信息素,则:p(i,j)=τ(i,j)/∑τ(i)(如果所有可选路线的信息素之和∑τ(i)=0,即前面还没有蚂蚁来过,概率就是一个[0,1]上的随机值,即随机选择一条路线)步骤3中,挥发和增强是算法的关键所在(也就是如何数学定义信息素的)evaporation过程和reinforcement过程定义了一个挥发因子,是迭代次数k的一个函数ρ(k)=1-lnk/ln(k+1)最初设定每条路径的信息素τ(i,j,0)为相同的值然后,第k+1次迭代时,信息素的多少对于没有蚂蚁经过的路线:τ(i,j,k+1)=(1-ρ(k))τ(i,j,k),显然信息素减少了有蚂蚁经过的路线:τ(i,j,k+1)=(1-ρ(k))τ(i,j,k)+ρ(k)/|W|,W为所有点的集合为什么各个函数要如此定义,这个问题很难解释清楚,这也是算法的精妙所在。
基本蚁群算法
摘要许多实际工程问题可以抽象为相应的组合优化问题,TSP问题是作为所有组合优化问题的范例而存在的,它已成为并将继续成为测试组合优化新算法的标准问题。
从理论上讲,使用穷举法可以求解出TSP问题的最优解;但是对现有的计算机来说,让它在如此庞大的搜索空间中寻求最优解,几乎是不可能的。
所以,各种求TSP问题近似解的算法应运而生了,本文所描述的蚁群算法(AC)也在其中。
目前已出现了很多的启发式算法,而蚁群算法作为一种新型的启发式算法,已成功地应用于求解TSP问题。
蚂蚁通过分泌信息素来加强较好路径上信息素的浓度,同时按照路径上的信息素浓度来选择下一步的路径:好的路径将会被越来越多的蚂蚁选择,因此更多的信息素将会覆盖较好的路径;最终所有的蚂蚁都集中到了好的路径上。
蚂蚁的这种基于信息素的正反馈原理正是整个算法的关键所在。
本文介绍了基本蚁群算法概念、原理及蚁群算法的特点,再根据蚁群算法的缺点做出了优化。
采用轮盘赌选择代替了基本框架中通过启发式函数和信息素选择路径,改进蚁群算法的信息素传递参数,让整个算法更快速的找到最优解。
其次,采用最大最小优化系统限制最大值和最小值,让整个系统更快收敛,得到最优解。
关键字:蚁群算法,TSP问题,启发式函数,轮盘算法,最大最小优化ABSTRACTMany practical engineering problems can be abstracted as corresponding combinatorial optimization problem, TSP problem is an example of all as a combinatorial optimization problem, it has become and will continue to be a new combinatorial optimization algorithm of standard test problems. In theory, using the exhaustion method can solve the TSP problem optimal solution; But for the existing computer, let it in such a large search space to seek the optimal solution, it is almost impossible. So, all kinds of algorithm arises at the historic moment, the approximate solution of the TSP problem described in this paper, ant colony algorithm (AC) is among them.Has appeared a lot of heuristic algorithm and ant colony algorithm as a kind of new heuristic algorithm, has been successfully used in solving TSP problems. Ant secretion by pheromones to strengthen the good path pheromone concentration, at the same time according to the path to choose the next path pheromone concentration: good paths will be more and more ants to choose, so that more information will cover good path; Eventually all the ants on a good path. This positive feedback based on the pheromone of ant principle is the key to the whole algorithm.This paper introduces the basic concept of ant colony algorithm, principle and characteristics of ant colony algorithm, according to the disadvantages of ant colony algorithm optimization. Adopting roulette selection instead of the basic framework by heuristic function and choose path pheromone, pheromone passing parameters of improved ant colony algorithm, make the whole algorithm find the optimal solution more quickly. Second, limiting the maximum and the minimum maximum minimum optimization system, make the whole system faster convergence and the optimal solution is obtained.Keywords: ant colony algorithm, the TSP problem, a heuristic function, roulette algorithm, maximum_minimum optimization目录摘要 (1)ABSTRACT (2)第1章绪论 (5)1.1 研究目的和意义 (5)1.2 国内外研究现状 (6)1.2.1 国外研究现状 (6)1.2.2 国内研究现状 (7)1.3 本文研究内容 (7)(1)基本蚁群算法 (8)(2)蚁群算法的优化 (8)(3)蚁群算法在TSP问题中的应用 (8)1.4 开发环境与工具 (8)1.5 论文的组织结构 (8)第2章蚁群算法 (9)2.1 蚁群算法简介 (9)2.2 蚁群算法的原理 (10)2.2.1 蚂蚁觅食规则 (10)2.2.2 蚂蚁移动规则 (11)2.2.3 蚂蚁避障规则 (11)2.2.4 蚂蚁撒信息素规则 (11)2.3 蚁群算法的特点及优缺点 (11)2.3.1 蚁群算法的特点 (11)2.3.2 蚁群算法的优点 (12)2.3.3 蚁群算法的缺点 (13)2.5 蚁群算法的核心函数 (13)(1)初始化 (13)(2)选择下一个城市,返回城市编号 (14)(3)更新环境信息素 (16)(4)检查终止条件 (17)(5)输出最优值 (17)2.6 蚁群算法的参数分析 (17)2.6.1 蚂蚁数量N_ANT_COUNT (17)2.6.2 启发因子 (18)2.6.3 期望启发因子 (18)2.6.4 信息素挥发度 (19)2.6.5 总信息量(DBQ) (19)第3章改进的蚁群算法 (20)3.1 轮盘赌选择 (21)3.1.1 轮盘赌选择基本思想 (21)3.1.2 轮盘赌选择工作过程 (21)3.2 MAX_MIN ACO (23)3.2.1 MAX_MIN算法的框架结构 (23)3.2.2 MAX_MIN 算法流程图 (25)第4章蚁群算法在车辆路径问题中的应用 (26)4.1 车辆路径问题简介 (26)4.1.1 车辆路径问题定义 (26)4.1.2 车辆路径问题分类 (27)4.2 车辆路径问题的求解算法 (28)4.2.1 精确算法 (28)4.2.2 启发式算法 (29)4.3 蚁群算法解决车辆路径问题 (30)4.4 数值实验结果及分析 (31)4.4.1 轮盘赌选择优化前后数据对比 (32)4.4.2 MAX_MIN算法改进前后数据对比 (33)第5章总结与展望 (34)参考文献 (35)第1章绪论TSP问题是一种特殊的车辆路径问题,是作为所有组合优化问题的范例而存在的,它已成为并将继续成为测试组合优化新算法的标准问题。
蚁群算法的基本原理和应用
蚁群算法的基本原理和应用简介蚁群算法(Ant Colony Optimization,简称ACO)是一种模拟蚂蚁觅食行为的启发式算法,它源于对蚂蚁在寻找食物时的行为规律的研究。
蚁群算法模拟了蚂蚁在寻找最佳路径时释放信息素、选择路径的策略,通过蚁群成员之间的相互合作和信息共享来求解各类优化问题。
蚁群算法具有较高的适应性和鲁棒性,被广泛应用于优化问题求解中。
基本原理蚁群算法基于一种基本的反馈机制:蚂蚁在行动过程中释放信息素,并根据所释放的信息素密度来选择路径。
信息素在路径上的积累程度会影响蚂蚁选择路径的概率,从而引导整个蚁群向目标位置集中。
具体的基本原理如下:1.蚂蚁的行动规则:蚂蚁按照一定的规则进行移动,每个蚂蚁根据当前位置的信息素密度以及启发式信息(例如距离、路径质量等)选择下一步的移动方向。
2.信息素的更新:蚂蚁在路径上释放信息素,并且信息素的蒸发和更新过程会导致信息素的动态变化。
经过多次迭代后,信息素会逐渐积累在最优路径上,从而引导后续的蚂蚁选择该路径。
3.路径选择概率:蚂蚁在选择下一步移动方向时,会根据当前位置的信息素和启发式信息计算路径选择概率。
较高的信息素密度和启发式信息将增加路径的选择概率。
应用领域蚁群算法在众多领域中取得了广泛的应用,以下列举几个示例:1.路径规划问题:蚁群算法可以用于解决路径规划问题,例如在城市中找到最短路径。
蚁群算法通过模拟蚂蚁的觅食行为,可以在复杂的网络中找到最优路径,无论是在城市道路网络还是在电信网络中。
–寻找最短路径:蚁群算法可以应用于解决最短路径问题,例如在城市导航、物流路径规划等领域。
–车辆路径优化:蚁群算法可以优化车辆的路线,减少行驶距离和时间,提高运输效率。
2.优化问题:蚁群算法在求解各种优化问题中具有较好的性能,例如旅行商问题、装箱问题等。
–旅行商问题:蚁群算法可以应用于解决旅行商问题,找到最短的旅行路线,减少旅行的距离和时间。
–装箱问题:蚁群算法可以优化装箱问题,将不同大小的物品装入不同大小的容器中,减少空间浪费。
蚁群算法
Food
1
1
D
B
Obstacle
1
A
1
Nest
2 C
2
图1.1 蚁群系统示意图
2. 蚁群算法基本原理
蚁群算法是一种随机搜索算法,与其他模型进化算法一样, 通过候选解组成的群体的进化过程来寻求最优解,该过程包括两 个阶段:适应阶段和协助阶段。
⑴在适应阶段,各候选解根据积累的信息不断调整自身结构; ⑵在协助阶段,候选解之间通过信息交流,以期望产生性能更 好的解。
城市,tabuk (k 1, 2, , m) 用以记录蚂蚁 k 当前所走过的城市,集合tabuk 随着进
化过程作动态调整。ij 表示边弧 (i, j) 的能见度,用某种启发式算法算出,一般
取ij 1 dij , dij 表示城市 i 与城市 j 之间的距离。 表示轨迹的相对重要性,
表示能见度的相对重要性。
Obstacle
C
在 t=5 时刻,两组蚂蚁在 D 点相遇,
此时,DB 上的信息素数量与 DC 上的相
1
A
2
同,因为各有 10 只蚂蚁选择了相应的道
1
路,从而有 5 只返回的蚂蚁将选择 BD 而
另外 5 只将选择 CD;
Nest
图1.1 蚁群系统示意图
2. 蚁群算法基本原理
在 t=8 时刻,前 5 只蚂蚁将返回巢穴, 而 AC、DC、BD 上各有 5 只蚂蚁;
Food
1
1
D
B
Obstacle
1
A
1
Nest
2 C
2
图1.1 蚁群系统示意图
2. 蚁群算法基本原理
在 t=0 时刻,20 只蚂蚁从巢穴出发移
蚁群算法
蚁群算法蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。
它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。
蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。
针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。
目录1基本信息1.1 概念1.2 原理1.3 问题2详细说明2.1 范围2.2 环境2.3 觅食规则2.4 移动规则2.5 避障规则2.6 信息素规则3相关研究3.1 引申3.2 蚁群算法的实现3.3 解读搜索引擎算法“蚁群算法”1.基本信息1.1概念各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物。
当一只找到食物以后,它会向环境释放一种挥发性分泌物pheromone (称为信息素,该物质随着时间的推移会逐渐挥发消失,信息素浓度的大小表征路径的远近)来实现的,吸引其他的蚂蚁过来,这样越来越多的蚂蚁会找到食物。
有些蚂蚁并没有象其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果另开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上来。
最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复着。
1.2原理设想,如果我们要为蚂蚁设计一个人工智能的程序,那么这个程序要多么复杂呢?首先,你要让蚂蚁能够避开障碍物,就必须根据适当的地形给它编进指令让他们能够巧妙的避开障碍物,其次,要让蚂蚁找到食物,就需要让他们遍历空间上的所有点;再次,如果要让蚂蚁找到最短的路径,那么需要计算所有可能的路径并且比较它们的大小,而且更重要的是,你要小心翼翼的编程,因为程序的错误也许会让你前功尽弃。
这是多么不可思议的程序!太复杂了,恐怕没人能够完成这样繁琐冗余的程序。
23个基本测试函数 蚁群算法
23个基本测试函数蚁群算法蚁群算法是一种模拟蚂蚁行为的启发式算法,它通过模拟蚁群寻找食物的行为,来解决各种优化问题。
蚁群算法的核心思想是通过信息交流和反馈机制来寻找问题的最优解。
本文将介绍蚁群算法的基本原理,并以23个基本测试函数为例,展示蚁群算法在解决优化问题中的应用。
1. 算法简介蚁群算法最早由意大利学者Dorigo在1992年提出,其灵感来自于观察蚂蚁在寻找食物时的行为。
蚁群算法将问题抽象成一个图论模型,其中蚂蚁代表解空间中的候选解,信息素则代表蚂蚁之间的信息交流。
蚂蚁根据信息素的浓度和距离选择路径,并在路径上释放信息素,从而影响其他蚂蚁的选择。
通过多次迭代,蚂蚁群体逐渐收敛于最优解。
2. 蚁群算法的基本步骤蚁群算法主要包括初始化、路径选择、信息素更新和收敛判断等步骤。
2.1 初始化在蚁群算法中,需要初始化蚂蚁的位置和信息素的浓度。
蚂蚁的初始位置可以随机选择或者根据问题的特点进行设置。
信息素的初始浓度通常设置为一个较小的常数。
2.2 路径选择在路径选择阶段,蚂蚁根据信息素的浓度和距离选择路径。
通常情况下,信息素浓度较高的路径会有更多的蚂蚁选择,但也存在一定的随机性,以保证算法能够全局搜索。
2.3 信息素更新在信息素更新阶段,蚂蚁根据问题的优化目标更新路径上的信息素。
通常情况下,蚂蚁在路径上释放的信息素与路径的优化程度成正比。
信息素的更新规则可以根据具体问题进行设计。
2.4 收敛判断在每轮迭代之后,需要判断算法是否收敛。
通常情况下,可以通过设定一个停止准则来判断算法是否继续迭代。
常用的停止准则包括迭代次数、目标函数值的变化幅度等。
3. 蚁群算法在优化问题中的应用蚁群算法在解决各种优化问题中具有广泛的应用。
下面以23个基本测试函数为例,展示蚁群算法在不同问题中的应用。
3.1 球面函数球面函数是一个简单的优化问题,目标是找到一个全局最小值。
蚁群算法通过信息素的交流和反馈机制,可以在搜索空间中快速找到最优解。
智能计算之蚁群算法
第三章基本蚁群算法原理3.1 自然界中的蚂蚁在蚂蚁寻找食物的过程中,总能找到一条从蚁穴到随机分布的距离很远的食物源之间的最短路径。
仿生学家经过研究发现,蚂蚁没有视觉,但是在寻找食物的行进过程中,会不断分泌一种化学刺激物——信息素,蚂蚁之间通过它来相互通信。
信息素量与路径长度有关,路径越长,释放的信息素浓度就越低。
信息素可以吸引后来的蚂蚁沿信息素浓度高的路径行进。
某一路径上走过的蚂蚁越多,留下的信息素就越多,后来者选择该路径的概率就越大,蚂蚁个体之间就是通过这种信息的交流搜索食物,这样,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象,整个蚁群最终会选择出最短路径行进。
图3.1 现实蚂蚁寻找食物如图3.1(a)所示,蚂蚁在点A和E之间的路径上行走,路径突然被出现的障碍物截断,如3.1(b)所示。
因此,蚂蚁从A至E步行至位置B (或以相反的方向在位置D处)必须决定是否要向左或向右转。
一开始蚂蚁按同等概率选择路径,不论路径长短。
第一只蚂蚁到达B点(或D)具有相同的概率向左或向右转。
由于路径BCD比BHD短,以路径BCD第一个到达的蚂蚁比以路径BHD到达的早。
由于一半蚂蚁是以偶然的方式通过DCBA障碍的或者已经通过路径BCD到达的,于是,一个蚂蚁从E 到D返回会在路径DCB上找到一个更强有力的线索。
因此他们极大概率上选择通过路径DCB而不是DHB。
因此,单位时间内通过路径BCD的蚂蚁要比通过路径BHD的蚂蚁多的多,如图3.1(c)。
这将导致较短路径上的信息素量增长地比较长路径上的快得多,因此单一蚂蚁路径的选择很快偏向于较短路径。
最后的结果是很快所有的蚂蚁会选择较短的路径[1]。
不仅如此,作为一种化学物质,信息素还具有挥发性,这使得寻径初期距离较长的路径和长期没有经过的路径对蚂蚁的影响逐渐减小。
可见,在整个寻找食物的过程中,虽然单个蚂蚁的选择能力有限,但是通过信息素的作用是整个蚁群行为具有非常高的自组织性,蚂蚁之间交换着路径信息,最终通过蚁群的集体自催化行为找出最优路径[3,4]。
蚁群算法的基本原理
2.1 蚁群算法的基本原理蚁群优化算法是摹拟蚂蚁觅食的原理,设计出的一种群集智能算法。
蚂蚁在觅食过程中能够在其经过的路径上留下一种称之为信息素的物质,并在觅食过程中能够感知这种物质的强度,并指导自己行动方向,它们总是朝着该物质强度高的方向挪移,因此大量蚂蚁组成的集体觅食就表现为一种对信息素的正反馈现象。
某一条路径越短,路径上经过的蚂蚁越多,其信息素遗留的也就越多,信息素的浓度也就越高,蚂蚁选择这条路径的几率也就越高,由此构成的正反馈过程,从而逐渐的逼近最优路径,找到最优路径。
蚂蚁在觅食过程时,是以信息素作为媒介而间接进行信息交流,当蚂蚁从食物源走到蚁穴,或者从蚁穴走到食物源时,都会在经过的路径上释放信息素,从而形成为了一条含有信息素的路径,蚂蚁可以感觉出路径上信息素浓度的大小,并且以较高的概率选择信息素浓度较高的路径。
蚁穴食物源AB 15cm(a) 蚁穴 1 2 食物源A B (b)人工蚂蚁的搜索主要包括三种智能行为:(1)蚂蚁的记忆行为。
一只蚂蚁搜索过的路径在下次搜索时就再也不被该蚂蚁选择,因此在蚁群算法中建立禁忌表进行摹拟。
(2)蚂蚁利用信息素进行相互通信。
蚂蚁在所选择的路径上会释放一种信息素的物质,当其他蚂蚁进行路径选择时,会根据路径上的信息素浓度进行选择,这样信息素就成为蚂蚁之间进行通信的媒介。
(3)蚂蚁的集群活动。
通过一只蚂蚁的运动很难达到事物源,但整个蚁群进行搜索就彻底不同。
当某些路径上通过的蚂蚁越来越多时,路径上留下的信息素数量也就越多,导致信息素强度增大,蚂蚁选择该路径的概率随之增加,从而进一步增加该路径的信息素强度,而通过的蚂蚁比较少的路径上的信息素会随着时间的推移而挥发,从而变得越来越少。
3.3.1蚂蚁系统蚂蚁系统是最早的蚁群算法。
其搜索过程大致如下:在初始时刻,m 只蚂蚁随机放置于城市中,各条路径上的信息素初始值相等,设为:0(0)ij ττ=为信息素初始值,可设0m m L τ=,mL 是由最近邻启示式方法构造的路径长度。
第5章-蚁群算法
4.移动规则
每只蚂蚁都朝向信息素最多的方向移,并且 ,当周围没有信息素指引的时候,蚂蚁会按照 自己原来运动的方向惯性的运动下去,并且, 在运动的方向有一个随机的小的扰动。为了防 止蚂蚁原地转圈,它会记住最近刚走过了哪些 点,如果发现要走的下一点已经在最近走过了 ,它就会尽量避开。
15
5.避障规则
旅行商问题:一商人去n个城市销货,所有城市走一遍再 回到起点,使所走路程最短。
TSP在许多工程领域具有广泛的应用价值,例如电路板布 线、VLSI芯片设计、机器人控制、网络路由等。随着城 市数目的增多,问题空间将呈指数级增长。
TSP问题的数学描述
TSP问题表示为一个N个城市的有向图G=(N,A),其中
代后,更新所有路径上的信息素,并且每只蚂蚁经过 的路径所更新的信息素是相同的。
蚁量算法( Ant-Quantity ):
ik j(t) d Q ij, 若 t时 刻 , 蚂 蚁 k由 城 市 i选 择 了 城 市 j
0, 否 则
蚁密算法( Ant-Density ):
ik j(t) Q 0 , , 否 若 则 t时 刻 , 蚂 蚁 k 由 城 市 i选 择 了 城 市 j
方面。挥发系数
信息素更新公式如下:
ij(t1)(1)ij(t)ij(t)
ij(t) m ikj (t) k1
ik j( t) Q 0 , /L 否 k ( 则 t) ,如 果 t时 刻 蚂 蚁 k 由 城 市 i选 择 了 城 市 j
ij (t ) 表示当m个蚂蚁都选择了下一个城市后,所有选择由i到j的
0,
otherwise
其中: ij ( t ) 表示ij路径上的信息素浓度; ij 1/dij 是启发信息,能见度;
第22讲 蚁群算法
To Matlab exp12_3_2.m
综上,某条路径上走过的蚂蚁越多,则后来者选择该路径的概率越大,所以我们可以 认为蚁群在毫无提示的前提条件下,正确地选择了最短路径,达到了最快觅食的目的,并 且可以在周围环境变化的情况下,依靠信息素的变化迅速调整并找到新的最短路径。
二、蚁群算法数学模型
下面以旅行商问题(TSP)为例来更深入地介绍蚁群算法,并建立其数学模 型。并假设: (1) 蚂蚁根据与城市间距离和路径上信息素含量有关的某一概率函数选择 下一个需要访问的城市; (2)每只蚂蚁在完成一次周游(指蚂蚁走完所有的城市)以前,不允许转 到已访问的城市; (3)蚂蚁在完成一次周游时,在每一条走过的边上释放信息素; (4)蚂蚁留在边上的信息素会随着时间地推移不断挥发。
n
ij (t 1) (1 ) ij (t ) ij
k ij ij k 1
(3-2、3)
k 其中,信息素增量 ij 可以有三种不同的计算方式,分别为
1)蚁密系统
Q 若蚂蚁k在本次周游中经过路径lij k ij 否则 0
Q 为正常数。
(3-4)
2)蚁量系统
Q / dij k ij 0
3)蚁周系统
若蚂蚁k在本次周游中经过路径lij 否则
(3-5)
Q / Lk k ij 0
若蚂蚁k在本次周游中经过路径lij 否则
(3-6)
Lk 为第 k 只蚂蚁在本次周游中所走的路径长度。
以上三种计算方式可根据不同的情况进行选取,它们之间的对比如下表所示: 方 式 最 优 解 收敛速度 算法效率 蚁密系统 局部最优 慢 较低 蚁量系统 局部最优 较快 较高 蚁周系统 全局最优 快 高
一、蚁群算法基本思想
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
蚁群算法浅析摘要:介绍了什么是蚁群算法,蚁群算法的种类,对四种不同的蚁群算法进行了分析对比。
详细阐述了蚁群算法的基本原理,将其应用于旅行商问题,有效地解决了问题。
通过对旅行商问题C++模拟仿真程序的详细分析,更加深刻地理解与掌握了蚁群算法。
关键词:蚁群算法;旅行商问题;信息素;轮盘选择一、引言蚁群算法(Ant Colony Optimization, ACO),是一种用来在图中寻找优化路径的算法。
它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。
蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。
蚁群算法成功解决了旅行商问题(Traveling Salesman Problem, TSP):一个商人要到若干城市推销物品,从一个城市出发要到达其他各城市一次而且最多一次最后又回到第一个城市。
寻找一条最短路径,使他从起点的城市到达所有城市一遍,最后回到起点的总路程最短。
若把每个城市看成是图上的节点,那么旅行商问题就是在N个节点的完全图上寻找一条花费最少的回路。
最基本的蚁群算法见第二节。
目前典型的蚁群算法有随机蚁群算法、排序蚁群算法和最大最小蚁群算法,其中后两种蚁群算法是对前一种的优化。
本文将终点介绍随机蚁群算法。
二、基本蚁群算法(一)算法思想各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物。
当一只找到食物以后,它会向环境释放一种信息素,信息素多的地方显然经过这里的蚂蚁会多,因而会有更多的蚂蚁聚集过来。
假设有两条路从窝通向食物,开始的时候,走这两条路的蚂蚁数量同样多(或者较长的路上蚂蚁多,这也无关紧要)。
当蚂蚁沿着一条路到达终点以后会马上返回来,这样,短的路蚂蚁来回一次的时间就短,这也意味着重复的频率就快,因而在单位时间里走过的蚂蚁数目就多,洒下的信息素自然也会多,自然会有更多的蚂蚁被吸引过来,从而洒下更多的信息素。
因此,越来越多地蚂蚁聚集到较短的路径上来,最短的路径就找到了。
蚁群算法的基本思想如下图表示:图1 等概率选择图2 最优路径图3 最优比重(二)算法描述基本蚁群算法的算法简单描述如下:1.所有蚂蚁遇到障碍物时按照等概率选择路径,并留下信息素;2.随着时间的推移,较短路径的信息素浓度升高;3.蚂蚁再次遇到障碍物时,会选择信息素浓度高的路径;4.较短路径的信息素浓度继续升高,最终最优路径被选择出来。
三、随机蚁群算法(一)算法思想在基本蚁群算法中,蚂蚁会在多条可选择的路径中,自动选择出最短的一条路径。
但是,一旦蚁群选择了一条比之前短的路径,就会认为这条路径是最好的,在这条路径上一直走下去。
这样的算法存在问题:蚂蚁可能只是找到了局部的最短路径,而忽略了全局最优解。
因此,在基本蚁群算法的基础上,需要对蚂蚁选路的方案加以改善:有些蚂蚁并没有象其它蚂蚁一样总重复同样的路,他们会另辟蹊径,也就是它会按照一定的概率不往信息素高的地方。
如果令开辟的道路比原来的其他道路更短,那么,渐渐地,更多的蚂蚁被吸引到这条较短的路上来。
最后,经过一段时间运行,可能会出现一条最短的路径被大多数蚂蚁重复为了实现蚂蚁的“随机”选路,我们需要做以下假设:1.范围:蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半径,如果半径等于2,那么它能观察到的范围就是2*2个方格世界,并且能移动的距离也在这个范围之内。
2.环境:环境以一定的速率让信息素消失。
3.觅食规则:在每只蚂蚁能感知的范围内寻找是否有食物,如果有就直接过去。
否则看是否有信息素,并且比较在能感知的范围内哪一点的信息素最多,那么它朝哪个方向走的概率就大。
这就意味着每只蚂蚁多会以小概率犯错误,从而并不是往信息素最多的点移动。
4.避障规则:如果蚂蚁要移动的方向有障碍物挡住,它会随机的选择另一个方向,并且有信息素指引的话,它会按照觅食的规则行为。
5.播撒信息素规则:每只蚂蚁在找到食物后撒发的信息素。
自然想到一个问题:开始时环境没有信息素,蚂蚁为什么会相对有效的找到食物呢?这个问题用蚂蚁的移动规则同样可以解释。
首先,它要能尽量保持某种惯性,这样使得蚂蚁尽量向前方移动(开始,这个前方是随机固定的一个方向),而不是原地无谓的打转或者震动;其次,蚂蚁要有一定的随机性,虽然有了固定的方向,但它也不能像粒子一样直线运动下去,而是有一个随机的干扰。
这样就使得蚂蚁运动起来具有了一定的目的性,尽量保持原来的方向,但又有新的试探,这就解释了为什么单个蚂蚁在复杂的诸如迷宫的地图中仍然能找到隐蔽得很好的食物。
(二)算法描述随机蚁群算法的算法描述如下:算法输入:城市数量N,两两城市间的距离,所有路径的信息素浓度算法输出:蚂蚁走过的路径长度1.设置全部城市都没有去过,走过的路径长度为0;2.随机选择一个出发的城市;3.i = 14.while(i < N)4.根据可选择路径的信息素浓度,计算出各自选中的概率;5.根据不同选择的概率,使用轮盘选择算法,得到选择的下一个城市;6.将所在城市标记为不可选择;7.end8.计算走过路径的长度;用随机蚁群算法解决旅行商问题,实际上是多次使用蚁群算法,不断更新最短路径的过程。
由此,我们容易得到旅行商问题的算法描述:算法输入:所有城市的X、Y坐标,蚂蚁数量n,迭代次数K算法输出:旅行商的最短路径1.计算两两城市间的距离,初始化所有路径信息素为0;2.for i = 1 : K3.for j = 1 : n4.第j只蚂蚁搜索一遍;5.if 走过的路径小于最短路径6.更新最短路径;7.更新走过路径的信息素;8.end9.end四、改进的随机蚁群算法(一)排序蚁群算法与随机蚁群算法不同的是,当蚂蚁遇到障碍物选择路径时,根据不同路径上信息素的浓度,通过计算可能达到最优解的概率算法,将路径进行排序,选择最好的路径作为下一个通往的城市。
(二)最大最小蚁群算法与随机蚁群算法和排序蚁群算法都不同的是,当蚂蚁遇到障碍物选择路径时,使用贪心策略,优先选择达到下一个城市最短的城市,即得到局部最优解。
这样以来,更多的信息素将在较短的路径聚集,使算法更快地得到全局最短路径。
五、算法比较本文介绍了四种蚁群算法,其中第一种比较简单,描述了最基本的蚁群算法思想。
但是,它忽略了更优路径存在的可能性,没有考虑到更普遍的情况。
因此,该算法只适用于小规模,无特殊情况的问题。
后三种蚁群算法属于实际中典型的蚁群算法,对不同情况的考虑比较全面,因此应用比较广泛。
三者的差别主要在于蚂蚁对不同路径的选择上,其中,随机蚁群算法首先根据不同路径上信息素的浓度,计算出选择各条路径的概率,而后使用轮盘算法选择一条路径,适用择最好的路径作为下一个通往的城市,这样做增加了空间复杂度,有效改善了时间复杂度,适用于规模较大的场合;最大最小蚁群算法则是采用贪心策略,优先选择达到下一个城市最短的城市,先得到局部最优解,再通过聚类效应得到全局最短路径,适合对时间和空间要求都较高的场合。
参考文献:1.丁洋. 蚁群优化算法分析. 论文期刊. 2012.5.2.蚁群优化算法. /.附录:1.预编译所需头文件Stdafx.h#pragma once// Stdafx.h : 标准系统包含文件的包含文件,// 或是常用但不常更改的项目特定的包含文件#include <iostream>#include <tchar.h>#include <math.h>#include <time.h>2.算法参数头文件Common.h#pragma onceconst int N_CITY_COUNT=51; //城市数量const int N_ANT_COUNT=34; //蚂蚁数量const int N_IT_COUNT=50; //迭代次数//蚁群算法参数const double ALPHA=1.0;const double BETA=2.0;const double ROU=0.5; //信息素传递参数const double DBQ=100.0; //总的信息素const double DB_MAX=10e9; //最大标志数extern double g_Trial[N_CITY_COUNT][N_CITY_COUNT]; //两两城市间信息素extern double g_Distance[N_CITY_COUNT][N_CITY_COUNT]; //两两城市间距离extern int rnd(int nLow,int nUpper); //返回随机整数extern double rnd(double dbLow,double dbUpper);//返回随机浮点数extern double ROUND(double dbA);//浮点数四舍五入extern double x_Ary[N_CITY_COUNT];extern double y_Ary[N_CITY_COUNT];3.蚂蚁类头文件Ant.h#pragma once#include "Common.h"//蚂蚁类class CAntpublic:CAnt();~CAnt();int m_nPath[N_CITY_COUNT]; //蚂蚁走的路径double m_dbPathLength; //蚂蚁走过的路径长度int m_nAllowedCity[N_CITY_COUNT]; //没去过的城市int m_nCurCityNo; //当前所在城市编号int m_nMovedCityCount; //已经去过的城市数量int ChooseNextCity(); //选择下一个城市void Init(); //初始化void Move(); //蚂蚁在城市间移动void Search(); //搜索路径void CalPathLength(); //计算蚂蚁走过的路径长度};4.旅行商类头文件Stdafx.h#pragma once#include "Common.h"#include "Ant.h"//旅行商类class CTsp{public:CTsp();~CTsp();CAnt m_cAntAry[N_ANT_COUNT];CAnt m_cBestAnt; //保存结果void InitData(); //初始化数据void Search(); //开始搜索void UpdateTrial();//更新环境信息素};5.预编译所需文件Stdafx.cpp// stdafx.cpp : 只包括标准包含文件的源文件// City.pch 将成为预编译头// stdafx.obj 将包含预编译类型信息#include "Stdafx.h"6.数据及全局函数文件Common.cpp#include "stdafx.h"#include "common.h"double g_Trial[N_CITY_COUNT][N_CITY_COUNT]; //两两城市间信息素double g_Distance[N_CITY_COUNT][N_CITY_COUNT]; //两两城市间距离//城市坐标数据double x_Ary[N_CITY_COUNT]={37,49,52,20,40,21,17,31,52,51,42,31,5,12,36,52,27,17,13,57,62,42,16,8,7,27,30,43,58,58,37,38,46,61,62,63,32,45,59,5,10,21,5,30,39,32,25,25,48,56,30};double y_Ary[N_CITY_COUNT]={52,49,64,26,30,47,63,62,33,21,41,32,25,42,16,41,23,33,13,58,42,57,57,52,38,68,48,67,48,27,69,46,10,33,63,69,22,35,15,6,17,10,64,15,10,39,32,55,28,37,40};//返回指定范围内的随机整数int rnd(int nLow,int nUpper){return nLow+(nUpper-nLow)*rand()/(RAND_MAX+1);}//返回指定范围内的随机浮点数double rnd(double dbLow,double dbUpper){double dbTemp=rand()/((double)RAND_MAX+1.0);return dbLow+dbTemp*(dbUpper-dbLow);}//返回浮点数四舍五入取整后的浮点数double ROUND(double dbA){return (double)((int)(dbA+0.5));7.蚂蚁类定义文件Ant.cpp#include "Stdafx.h"#include "Ant.h"CAnt::CAnt(){}CAnt::~CAnt(){}//搜索一次void CAnt::Search(){//初始出发点Init();//所有城市走一遍while(m_nMovedCityCount < N_CITY_COUNT){Move();}//计算走过路径长度CalPathLength();}void CAnt::Init(){for (int i=0;i<N_CITY_COUNT;i++){m_nAllowedCity[i]=1; //设置全部城市为没有去过m_nPath[i]=0; //蚂蚁走的路径全部设置为0 }//蚂蚁走过的路径长度设置为0m_dbPathLength=0.0;//随机选择一个出发城市m_nCurCityNo=rnd(0,N_CITY_COUNT);//设置出发城市m_nPath[0]=m_nCurCityNo;//标识出发城市为已经去过了m_nAllowedCity[m_nCurCityNo]=0;//已经去过的城市数量设置为1m_nMovedCityCount=1;}//选择下一个城市,返回值为城市编号int CAnt::ChooseNextCity(){int nSelectedCity=-1; //返回结果,先暂时把其设置为-1//计算当前城市和没去过的城市之间的信息素总和double dbTotal=0.0;double prob[N_CITY_COUNT]; //保存城市被选中的概率for (int i=0;i<N_CITY_COUNT;i++){if (m_nAllowedCity[i] == 1) //城市没去过{//该城市被选中的概率=该城市和当前城市间的信息素总量*(1/距离)^2prob[i]=pow(g_Trial[m_nCurCityNo][i],ALPHA)*pow(1.0/g_Distance[m_nCurCityNo][i],BETA);dbTotal=dbTotal+prob[i]; //累加信息素,得到总和}else{prob[i]=0.0;}}//轮盘选择double dbTemp=0.0;if (dbTotal > 0.0) //总的信息素值大于0{dbTemp=rnd(0.0,dbTotal); //取一个随机数for (int i=0;i<N_CITY_COUNT;i++){if (m_nAllowedCity[i] == 1) //城市没去过{dbTemp=dbTemp-prob[i]; //转动轮盘if (dbTemp < 0.0) //轮盘停止转动,记下城市编号,直接跳出循环{nSelectedCity=i;}}}}//如果城市间的信息素非常小,由于浮点运算的误差原因,可能没有城市被选择出来//出现这种情况,就把第一个没去过的城市作为返回结果if (nSelectedCity == -1){for (int i=0;i<N_CITY_COUNT;i++){if (m_nAllowedCity[i] == 1) //城市没去过{nSelectedCity=i;break;}}}//返回结果return nSelectedCity;}void CAnt::Move(){int nCityNo=ChooseNextCity(); //选择下一个城市m_nPath[m_nMovedCityCount]=nCityNo; //记录蚂蚁走的路径m_nAllowedCity[nCityNo]=0;//标记城市已经去过m_nCurCityNo=nCityNo; //记录当前所在城市编号m_nMovedCityCount++; //去过的城市数量加一}//计算蚂蚁走过的路径长度void CAnt::CalPathLength(){m_dbPathLength=0.0;int m=0;int n=0;//计算走过路径的长度和for (int i=1;i<N_CITY_COUNT;i++){m=m_nPath[i];n=m_nPath[i-1];m_dbPathLength=m_dbPathLength+g_Distance[m][n];//加上从最后城市返回出发城市的距离n=m_nPath[0];m_dbPathLength=m_dbPathLength+g_Distance[m][n];}8.旅行商类定义文件Tsp.cpp#include "Stdafx.h"#include "Tsp.h"CTsp::CTsp(){m_cBestAnt.m_dbPathLength=DB_MAX;}CTsp::~CTsp(){}//初始化数据void CTsp::InitData(){//先把最佳结果的路径设置成最大m_cBestAnt.m_dbPathLength=DB_MAX;//计算两两城市间距离double dbTemp=0.0;for (int i=0;i<N_CITY_COUNT;i++){for (int j=0;j<N_CITY_COUNT;j++){dbTemp=(x_Ary[i]-x_Ary[j])*(x_Ary[i]-x_Ary[j])+(y_Ary[i]-y_Ary[j])*(y_Ary[i]-y_Ary[j]);dbTemp=pow(dbTemp,0.5);g_Distance[i][j]=ROUND(dbTemp);}}//初始化环境信息素为0for (int i=0;i<N_CITY_COUNT;i++){for (int j=0;j<N_CITY_COUNT;j++){g_Trial[i][j]=0.0;}//更新环境信息素void CTsp::UpdateTrial(){//临时保存信息素double dbTempAry[N_CITY_COUNT][N_CITY_COUNT];memset(dbTempAry,0,sizeof(dbTempAry)); //先全部设置为0//计算新增加的信息素,保存到临时数组里int m=0;int n=0;for (int i=0;i<N_ANT_COUNT;i++) //计算每只蚂蚁留下的信息素{for (int j=1;j<N_CITY_COUNT;j++){m=m_cAntAry[i].m_nPath[j];n=m_cAntAry[i].m_nPath[j-1];dbTempAry[n][m]=dbTempAry[n][m]+DBQ/m_cAntAry[i].m_dbPathLength;dbTempAry[m][n]=dbTempAry[n][m];}//最后城市和开始城市之间的信息素n=m_cAntAry[i].m_nPath[0];dbTempAry[n][m]=dbTempAry[n][m]+DBQ/m_cAntAry[i].m_dbPathLength;dbTempAry[m][n]=dbTempAry[n][m];}//更新环境信息素for (int i=0;i<N_CITY_COUNT;i++){for (int j=0;j<N_CITY_COUNT;j++){g_Trial[i][j]=g_Trial[i][j]*ROU+dbTempAry[i][j]; //最新的环境信息素 = 留存的信息素 + 新留下的信息素}}}void CTsp::Search(){//输出缓冲区char cBuf[256];//每次迭代出动一群蚂蚁,尝试得到更短路径{//每只蚂蚁搜索一遍for (int j=0;j<N_ANT_COUNT;j++){m_cAntAry[j].Search();}//保存最佳结果for (int j=0;j<N_ANT_COUNT;j++){if (m_cAntAry[j].m_dbPathLength < m_cBestAnt.m_dbPathLength){m_cBestAnt=m_cAntAry[j];}}//更新环境信息素UpdateTrial();//输出结果sprintf_s(cBuf,"\n[%d] %.0f",i+1,m_cBestAnt.m_dbPathLength);printf(cBuf);}}9.main函数主文件City.cpp#include "Stdafx.h"#include "Tsp.h"int main(){//初始化随机种子time_t tm;time(&tm);unsigned int nSeed=(unsigned int)tm;srand(nSeed);//旅行商开始搜索CTsp tsp;tsp.InitData();tsp.Search();//输出结果printf("\nThe best tour is :\n\n");for (int i=0;i<N_CITY_COUNT;i++){sprintf_s(cBuf,"%d ",tsp.m_cBestAnt.m_nPath[i]+1);printf(cBuf);}sprintf_s(cBuf,"\n\nThe rand seed is : %d ",nSeed);printf(cBuf);printf("\n\nPress any key to exit!");getchar();return 0;}。