基本蚁群算法
蚁群算法

两阶段算法(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。 解:
满足结束条件?
- 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;}。