当前位置: 首页 > 科技观察

蚁群算法理论与实战攻略

时间:2023-03-18 02:10:17 科技观察

几年前读研究生的时候,学院里有个教授,专门研究蚁群算法。他很好,偶尔学一点。感觉也是生物智能的一种体现,类似于遗传算法和神经网络。只是当时没有实际学习的必要,所以没有去研究。最近有一个这样的任务,所以自己把基础学好,驱动学习,目标明确,所以接受和理解还是比较快的,然后写代码实现。今天,我将带领大家走近TSP问题和蚁群算法。1.关于旅行商(TSP)问题及其派生旅行商问题(TSP)是车辆路径问题(VRP)的一个特例。既然数学家已经证明了TSP问题是一个NP问题,那么VRP也是一个NP问题。.旅行商问题(TSP)又译为旅行商问题和推销员问题,简称TSP问题。这是最基本的路由问题。,***回原点的最小路径开销。——旅行商问题百科全书很显然,当节点数少的时候,大多数人会认为问题很简单,直接穷举就可以了,但在实际问题中,节点数往往太大而变得不可能的。例如:对于一个只有16个城市的旅行商问题,如果采用穷举法求问题的最优解,需要比较的可行解为:15!/2=653,837,184,000。1993年,在当时的工作站上用穷举法解决这个问题用了92个小时。即使现在的电脑再快,也还是不足以面对复杂的问题。这就是所谓的“组合爆炸”,指数增长,所以科学家们逐渐寻找近似算法或启发式算法,其目的是在合理的时间范围内找到可接受的最优解。TSP问题求解算法的发展可分为三个部分:1)。经典精确算法:穷举法、线性规划算法、动态规划算法、分支定界算法等运筹学中的传统算法,这些算法的复杂度一般都非常大,只适合解决小规模问题。2).逼近算法:当问题规模很大时,需要的时间会呈指数增长,这是我们无法接受的。解决问题的算法规模受到很大限制。一个很自然的想法就是牺牲准确率解决方案中的准确率是找到一个我们可以容忍的时间复杂度好的算法,同时解决方案的质量是我们可以接受的。基于这种思想设计的算法统称为近似算法。如插入算法、最近邻算法等。3).智能算法:随着科学技术和生产的不断发展,很多实际问题不可能在合理的时间范围内找到全局最优解,这促使了现代优化问题求解方法的出现。随着具有不同搜索机制的启发式算法的出现,如禁忌搜索、遗传算法、模拟退火算法、人工神经网络、进化策略、进化规划、粒子群优化算法、蚁群优化算法和免疫计算等,掀起了高潮启发式算法的研究。各个算法就不详细介绍了,大家可以找对应的资料了解一下。在实际生产生活中,TSP问题与实际环境差异较大,衍生出很多经典问题。VehicleRoutingScheduling(VRP)扩展问题是通过在经典VRP上添加各种约束而形成的。例如,需求约束形成的需求随机车辆路径问题(SVRP);添加时间约束得到的带时间窗的车辆路径问题(VRPTW);通过添加距离约束的距离约束车辆路径问题(DVRP);根据其他条件,还有多配送中心车辆路径问题(MDVRP)、可分段车辆路径问题(SDVRP);先发货后收货车辆路径问题(VRPB)、配送收货车辆路径问题(VRPPD);具有不完全信息问题的模糊车辆路径问题(FVRP)[3]。2蚁群算法的基本原理2.1算法概述对于VRP问题,求解算法大致可分为两类:精确算法和人工智能算法。accuracy算法基于严格的数学手段,能解出的解的质量更好。但由于算法严格,计算量大,特别是大规模问题几乎无法求解。因此,它的应用只能是小规模的确定性问题。面对中小规模问题,人工智能算法在准确率上并不具备优势。但是当规模变大的时候,人工智能的方法基本上可以在可接受的时间内找到一个可以接受的满意解,这是精确算法很难做到的。由于现实问题和各种制约因素,人工智能算法表现出了很大的优势,正因为如此,在实际应用中,人工智能算法应该更加广泛。求解车辆路径问题的精确算法有动态规划法、分支定界法等。并开始寻求具有可接受结果的启发式算法来处理大规模的实际问题。其他学科的新一代优化算法相继出现,如禁忌搜索算法、遗传算法、人工神经网络算法,以及研究较多的蚂蚁算法等。群算法等。2.2蚁群算法原理蚁群算法的灵感来自于对真实蚁群觅食行为的研究。生物学研究表明,一群合作的蚂蚁可以找到食物和巢穴之间的最短路径,但单只蚂蚁却做不到。经过大量仔细的观察和研究,生物学家发现蚂蚁个体的行为是相互影响的。蚂蚁在运动过程中,会在经过的路径上留下一种叫做信息素的物质,这种物质正是蚂蚁之间信息传递和交流的载体。蚂蚁在移动时可以感知到这种物质,它们习惯于跟踪这种物质来爬行。当然,爬行过程中会释放信息素。一条路上的信息素踪迹越粗,其他蚂蚁沿着这条路爬行的概率就越大,所以这条路上的信息素踪迹就会加强。因此,由大量蚂蚁组成的蚁群的集体行为会表现出一定的信息正反馈现象。在某条路径上走过的蚂蚁越多,后来者就越有可能选择这条路径。通过这种间接的通信机制,蚂蚁个体实现了合作寻找最短路径的目标。我们举个例子来简单说明一下蚂蚁的觅食行为:如上图a、b、c示意图所示:a是初始状态,蚂蚁的起点是A,要到达E,有障碍物在中间,必须绕过才能到达。BC和BH是绕过障碍物的2条路径(假设只有2条)。每条路径的距离d已经被校准。图b是蚂蚁在t=0时的状态,每边信息素浓度相等,假设为15;图c为t=1时刻蚂蚁经过后的状态,各侧信息素浓度发生变化;因为大量蚂蚁的选择概率会有所不同,而选择概率与路径长度有关。因此,较短路径的集中度会增加,通过这条较短路径到达目的地的蚂蚁会比其他路径多。经过这么多蚂蚁的练习,他们找到了最短的路径。所以这个过程的本质可以概括为以下几点:1.路径概率选择机制信息素痕迹越粗的路径被选中的概率越大。2.信息素更新机制的路径越短,路径上的信息素痕迹越多。快3.协同工作机制蚂蚁个体通过信息素交换信息。从蚂蚁觅食的原理可以看出,单个个体的行为是非常简单的。蚂蚁只知道追踪信息素和释放信息素,但组合后的群体智能非常高。蚂蚁巢穴和食物源之间的最短路径。这一特点恰好符合元启发式算法的特点。蚁群优化算法就是在受到这种生态现象的启发后进行了模仿和改进。蚂蚁的觅食被人工蚂蚁所取代,蚂蚁释放的信息素随着人工信息素的变化,蚂蚁的爬行和信息素的蒸发不再是连续的,而是在离散的时间和空间中。如果上面的例子不好理解,我这里贴几张PPT。个人感觉很好,找了很多资料,觉得最通俗易懂。从深层意义上讲,蚁群算法作为一种优化方法,属于人工群体智能领域。人工群体智能主要是受昆虫群体、动物群体等自然群体智能的启发。除了独特而强大的协同搜索能力外,还可以使用一系列计算代理来分发问题,从而大大提高搜索效率。3.蚁群算法的基本流程我们还是用大连理工大学顾俊峰的PPT来说明问题。重要的公式都在截图中进行了计算和解释,PPT中比较难理解的部分分别进行了解释:3.1基础数学模型首先来看基本的TSP问题基础数学模型:问题其实很简单。目标函数是每条路径的总长度。注意距离矩阵根据实际问题不同,长度不同。3.2蚁群算法讲解在讲解蚁群算法流程之前,先说明算法的原理和几个注意点:1.TSP问题的人工蚁群算法中,假设m只蚂蚁在相邻节点间移动在图中,以便协作异步导致问题的解决方案。每只蚂蚁的一步转移概率由图中每条边上的两类参数决定:1.信息素值也称为信息素轨迹。2.可见性,先验值。2.信息素的更新有两种方式,一种是挥发,即所有路径上的信息素都以一定的速度减少,模拟自然界蚁群中信息素随时间挥发的过程;另一种是增强,给评价值“好”(有蚂蚁走过)的一面增加信息素。3.蚂蚁移动到下一个目标是通过随机原理实现的,即利用当前节点存储的信息计算下一步到达该节点的概率,并根据这个概率移动一步,并一一来回。越来越接近解决方案。4.在搜索过程中,或找到解后,蚂蚁会对解或解的一部分进行优化程度评估,并将评估信息保存在相关连接的信息素中。3.3蚁群算法的核心步骤根据我们前面的原理和上面的描述,蚁群算法的两个核心步骤是路径构建和信息素更新。我们将重点关注这两个步骤。3.3.1路径构建每只蚂蚁随机选择一个城市作为出发城市,并维护一个路径记忆向量,用于存储蚂蚁依次经过的城市。在构建路径的每一步中,蚂蚁都会根据随机比例规则选择下一个要到达的城市。随机概率是根据下面的公式计算的:上面的公式是计算从当前点到每个可能的下一个节点的概率。分子是信息素强度和能见度的乘积,而分母是所有分子的总和。这个一开始不太好理解,但是我们在计算真例的时候可以看得很清楚,然后反过来理解这个公式。请注意,每次选择一个节点时,所选节点都会从可用节点中删除。3.3.2信息素更新信息素更新是蚁群算法的核心。也是整个算法的核心。该算法在初始阶段有一个固定的浓度值。每次迭代完成后,所有出去的蚂蚁都会计算自己走过的路线,然后更新对应边的信息素浓度。显然,这个值一定和蚂蚁的长度有关。经过反复迭代,短距离线的集中度会很高,从而可以得到一个近似最优解。那么我们再看看信息素更新的过程。初始化信息素浓度C(0),如果太小,算法容易早熟,蚂蚁会很快集中到局部***路径上,因为可以想象C的值太小了,使得每次挥发和增强的值都差不多,那么在随机条件下,一些小概率事件的发生会增加非***路径的信息素浓度;C太大会降低信息素对搜索方向的引导作用,影响算法的性能。一般来说,我们可以用贪心算法得到一个路径值Cnn,然后根据蚂蚁的数量计算C(0)=m/Cnn,m是每一轮结束后的蚂蚁数量,在所有路径上的信息theproblemspace所有的蚂蚁都会蒸发掉,然后所有的蚂蚁都会根据它们所构建的路径的长度,在它们当前轮次经过的边上释放信息素。这个过程是每个连接上的信息素痕迹浓度自动逐渐减弱的过程。这个挥发过程主要是为了防止算法过快地集中在局部***区域,有利于搜索区域的扩大。2.信息素加固(reinforcement)加固过程是蚁群优化算法的可选部分,称为离线更新法(也有在线更新法)。这种方法可以实现单个蚂蚁无法实现的集中操作。基本蚁群算法的离线更新方式是在蚁群中所有m只蚂蚁完成对n个城市的访问后,统一更新残差信息。3.3.3迭代和停止  迭代停止条件可以在选择合适的迭代次数,输出最优路径,或者检查是否满足指定的最优条件,找到满意解后停止。最重要的是,刚开始理解这个算法的时候,我以为蚂蚁每走一条边就是一次迭代,其实是错误的。这里算法每次迭代的意义在于:每次迭代的m只蚂蚁都完成了自己的路径过程,以及回原点后的整个过程。4、群体蚂蚁算法的计算实例用了PPT中的一个案例,很直观。修改了几个符号错误,主要是计算概率的乘号。结合公式和例子,最好用笔手绘图,简单易懂。下面我们就来看看如何编写TSP问题的蚁群算法代码。5、TSP问题的蚁群算法C#代码实现百度搜索相关的蚁群算法代码,基本都是matlab。CSDN上有一个asp.net+C#版本的实现,但是看了之后果断重写并打包,不完善,同时思路不清晰。所以自己写的过程,理解也比较清晰。经过我的简单改动,现在它仍然有意义。当然,我打算以后继续做研究,所以先写下基本程序的流程。当然,我利用了C#面向对象的特性。看完别人完全过程化的,理解起来真费劲。简单说一下实现过程和代码。5.1蚁群算法系统基类我们封装了一个基本的BaseTspAntSystem类,包括一些基本的属性和计算过程,后续相关的改进版本可以直接继承。当然,设计上可能会有瑕疵,先做吧,满足需求后再改。BaseTspAntSystem类的主要属性如下:基类有一个构造函数,系统的初始化就是传入基本参数和初始化相关列表。代码如下:核心是求解过程,根据需要迭代的次数不断迭代。这个过程就是概率选择和信息素更新。我们使用Ant蚂蚁来辅助,目的是让程序更独立,更容易理解。Ant类包含有关蚂蚁寻路过程的所有信息。这将在下一节中介绍。求解过程代码如下,见注释,对比算法:5.2Ant函数类根据算法描述,m只蚂蚁各自开展工作,同时寻找路径,是一个并行进程,所以在一个进程中,蚂蚁都是独立的。对于蚂蚁的每一次迭代,流程都比较清晰。在寻找路径的过程中,注意维护一些可用的节点列表和最后一条路径的处理。看一下Ant类的主要属性和构造函数:Ant类的核心是寻找下一个城市节点的过程,循环直到所有路径都走完。比如下面的代码就是一个循环过程:下面的GetNextCityByRandValue是一个辅助函数,选择一个随机概率值来决定是否选择哪个节点。6.资源和参考文献[1]。什么是NP问题。http://blog.csdn.net/yangtrees/article/details/8107563[2]。温永军。旅行商问题的两种智能算法[M].西安电子科技大学,2010[3]。杨瑞臣。带时间窗和先验约束车辆路径问题的蚁群优化[M].西安建筑科技大学,2005.[4].顾俊峰。智能算法-第7章:蚁群算法PPT,大连理工大学,下载地址:http://files.cnblogs.com/files/asxinyu/%E8%9A%81%E7%BE%A4%E7%AE%97%E6%B3%95%E5%9F%BA%E6%9C%AC%E7%9F%A5%E8%AF%86.rar