一、粒子群算法简介

1 引言
自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都遵循:避免与邻域个体相撞:匹配邻域个体的速度;飞向鸟群中心,且整个群体飞向目标。仿真中仅利用上面三条简单的规则,就可以非常接近地模拟出鸟群飞行的现象。1990年, 生物学家Frank Heppner也提出了鸟类模型, 它的不同之处在于:鸟类被吸引飞到栖息地。在仿真中,一开始每一只鸟都没有特定的飞行目标,只是使用简单的规则确定自己的飞行方向和飞行速度,当有一只鸟飞到栖息地时,它周围的鸟也会跟着飞向栖息地,最终整个鸟群都会落在栖息地。
1995年, 美国社会心理学家James Kennedy和电气工程师RussellEberhart共同提出了粒子群算法(ParticleS warm Optimization, PSO) , 该算法的提出是受对鸟类群体行为进行建模与仿真的研究结果的启发。他们的模型和仿真算法主要对Frank Heppner的模型进行了修正,以使粒子飞向解空间并在最优解处降落。粒子群算法一经提出,由于其算法简单,容易实现,立刻引起了进化计算领域学者们的广泛关注, 形成一个研究热点。2001年出版的J.Kennedy与R.Eberhart合著的《群体智能》将群体智能的影响进一步扩大[] , 随后关于粒子群优化算法的研究报告和研究成果大量涌现,继而掀起了国内外研究热潮[2-7]。
粒子群优化算法来源于鸟类群体活动的规律性,进而利用群体智能建立一个简化的模型。它模拟鸟类的觅食行为,将求解问题的搜索空间比作鸟类的飞行空间,将每只鸟抽象成一个没有质量和体积的粒
子,用它来表征问题的一个可能解,将寻找问题最优解的过程看成鸟类寻找食物的过程,进而求解复杂的优化问题。粒子群优化算法与其他进化算法一样,也是基于“种群”和“进化”的概念,通过个体间
的协作与竞争,实现复杂空间最优解的搜索。同时,它又不像其他进化算法那样对个体进行交叉、变异、选择等进化算子操作,而是将群体中的个体看作在l维搜索空间中没有质量和体积的粒子,每个粒子以一定的速度在解空间运动, 并向自身历史最佳位置P best和邻域历史最佳位置g best聚集, 实现对候选解的进化。粒子群算法具有很好的生物社会背景而易于理解,由于参数少而容易实现,对非线性、多峰问题均具有较强的全局搜索能力,在科学研究与工程实践中得到了广泛关注。目前,该算法已广泛应用于函数优化、神经网络训练、模式分类、模糊控制等领域。

2 粒子群算法理论
2.1粒子群算法描述
鸟类在捕食过程中,鸟群成员可以通过个体之间的信息交流与共享获得其他成员的发现与飞行经历。在食物源零星分布并且不可预测的条件下,这种协作机制所带来的优势是决定性的,远远大于对食物
的竞争所引起的劣势。粒子群算法受鸟类捕食行为的启发并对这种行为进行模仿,将优化问题的搜索空间类比于鸟类的飞行空间,将每只鸟抽象为一个粒子,粒子无质量、无体积,用以表征问题的一个可行解,优化问题所要搜索到的最优解则等同于鸟类寻找的食物源。粒子群算法为每个粒子制定了与鸟类运动类似的简单行为规则,使整个粒子群的运动表现出与鸟类捕食相似的特性,从而可以求解复杂的优化问题。
粒子群算法的信息共享机制可以解释为一种共生合作的行为,即每个粒子都在不停地进行搜索,并且其搜索行为在不同程度上受到群体中其他个体的影响[8],同时这些粒子还具备对所经历最佳位置的记
忆能力,即其搜索行为在受其他个体影响的同时还受到自身经验的引导。基于独特的搜索机制,粒子群算法首先生成初始种群,即在可行解空间和速度空间随机初始化粒子的速度与位置,其中粒子的位置用于表征问题的可行解,然后通过种群间粒子个体的合作与竞争来求解优化问题。
2.2粒子群算法建模
粒子群优化算法源自对鸟群捕食行为的研究:一群鸟在区域中随机搜索食物,所有鸟知道自己当前位置离食物多远,那么搜索的最简单有效的策略就是搜寻目前离食物最近的鸟的周围区域。粒子群算法
利用这种模型得到启示并应用于解决优化问题。在粒子群算法中,每个优化问题的潜在解都是搜索空间中的一只鸟,称之为粒子。所有的粒子都有一个由被优化的函数决定的适应度值,每个粒子还有一个速度决定它们飞翔的方向和距离。然后,粒子们就追随当前的最优粒子在解空间中搜索[9]。

粒子群算法首先在给定的解空间中随机初始化粒子群,待优化问题的变量数决定了解空间的维数。每个粒子有了初始位置与初始速度,然后通过迭代寻优。在每一次迭代中,每个粒子通过跟踪两个“极值”来更新自己在解空间中的空间位置与飞行速度:一个极值就是单个粒子本身在迭代过程中找到的最优解粒子,这个粒子叫作个体极值:另一个极值是种群所有粒子在迭代过程中所找到的最优解粒子,这个粒子是全局极值。上述的方法叫作全局粒子群算法。如果不用种群所有粒子而只用其中一部分作为该粒子的邻居粒子,那么在所有邻居粒子中的极值就是局部极值,该方法称为局部粒子群算法。

2.3粒子群算法的特点
粒子群算法本质是一种随机搜索算法,它是一种新兴的智能优化技术。该算法能以较大概率收敛于全局最优解。实践证明,它适合在动态、多目标优化环境中寻优,与传统优化算法相比,具有较快的计
算速度和更好的全局搜索能力。
(1)粒子群算法是基于群智能理论的优化算法,通过群体中粒子间的合作与竞争产生的群体智能指导优化搜索。与其他算法相比,粒子群算法是一种高效的并行搜索算法。
(2)粒子群算法与遗传算法都是随机初始化种群,使用适应值来评价个体的优劣程度和进行一定的随机搜索。但粒子群算法根据自己的速度来决定搜索,没有遗传算法的交叉与变异。与进化算法相比,粒子群算法保留了基于种群的全局搜索策略,但是其采用的速度-位移模型操作简单,避免了复杂的遗传操作。
(3)由于每个粒子在算法结束时仍保持其个体极值,即粒子群算法除了可以找到问题的最优解外,还会得到若干较好的次优解,因此将粒子群算法用于调度和决策问题可以给出多种有意义的方案。
(4)粒子群算法特有的记忆使其可以动态地跟踪当前搜索情况并调整其搜索策略。另外,粒子群算法对种群的大小不敏感,即使种群数目下降时,性能下降也不是很大。

3 粒子群算法种类
3.1基本粒子群算法
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_搜索
3.2标准粒子群算法
引入研究粒子群算法经常用到的两个概念:一是“探索”,指粒子在一定程度上离开原先的搜索轨迹,向新的方向进行搜索,体现了一种向未知区域开拓的能力,类似于全局搜索;二是“开发”,指粒子在一定程度上继续在原先的搜索轨迹上进行更细一步的搜索,主要指对探索过程中所搜索到的区域进行更进一步的搜索。探索是偏离原来的寻优轨迹去寻找一个更好的解,探索能力是一个算法的全局搜索能力。开发是利用一个好的解,继续原来的寻优轨迹去搜索更好的解,它是算法的局部搜索能力。如何确定局部搜索能力和全局搜索能力的比例, 对一个问题的求解过程很重要。1998年, Shi Yuhui等人提出了带有惯性权重的改进粒子群算法[10],由于该算法能够保证较好的收敛效果,所以被默认为标准粒子群算法。其进化过程为:
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_02
在式(6.7)中,第一部分表示粒子先前的速度,用于保证算法的全局收敛性能;第二部分、第三部分则使算法具有局部收敛能力。可以看出,式(6.7)中惯性权重w表示在多大程度上保留原来的速度:W
较大,则全局收敛能力较强,局部收敛能力较弱;w较小,则局部收敛能力较强,全局收敛能力较弱。
当w=1时,式(6.7)与式(6.5)完全一样,表明带惯性权重的粒子群算法是基本粒子群算法的扩展。实验结果表明:w在0.8~1.2之间时,粒子群算法有更快的收敛速度;而当w>1.2时,算法则容易陷入局部极值。
另外,在搜索过程中可以对w进行动态调整:在算法开始时,可给w赋予较大正值,随着搜索的进行,可以线性地使w逐渐减小,这样可以保证在算法开始时,各粒子能够以较大的速度步长在全局范围内探
测到较好的区域;而在搜索后期,较小的w值则保证粒子能够在极值点周围做精细的搜索,从而使算法有较大的概率向全局最优解位置收敛。对w进行调整,可以权衡全局搜索和局部搜索能力。目前,采用较多的动态惯性权重值是Shi提出的线性递减权值策略, 其表达式如下:
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_搜索_03
3.3压缩因子粒子群算法
Clerc等人提出利用约束因子来控制系统行为的最终收敛[11] , 该方法可以有效搜索不同的区域,并且能得到高质量的解。压缩因子法的速度更新公式为:
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_其他_04
实验结果表明:与使用惯性权重的粒子群优化算法相比,使用具
有约束因子的粒子群算法具有更快的收敛速度。
3.4离散粒子群算法
基本的粒子群算法是在连续域中搜索函数极值的有力工具。继基本粒子群算法之后, Kennedy和Eberhart又提出了一种离散二进制版的粒子群算法[12]。在此离散粒子群方法中,将离散问题空间映射到连续粒子运动空间,并适当修改粒子群算法来求解,在计算上仍保留经典粒子群算法速度-位置更新运算规则。粒子在状态空间的取值和变化只限于0和1两个值, 而速度的每一维vi y代表位置每一位xi取值为1的可能性。因此, 在连续粒子群中的vij更新公式依然保持不变, 但是P best和:best只在[0, 1] 内取值。其位置更新等式表示如下:
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_蚁群算法_05
4 粒子群算法流程
粒子群算法基于“种群”和“进化”的概念,通过个体间的协作与竞争,实现复杂空间最优解的搜索[13],其流程如下:
(1)初始化粒子群,包括群体规模N,每个粒子的位置x;和速度Vio
(2) 计算每个粒子的适应度值fit[i] 。
(3) 对每个粒子, 用它的适应度值fit[门和个体极值P best(i)比较。如果fit[i] <P best(i) , 则用fit[i] 替换掉P best(i) 。
(4) 对每个粒子, 用它的适应度值fit[i] 和全局极值g best比较。如果fit[i] < 8 best, 则用fit[i] 替换g best。
(5)迭代更新粒子的速度v;和位置xj。
(6)进行边界条件处理。
(7)判断算法终止条件是否满足:若是,则结束算法并输出优化结果;否则返回步骤(2)。
粒子群算法的运算流程如图6.1所示。
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_蚁群算法_06
5 关键参数说明
在粒子群优化算法中,控制参数的选择能够影响算法的性能和效率;如何选择合适的控制参数使算法性能最佳,是一个复杂的优化问题。在实际的优化问题中,通常根据使用者的经验来选取控制参数。
粒子群算法的控制参数主要包括:粒子种群规模N,惯性权重w,加速系数c和c, 最大速度Via x, 停止准则, 邻域结构的设定, 边界条件处理策略等[14],
粒子种群规模N
粒子种群大小的选择视具体问题而定,但是一般设置粒子数为20~50。对于大部分的问题10个粒子,已经可以取得很好的结果:不过对于比较难的问题或者特定类型的问题,粒子的数量可以取到100或
200。另外,粒子数目越大,算法搜索的空间范围就越大,也就更容易发现全局最优解;当然,算法运行的时间也越长。
惯性权重w
惯性权重w是标准粒子群算法中非常重要的控制参数,可以用来控制算法的开发和探索能力。惯性权重的大小表示了对粒子当前速度继承的多少。当惯性权重值较大时,全局寻优能力较强,局部寻优能力
较弱:当惯性权重值较小时,全局寻优能力较弱,局部寻优能力较强。惯性权重的选择通常有固定权重和时变权重。固定权重就是选择常数作为惯性权重值,在进化过程中其值保持不变,一般取值为
[0.8,1.2]:时变权重则是设定某一变化区间,在进化过程中按照某种方式逐步减小惯性权重。时变权重的选择包括变化范围和递减率。固定的惯性权重可以使粒子保持相同的探索和开发能力,而时变权重可以使粒子在进化的不同阶段拥有不同的探索和开发能力。
加速常数c1和c2
加速常数c和c 2分别调节向P best和g best方向飞行的最大步长, 它们分别决定粒子个体经验和群体经验对粒子运行轨迹的影响,反映粒子群之间的信息交流。如果cr=c2=0,则粒子将以当前的飞行速度飞到边界。此时,粒子仅能搜索有限的区域,所以难以找到最优解。如果q=0,则为“社会”模型,粒子缺乏认知能力,而只有群体经验,它的收敛速度较快,但容易陷入局部最优;如果oy=0,则为“认知”模
型,没有社会的共享信息,个体之间没有信息的交互,所以找到最优解的概率较小,一个规模为D的群体等价于运行了N个各行其是的粒子。因此一般设置c1=C2,通常可以取c1=cg=1.5。这样,个体经验和群体经验就有了同样重要的影响力,使得最后的最优解更精确。
粒子的最大速度vmax
粒子的速度在空间中的每一维上都有一个最大速度限制值vd max,用来对粒子的速度进行钳制, 使速度控制在范围[-Vimax, +va max] 内,这决定问题空间搜索的力度, 该值一般由用户自己设定。Vmax是一个非常重要的参数,如果该值太大,则粒子们也许会飞过优秀区域:而如果该值太小,则粒子们可能无法对局部最优区域以外的区域进行充分的探测。它们可能会陷入局部最优,而无法移动足够远的距离而跳出局部最优, 达到空间中更佳的位置。研究者指出, 设定Vmax和调整惯性权重的作用是等效的, 所以!max一般用于对种群的初始化进行设定, 即将vmax设定为每维变量的变化范围, 而不再对最大速度进行细致的选择和调节。
停止准则
最大迭代次数、计算精度或最优解的最大停滞步数▲t(或可以接受的满意解)通常认为是停止准则,即算法的终止条件。根据具体的优化问题,停止准则的设定需同时兼顾算法的求解时间、优化质量和
搜索效率等多方面性能。
邻域结构的设定
全局版本的粒子群算法将整个群体作为粒子的邻域,具有收敛速度快的优点,但有时算法会陷入局部最优。局部版本的粒子群算法将位置相近的个体作为粒子的邻域,收敛速度较慢,不易陷入局部最优
值。实际应用中,可先采用全局粒子群算法寻找最优解的方向,即得到大致的结果,然后采用局部粒子群算法在最优点附近进行精细搜索。
边界条件处理
当某一维或若干维的位置或速度超过设定值时,采用边界条件处理策略可将粒子的位置限制在可行搜索空间内,这样能避免种群的膨胀与发散,也能避免粒子大范围地盲目搜索,从而提高了搜索效率。
具体的方法有很多种, 比如通过设置最大位置限制Xmax和最大速度限制Vmax, 当超过最大位置或最大速度时, 在范围内随机产生一个数值代替,或者将其设置为最大值,即边界吸收。

二、蚁群算法简介

1 引言
在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法。其中, 模拟蚁群觅食过程的蚁群优化算法(Ant
Colony Optimization, A CO) 和模拟鸟群运动方式的粒子群算法(ParticleS warm Optimization,PSO) 是两种最主要的群智能算法。
蚁群算法是一种源于大自然生物世界的新的仿生进化算法,由意大利学者M.Dorigo, V.Mani ezzo和A.Color ni等人于20世纪90年代初期通过模拟自然界中蚂蚁集体寻径行为而提出的一种基于种群的启发式随机搜索算法[1].蚂蚁有能力在没有任何提示的情形下找到从巢穴到食物源的最短路径,并且能随环境的变化,适应性地搜索新的路径,产生新的选择。其根本原因是蚂蚁在寻找食物时,能在其走过的路径上释放一种特殊的分泌物――信息素2,随着时间的推移该物质会逐渐挥发,后来的蚂蚁选择该路径的概率与当时这条路径上信息素的强度成正比。当一条路径上通过的蚂蚁越来越时,其留下的信息素也越来越多,后来蚂蚁选择该路径的概率也就越高,从而更增加了该路径上的信息素强度。而强度大的信息素会吸引更多的蚂蚁,从而形成一种正反馈机制。通过这种正反馈机制,蚂蚁最终可以发现最短路径。
最早的蚁群算法是蚂蚁系统(Ant System, AS) , 研究者们根据不同的改进策略对蚂蚁系统进行改进并开发了不同版本的蚁群算法,并成功地应用于优化领域。用该方法求解旅行商(TSP) 问题、分配问
题、车间作业调度(job-shop) 问题, 取得了较好的试验结果[3-6] 。蚁群算法具有分布式计算、无中心控制和分布式个体之间间接通信等特征,易于与其他优化算法相结合,它通过简单个体之间的协作表现出了求解复杂问题的能力,已被广泛应用于求解优化问题。蚁群算法相对而言易于实现,且算法中并不涉及复杂的数学操作,其处理过程对计算机的软硬件要求也不高,因此对它的研究在理论和实践中都具有重要的意义。
目前,国内外的许多研究者和研究机构都开展了对蚁群算法理论和应用的研究,蚁群算法已成为国际计算智能领域关注的热点课题。虽然目前蚁群算法没有形成严格的理论基础,但其作为一种新兴的进
化算法已在智能优化等领域表现出了强大的生命力。

2 蚁群算法理论
蚁群算法是对自然界蚂蚁的寻径方式进行模拟而得出的一种仿生算法。蚂蚁在运动过程中,能够在它所经过的路径上留下信息素进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此来指导
自己的运动方向。因此,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大[7]。
2.1真实蚁群的觅食过程
为了说明蚁群算法的原理,先简要介绍一下蚂蚁搜寻食物的具体过程。在自然界中,蚁群在寻找食物时,它们总能找到一条从食物到巢穴之间的最优路径。这是因为蚂蚁在寻找路径时会在路径上释放出
一种特殊的信息素。蚁群算法的信息交互主要是通过信息素来完成的。蚂蚁在运动过程中,能够感知这种物质的存在和强度。初始阶段,环境中没有信息素的遗留,蚂蚁寻找事物完全是随机选择路径,
随后寻找该事物源的过程中就会受到先前蚂蚁所残留的信息素的影响,其表现为蚂蚁在选择路径时趋向于选择信息素浓度高的路径。同时,信息素是一种挥发性化学物,会随着时间的推移而慢慢地消逝。如果每只蚂蚁在单位距离留下的信息素相同,那对于较短路径上残留的信息素浓度就相对较高,这被后来的蚂蚁选择的概率就大,从而导致这条短路径上走的蚂蚁就越多。而经过的蚂蚁越多,该路径上残留的信息素就将更多,这样使得整个蚂蚁的集体行为构成了信息素的正反馈过程,最终整个蚁群会找出最优路径。
若蚂蚁从A点出发,速度相同,食物在D点,则它可能随机选择路线ABD或A CD。假设初始时每条路线分配一只蚂蚁, 每个时间单位行走一步。图5.1所示为经过8个时间单位时的情形:走路线ABD的蚂蚁到达终点:而走路线A CD的蚂蚁刚好走到C点, 为一半路程。
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_07
图5.2表示从开始算起, 经过16个时间单位时的情形:走路线ABD的蚂蚁到达终点后得到食物又返回了起点A,而走路线A CD的蚂蚁刚好走到D点.
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_08
图5.2蚂蚁出发后经过16个时间单位时的情形
假设蚂蚁每经过一处所留下的信息素为1个单位,则经过32个时间单位后,所有开始一起出发的蚂蚁都经过不同路径从D点取得了食物。此时ABD的路线往返了2趟, 每一处的信息素为4个单位; 而A CD的路线往返了一趟,每一处的信息素为2个单位,其比值为2:1。
寻找食物的过程继续进行, 则按信息素的指导, 蚁群在ABD路线上增派一只蚂蚁(共2只) , 而A CD路线上仍然为一只蚂蚁。再经过32个时间单位后,两条线路上的信息素单位积累为12和4,比值为3:1。若按以上规则继续, 蚁群在ABD路线上再增派一只蚂蚁(共3只) , 而A CD路线上仍然为一只蚂蚁。再经过32个时间单位后, 两条线路上的信息素单位积累为24和6,比值为4:1.若继续进行, 则按信息素的指导, 最终所有的蚂蚁都会放弃A CD路线, 而选择ABD路线。这也就是前面所提到的正反馈效应。

2.2人工蚁群的优化过程
基于以上真实蚁群寻找食物时的最优路径选择问题,可以构造人工蚁群, 来解决最优化问题, 如TSP问题。人工蚁群中把具有简单功能的工作单元看作蚂蚁。二者的相似之处在于都是优先选择信息素浓度大的路径。较短路径的信息素浓度高,所以能够最终被所有蚂蚁选择,也就是最终的优化结果。两者的区别在于人工蚁群有一定的记忆能力,能够记忆已经访问过的节点。同时,人工蚁群再选择下一条路径的时候是按一定算法规律有意识地寻找最短路径,而不是盲目的。例如在TSP问题中, 可以预先知道当前城市到下一个目的地的距离。在TSP问题的人工蚁群算法中, 假设m只蚂蚁在图的相邻节点间移动,从而协作异步地得到问题的解。每只蚂蚁的一步转移概率由图中的每条边上的两类参数决定:一是信息素值,也称信息素痕迹:二是可见度,即先验值。
信息素的更新方式有两种:一是挥发,也就是所有路径上的信息素以一定的比率减少,模拟自然蚁群的信息素随时间挥发的过程;二是增强,给评价值“好”(有蚂蚁走过)的边增加信息素。蚂蚁向下一个目标的运动是通过一个随机原则来实现的,也就是运用当前所在节点存储的信息,计算出下一步可达节点的概率,并按此概率实现一步移动,如此往复,越来越接近最优解。蚂蚁在寻找过程中,或在找到一个解后,会评估该解或解的一部分的优化程度,并把评价信息保存在相关连接的信息素中。

2.3真实蚂蚁与人工蚂蚁的异同
蚁群算法是一种基于群体的、用于求解复杂优化问题的通用搜索技术。与真实蚂蚁通过外信息的留存、跟随行为进行间接通信相似,蚁群算法中一群简单的人工蚂蚁通过信息素进行间接通信,并利用该信息和与问题相关的启发式信息逐步构造问题的解。
人工蚂蚁具有双重特性:一方面,它们是真实蚂蚁的抽象,具有真实蚂蚁的特性:另一方面,它们还有一些真实蚂蚁没有的特性,这些新的特性使人工蚂蚁在解决实际优化问题时,具有更好地搜索较优解的能力。
人工蚂蚁与真实蚂蚁的相同点为:
(1)都是一群相互协作的个体。与真实蚁群一样,蚁群算法由一群人工蚂蚁组成,人工蚂蚁之间通过同步/异步协作来寻找问题的最优解。虽然单只人工蚂蚁可以构造出问题的解,但只有当多只人工蚂蚁
通过相互协作,才能发现问题的最优(次优)解。人工蚂蚁个体间通过写/读问题的状态变量来进行协作。
(2)都使用信息素的迹和蒸发机制。如真实蚂蚁一样,人工蚂蚁通过改变所访问过的问题的数字状态信息来进行间接的协作。在蚁群算法中,信息素是人工蚂蚁之间进行交流的唯一途径。这种通信方式在群体知识的利用上起到了至关重要的作用。另外,蚁群算法还用到了蒸发机制,这一点对应于真实蚂蚁中信息素的蒸发现象。蒸发机制使蚁群逐渐忘记过去的历史,使后来的蚂蚁在搜索中较少受到过去较差解的影响,从而更好地指导蚂蚁的搜索方向。
(3)搜索最短路径与局部移动。人工蚂蚁和真实蚂蚁具有相同的任务,即以局部移动的方式构造出从原点(蚁巢)到目的点(食物源)之间的最短路径。
(4)随机状态转移策略。人工蚂蚁和真实蚂蚁都按照概率决策规则从一种状态转移到另一种相邻状态。其中的概率决策规则是与问题相关的信息和局部环境信息的函数。在状态转移过程中,人工蚂蚁和
真实蚂蚁都只用到了局部信息,没有使用前瞻策略来预见将来的状态。
人工蚂蚁和真实蚂蚁的不同点为:
(1)人工蚂蚁生活在离散的时间,从一种离散状态到另一种离散状态。
(2)人工蚂蚁具有内部状态,即人工蚂蚁具有一定的记忆能力,能记住自己走过的地方。
(3)人工蚂蚁释放信息素的数量是其生成解的质量的函数。
(4)人工蚂蚁更新信息素的时机依赖于特定的问题。例如,大多数人工蚂蚁仅仅在蚂蚁找到一个解之后才更新路径上的信息素。

2.4蚁群算法的特点
蚁群算法是通过对生物特征的模拟得到的一种优化算法,它本身具有很多优点:
(1)蚁群算法是一种本质上的并行算法。每只蚂蚁搜索的过程彼此独立,仅通过信息激素进行通信。所以蚁群算法可以看作一个分布式的多智能体系统,它在问题空间的多点同时开始独立的解搜索,不仅增加了算法的可靠性,也使得算法具有较强的全局搜索能力。
(2)蚁群算法是一种自组织的算法。所谓自组织,就是组织力或组织指令来自于系统的内部,以区别于其他组织。如果系统在获得空间、时间或者功能结构的过程中,没有外界的特定干预,就可以说系统是自组织的。简单地说,自组织就是系统从无序到有序的变化过程。
(3)蚁群算法具有较强的鲁棒性。相对于其他算法,蚁群算法对初始路线的要求不高,即蚁群算法的求解结果不依赖于初始路线的选择,而且在搜索过程中不需要进行人工的调整。此外,蚁群算法的参
数较少,设置简单,因而该算法易于应用到组合优化问题的求解。
(4)蚁群算法是一种正反馈算法。从真实蚂蚁的觅食过程中不难看出,蚂蚁能够最终找到最优路径,直接依赖于其在路径上信息素的堆积,而信息素的堆积是一个正反馈的过程。正反馈是蚁群算法的重
要特征,它使得算法进化过程得以进行。

3 基本蚁群算法及其流程
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_蚁群算法_09
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_10
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_其他_11
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_其他_12
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_13
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_蚁群算法_14
4 改进的蚁群算法
针对基本蚁群算法一般需要较长的搜索时间和容易出现停滞现象等不足,很多学者在此基础上提出改进算法,提高了算法的性能和效率。
4.1精英蚂蚁系统
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_15
4.2 最大最小蚂蚁系统
为了克服基本蚁群系统中可能出现的停滞现象, Thomas Stutz le等人提出了最大-最小(MAX-MIN) 蚁群系统[10] , 主要有三方面的不同:
(1)与蚁群系统相似,为了充分利用循环最优解和目前为止找出的最优解,在每次循环之后,只有一只蚂蚁进行信息素更新。这只蚂蚁可能是找出当前循环中最优解的蚂蚁(迭代最优的蚂蚁),也可能是找出从实验开始以来最优解的蚂蚁(全局最优的蚂蚁);而在蚂蚁系统中,对所有蚂蚁走过的路径都进行信息素更新。
(2) 为避免搜索的停滞, 在每个解元素(TSP中是每条边) 上的信息素轨迹量的值域范围被限制在[min,Tmax] 区间内; 而在蚂蚁系统中信息素轨迹量不被限制,使得一些路径上的轨迹量远高于其他边,从而蚂蚁都沿着同条路径移动,阻止了进一步搜索更优解的行为。
(3)为使蚂蚁在算法的初始阶段能够更多地搜索新的解决方案,将信息素初始化为tmax;而在蚂蚁系统中没有这样的设置。

4.3基于排序的蚁群算法
基于排序的蚁群算法(Rank-BasedAntSystem)是Bull n heimer、Hartl和Strauss等人提出的[11] 。在该算法中, 每个蚂蚁释放的信息素按照它们不同的等级进行挥发,另外类似于精英蚁群算法,精英蚂蚁在每次循环中释放更多的信息素。在修改信息素路径前,蚂蚁按照它们的旅行长度进行排名(短的靠前),蚂蚁释放信息素的量要和蚂蚁的排名相乘。在每次循环中,只有排名前w-1位的蚂蚁和精英蚂蚁才允许在路径上释放信息素。己知的最优路径给以最强的反馈,和系数w相乘;而排名第r位的蚂蚁则乘以系数“w-(≥0)。信息素如下式所示:
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_16
4.4自适应蚁群算法
基本蚁群系统让信息量最大的路径对每次路径的选择和信息量的更新起主要作用,但由于强化了最优信息反馈,就可能导致“早熟”停滞现象。而最大最小蚁群算法将各个路径上的信息量的更新限定在固定的范围内,这虽然在一定程度上避免了“早熟”停滞现象,但在解分布较分散时会导致收敛速度变慢。以上方法的共同缺点在于:它们都按一种固定不变的模式去更新信息量和确定每次路径的选
择概率。
为了克服以上算法的不足, L.M.Gambardella和M.Dorigo提出了基于调节信息素挥发度的自适应蚁群算法[12]。相对基本蚁群算法的改进如下:
(1)在每次循环结束后求出最优解,并将其保留。
(2)自适应地改变p值。当问题规模比较大时,由于信息量的挥发系数p的存在,使那些从未被搜索到的信息量会减小到接近于0,降低了算法的全局搜索能力;当p过大且解的信息量增大时,以前搜索过的解被选择的可能性过大,也会影响到算法的全局搜索能力;通过减小p虽然可以提高算法的全局搜索能力,但又会使算法的收敛速度降低。因此可以自适应地改变p的值。p的初始值p(to)=1;当算法求得的最优值在N次循环内没有明显改进时,p减为:
【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_17
5 关键参数说明
在蚁群算法中,不仅信息素和启发函数乘积以及蚂蚁之间的合作行为会严重影响到算法的收敛性,蚁群算法的参数也是影响其求解性能和效率的关键因素。信息素启发式因子α、期望启发因子β、信息
素蒸发系数p、信息素强度Q、蚂蚁数目m等都是非常重要的参数,其选取方法和选取原则直接影响到蚁群算法的全局收敛性和求解效率。
信息素启发式因子a
信息素启发式因子a代表信息量对是否选择当前路径的影响程度,即反映蚂蚁在运动过程中所积累的信息量在指导蚁群搜索中的相对重要程度。a的大小反映了蚁群在路径搜索中随机性因素作用的强度,其值越大,蚂蚁在选择以前走过的路径的可能性就越大,搜索的随机性就会减弱;而当启发式因子a的值过小时,则易使蚁群的搜索过早陷于局部最优。根据经验,信息素启发式因子a取值范围一般为[1,4]时,蚁群算法的综合求解性能较好。
期望启发因子β
期望启发因子β表示在搜索时路径上的信息素在指导蚂蚁选择路径时的向导性,它的大小反映了蚁群在搜索最优路径的过程中的先验性和确定性因素的作用强度。期望启发因子β的值越大,蚂蚁在某个局部点上选择局部最短路径的可能性就越大,虽然这个时候算法的收敛速度得以加快,但蚁群搜索最优路径的随机性减弱,而此时搜索易于陷入局部最优解。根据经验,期望启发因子β取值范围一般为[3,
5],此时蚁群算法的综合求解性能较好。实际上,信息素启发式因子α和期望启发因子β是一对关联性很强的参数:蚁群算法的全局寻优性能,首先要求蚁群的搜索过程必须要有很强的随机性;而蚁群算法的快速收敛性能,又要求蚁群的搜索过程必须要有较高的确定性。因此,两者对蚁群算法性能的影响和作用是相互配合、密切相关的,算法要获得最优解,就必须在这二者之间选取一个平衡点,只有正确选定它们之间的搭配关系,才能避免在搜索过程中出现过早停滞或陷入局部最优等情况的发生。
信息素蒸发系数p
蚁群算法中的人工蚂蚁是具有记忆功能的,随着时间的推移,以前留下的信息素将会逐渐消逝,蚁群算法与其他各种仿生进化算法一样,也存在着收敛速度慢、容易陷入局部最优解等缺陷,而信息素蒸
发系数p大小的选择将直接影响到整个蚁群算法的收敛速度和全局搜索性能。在蚁群算法的抽象模型中,p表示信息素蒸发系数,1-p则表示信息素持久性系数。因此,p的取值范围应该是0~1之间的一个
数,表示信息素的蒸发程度,它实际上反映了蚂蚁群体中个体之间相互影响的强弱。p过小时,则表示以前搜索过的路径被再次选择的可能性过大,会影响到算法的随机性能和全局搜索能力:p过大时,说
明路径上的信息素挥发的相对变多,虽然可以提高算法的随机搜索性能和全局搜索能力,但过多无用搜索操作势必会降低算法的收敛速度。
蚂蚁数目m
蚁群算法是一种随机搜索算法,与其他模拟进化算法一样,通过多个候选解组成的群体进化过程来寻求最优解,在该过程中不仅需要每个个体的自适应能力,更需要群体之间的相互协作能力。蚁群在搜
索过程中之所以表现出复杂有序的行为,是因为个体之间的信息交流与相互协作起着至关重要的作用。
对于旅行商问题,单个蚂蚁在一次循环中所经过的路径,表现为问题可行解集中的一个解,m只蚂蚁在一次循环中所经过的路径,则表现为问题解集中的一个子集。显然,子集增大(即蚂蚁数量增多),可以提高蚁群算法的全局搜索能力以及算法的稳定性;但蚂蚁数目增大后,会使大量的曾被搜索过的解(路径)上的信息素的变化趋于平均,信息正反馈的作用不明显,虽然搜索的随机性得到了加强,但收敛速度减慢;反之,子集较小(蚂蚁数量少),特别是当要处理的问题规模比较大时,会使那些从来未被搜索到的解(路径)上的信息素减小到接近于0,搜索的随机性减弱,虽然收敛速度加快了,但会使算法的全局性能降低,算法的稳定性差,容易出现过早停滞现象。m一般取10~50.
信息素强度Q对算法性能的影响
在蚁群算法中,各个参数的作用实际上是紧密联系的,其中对算法性能起着主要作用的是信息启发式因子α、期望启发式因子β和信息素挥发因子p这三个参数,总信息量(对算法性能的影响有赖于上述三个参数的选取, 以及算法模型的选取。例如, 在ant-cycle模型和ant-quantity模型中, 总信息量4所起的作用显然是有很大差异的, 即随着问题规模的不同,其影响程度也将不同。相关人员研究结果表
明:总信息量Q对ant-cycle模型蚁群算法的性能没有明显的影响。因此,在算法参数的选择上,参数Q不必作特别的考虑,可以任意选取。
最大进化代数G
最大进化代数6是表示蚁群算法运行结束条件的一个参数,表示蚁群算法运行到指定的进化代数之后就停止运行,并将当前群体中的最佳个体作为所求问题的最优解输出。一般6取100~500。

三、部分源代码

clc
clear
close all
E=0.000001;
maxnum=30;%最大迭代次数
narvs=3;%目标函数的自变量个数
particlesize=20;%粒子群规模
c1=1.2;%每个粒子的个体学习因子,加速度常数
c2=1.6;%每个粒子的社会学习因子,加速度常数
w=0.8;%惯性因子
vmax1=0.5;%粒子的最大飞翔速度
vamx2=-0.5;
v=rand(particlesize,narvs);%粒子飞翔速度
x=zeros(particlesize,3);
x(:,1)=1+rand(1);
x(:,2)=7+rand(1);%粒子所在位置
x(:,3)=0.2+0.1*rand(1);
%定义适应度函数
% ROUT=zeros(particlesize,100);
for i=1:particlesize
    [TT(i),ROUT{i},f(i)]=ACO(x(i,1),x(i,2),x(i,3));
end
personalbest_x=x;
personalbest_faval=f;
% personalbest_faval=TT;
[globalbest_faval(1),i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
globalbest_route=ROUT{i};
ff(1)=globalbest_faval(1);
k=2;
w
 
route=globalbest_route;
[minkl,p]=min(globalbest_faval);
xbest=globalbest_x(p,:);
LENROUT=length(route);
disp(['Alpha 表征信息素重要程度的参数=',num2str(xbest(1))]);
disp(['Beta 表征启发式因子重要程度的参数=',num2str(xbest(2))]);
disp(['Rho 信息素蒸发系数=',num2str(xbest(3))]);
disp(sprintf('Shortroad is: %s',num2str(route)));
disp(sprintf('Mininum is: %d',minkl));
 
figure(2)
% set(gcf,'color','white');
plot(1:length(ff),ff)
title('粒子群蚁群算法收敛曲线变化趋势')
xlabel('迭代次数');
ylabel('适应度值');
 
first_address = [
    100,10
    150,10
    170,30
    180,20
    200,10
    200,100
    200,150
    190,180
    180,200
    160,200
    170,180
    140,180
    135,200
    130,180
    100,200
    125,100
    200,300
    10,300
    10,200
    10,180
    10,100
    10,10
    50,30
    100,10
    ];%first_address表示测试数据中的节点坐标
SumOfCity = size(first_address,1);%节点个数,实际返回行数,即为节点个数
length_address =0.*ones(SumOfCity,SumOfCity);%length_address表示两两节点间的距离,初始设定10000,可以设定无穷大,表示不相连
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
length_address(1,2)=194.0;%表示节点1和节点2的COST值
length_address(2,3)=64.9;%
length_address(3,4)=20.0;%
length_address(4,5)=18.6;
length_address(2,5)=72.4;
length_address(5,6)=123.4;
length_address(6,7)=35.5;
length_address(7,8)=32.4;
length_address(8,9)=45.0;
length_address(9,10)=51.4;
length_address(10,13)=271.2;
length_address(13,15)=100.0;
length_address(15,19)=189.5;
length_address(8,11)=293.9;
length_address(11,12)=100.0;
length_address(12,14)=4.1;
length_address(14,20)=192.9;
length_address(14,15)=86.8;
length_address(10,12)=87.0;
length_address(6,16)=600.0;
length_address(16,21)=279.3;
length_address(7,17)=92.0;
length_address(17,18)=464.9;
length_address(18,19)=46.0;
length_address(19,20)=44.6;
length_address(20,21)=67.5;
length_address(21,22)=230.3;
length_address(22,23)=102.9;
length_address(23,24)=126.9;
length_address(22,24)=262.5;
 
for   n=1:size(first_address)
    for m=1:size(first_address)
        if length_address(n,m)~=0
            length_address(m,n)=length_address(n,m);   %对称矩阵
        end
    end
end
MM=size(length_address,1);
% 画出节点分布图形
figure;
grid on;
hold on;
title (strcat('井下机车最短运输路径',date))
%title( sprintf('井下机车最短运输路径 Event occured at %s',datestr (date ,15)));
for i=1:MM-1
    plot(first_address(i,1),first_address(i,2),'bo','MarkerSize',10);
    str=num2str(i);
    text(first_address(i,1)-5,first_address(i,2)+5,str,'Color','red','FontSize',12);
end
% m=length(route);
for i=1:LENROUT
    plot(first_address(route(i),1),first_address(route(i),2),'MarkerSize',10,'MarkerEdgeColor','k','MarkerFaceColor',[0.5,0.5,0.5])  ;
    hold on;
end
for i=1:MM
    for j=1:MM
        if(length_address(i,j)~=0)
            line([first_address(i,1),first_address(j,1)],[first_address(i,2),first_address(j,2)],'Color','g','LineWidth',3);%划线
            text((first_address(i,1)+first_address(j,1))/2,(first_address(i,2)+first_address(j,2))/2,num2str(length_address(i,j)));%标注线段距离
        end
    end
end
%% 最短路径
for p=1:LENROUT-1
    if(route(p+1)~=24)
        line([first_address(route(p),1),first_address(route(p+1),1)],[first_address(route(p),2),first_address(route(p+1),2)],'Color','r','LineWidth',3);%划线
        text((first_address(route(p),1)+first_address(route(p+1),1))/2,(first_address(route(p),2)+first_address(route(p+1),2))/2,num2str(length_address(route(p),route(p+1))));%标注线段距离
    else
        line([first_address(route(p),1),first_address(1,1)],[first_address(route(p),2),first_address(1,2)],'Color','r','LineWidth',3);%划线
        text((first_address(route(p),1)+first_address(1,1))/2,(first_address(route(p),2)+first_address(1,2))/2,num2str(length_address(route(p),route(p+1))));%标注线段距离
    end
end
axis([0 250 0 400])
% 图形显示最优及平均函数值变化趋势
%  figure(2);
%  plot( minPL);
%  title('迭代优化过程');
%  xlabel('迭代次数');
%  ylabel('Cost');
%  hold on;

三、运行结果

【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】_粒子群算法_18

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.