小白的蚁群算法学习总结

小白的蚁群算法学习总结(1)

  1. 综述
    说起接触这个蚁群算法(ACO),是在我大学毕业读研的那个暑假,需要看导师的论文,提前学习时遇到的。想必许多人在读研前没有提前进实验室习惯于看导师论文,刚开始都是一知半解,什么量子纠缠,什么shor算法,蚁群算法,都是一头雾水。只好一点点挖论文中涉及到的知识点,所以看一篇论文,里面的知识点特别多,而且对知识点的原理要求比较高,一篇下来要花好几天,我就为了学习论文中的蚁群算法花了n天。这里算是入门级,算是学习笔记,是自己的暑假一个总结,所以高手可以秒退。
    蚁群算法背景:是一种基于种群的启发式的仿生进化系统,可以直接理解为仿生优化算法。是意大利著名学者DorigoMManiezzaoVColorniA根据蚂蚁“寻找食物”的群体行为,1991年最早提出了蚁群算法的基本模型,其目的是最早是用来解决TSP(旅行商问题:可以理解为要走过中国所有城市,求最短路径的一种方法,就是所说的组合优化问题),而后随其发展,应用领域逐渐扩大,其中我比较熟悉的是我导师论文中就是将其思想应用于WSN(无线传感器网络)安全路由算法中,所以这样迫使我去看其流程和源码。
  2. 算法原理
    蚁群算法的最大特点;只能在相邻节点中一步步 移动,这个算法有别于我大学学习的数据结构中的dijkstra算法,该算法是不需要经历每一个点,求两点间的最短路径,而蚁群算法必须是经过每一个节点并回到原点。
    蚁群算法原理:是一种正反馈机制或称增强型学习系统(网络上给出的定义)。它模仿了蚂蚁的行为特征(蚂蚁寻找食物源的搜索方式如图:开始巢穴中的第一批蚂蚁等概率的选择路径绕过障碍物,由于上方蚂蚁优先返回,途中会留下信息素,开始相等的时间内,通过上方的蚂蚁数目增多,导致上方的信息素增多,之后这些信息会影响后面寻食物的蚂蚁判断,就存在蚂蚁选择上方的概率增大,数目增多,形成良好的正反馈,模拟多次后,就会无限逼近所有的蚂蚁走上方路寻找食物,故该路为最短路径如图(1)) , 它是使用人工蚂蚁仿真(也称蚂蚁系统) 来求解问题路径最短问题,蚂蚁寻找食物过程中会留下信息素,为后蚂蚁到来提供信息判断,来诱导后蚂蚁选择更短的信息源。故人工蚂蚁也必须具备这个基本的特性。故人工蚂蚁决不是对实际蚂蚁的一种简单模拟, 更多地融进了人类的智能使其具备一定的记忆力。我觉的第一个提出这样思维的人特别厉害。
    小白的蚁群算法学习总结_第1张图片
  3. 算法模型
    算法模型:要想真正了解这个算法,又有点时间,看源码是最直接也是最有效果的。所以无论怎么样都都应该花点时间去看源码,可以看MATLAB源码难度会小一点,但提前会一点MATLAB,最起码会掌握一些函数。学习源码之前,认清模型和解读流程图会使你事半功倍。
    下面以求解平面上的n个城市的TSP为例子来简单的介绍一下蚁群算法。蚁群算法模型n个城市的TSP为了寻找n个城市各一次最后回到出发点的最短路径
    假设有n个城市,m只蚂蚁,令dij(i,j= 1, 2 …n)表示城市之间的距离,τij(t)表示t时刻在i,j 之间路径上 残留的信息素强度。蚂蚁k在进行中,根据各条路上残留信息素强度来决定下一步的路径,pkij(t)表示在t时刻蚂蚁k由城市i转移到城市j的概率,则有:
    Pkij(t)=这里写图片描述 式(1)
    Jk(i)(1,2,,n)-tabu表示蚂蚁k下一步允许的城市集。
    列表ktabu为蚂蚁k的禁忌表。当所有n个城市都被列入到tabu中时,蚂蚁k游历了所有城市,
    ηij是启发式因子,表示蚂蚁k从城市i行进到城市j的期望程度,通常取dij的倒数;α,β分别表示信息素和启发式因子在方程中相对重要程序;决定于找到最优路径的收敛速度。
    这里写图片描述 式(2)
    这里写图片描述 式(3)
    ρ(0<ρ<1)表示挥发系数,1-ρ表示持久性系数,表示本次迭代后信息素的增量表示第k只蚂蚁在本次迭代中残留在边上的信息素。
    以上三个式(1)(2)(3)非常重要,是源码的核心部分,也是源码中循环中不好理解的部分,亦是之后流程图中重要部分。不管数学功底如何,本人还是建议看一遍,不要被其复杂的公式所吓晕。便于好理解,你可以直接令k = 1(看做一只蚂蚁)这样公式就简化的非常多,所有的基于蚁群算法的应用基本上都离不开以上三个式子,可想而知这是整个算法的灵魂。
  4. 算法的具体实现
    流程图:如图(2):
    小白的蚁群算法学习总结_第2张图片
    不管有没有学过编程,其实这个流程图不难,大的方向主要有两个判断语句,一个是模拟实验对象个数(蚂蚁数)。第二个是模拟实验次数(迭代次数)。有两张表特别重要,第一张是禁忌表(一步步未知节点,最后形成经过城市顺序的一张表),还有一张是概率表(选择下一座城市的概率) 。这里举个我第一次用简化思想去理解这个算法的MATLAB源码。如图(3)构建最简单的图形,这里的数据凑合着很不巧,但不影响理解。
  5. matlab源码分析
    具体的源码分析可以参考 博客
    蚁群算法 matlab程序详细解答-菜鸟也能看懂
    以下的分析可以有助于更进一步理解。
    小白的蚁群算法学习总结_第3张图片
    假设有全国就是四座城市A,B,C,D(n =4)对应的四个数字分别是:①②③④,城市City=C就可以确定为4*2矩阵,那么坐标为C=这里写图片描述那么我们为了以最简单的形式去读懂这个程序,令蚂蚁数为m = 3只,又恰巧三只都是在D城市出发,求其经过各个城市的最短路径(最优路径)当然我们用肉眼就能看出来最佳路径应该是D-B-A-C-D,或者;D-C-A-B-D,路径长度为9+√13。但决不可能是D-A-C-B-D。那么假设计算机不懂,我们利用算法让计算机告诉我们最短路径。备注:为了方便计算所有的√13都四舍五入为3.6。这里采用最少的迭代次数NC_max=2;这里的参数我姑且设置为alpha=α = 1,beta=β = 1,rho = р = 0.5, Q = 10 。
    第一:变量初始化
    为了确定完全图的赋权邻接矩阵D = 这里写图片描述(eps 在MATLAB中啥时候接近与0无穷小)
    eta= η=1./D =这里写图片描述,可以将4.5036e+15理解为无穷大。Tau = τ=这里写图片描述信息素矩阵全为1。
    第二步:将4只蚂蚁放到4个城市上
    randperm(n);这个函数就是随机产生4以内整数的排序,例如randperm(4)=1,2,4,3。顺序是随机的,但必须含有1,2,3,4。这样加上Randpos这个函数,可以把这几个单独在matlab中运行,结果一目了然。那么最后,我假设三只蚂蚁把D作为出发点,根据以上几个函数是不能实现,但我只想先研究D点的之后的录像,所以我暂时没有必要去管起点为A,B,C的点,研究后一个之后其后的其他店都一样,故tabu =这里写图片描述 。4是D点那个点在矩阵中的表示,表示三只蚂蚁都在D开始出发。
    第三步:3只蚂蚁按概率函数选择下一座城市,完成各自的周游
    由于第一次tau为1*1矩阵,则对于蚂蚁来说选择下个城市 A,B,C的概率一样,
    P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);(好好看一遍吧,我第一遍看的时候搞糊涂了,是因为那么多括号我搞混了)
    P= [1,1,1] 权重都是1,那么以概率都是0.3333将选择未访问的城市矩阵J = [1,3,4]
    那么tabu具有不确定,那么我假设他们完成如下的途径。Tabu =这里写图片描述,表示第一只蚂蚁经过的城市是D-B-A-C-D,第二只D-A-C-B-D.以此类推。
    第四步:记录本次迭代最佳路线
    那么接下来要重点算最佳路线和信息素,后面一些什么R_best, L_best 都先不管,只是为了存储最短路径和最短路径的值。
    然后按照公式计算信息素矩阵:
    Tau =这里写图片描述 这个时候我们发现tau不再是为1的矩阵,他是含有不一样的信息素,这些信息素也会影响下一批蚂蚁的出行选择方案,到时候就选择的下一座城市就并非等概率了,接近真实人工蚂蚁寻找食物的过程,比如前一个点是4,那么下一个选择的是1,2,3.那么相关的tau的坐标是(4,1),(4,2),(4,3)。
    第五:当迭代次数达到了NC=2时,假设下一批蚂蚁又都落在D点准备出行,那么他会选择哪一座城市了?看下面一个式子
    前面可以看到J=[1,2,3],那么对应选择1,2,3城市的权重是P(k)
    P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
    这里α,β都是1。
    P(1)=7.1α*0.2β=1.42
    P(2)=8.4α*0.28β=2.35
    P(3)=8.4α*0.25β=2.1
    那么所对应选择城市的概率为:
    J[1,2,3]=p[p(1)/(p(1)+p(2)+p(3)),p(2)/(p(1)+p(2)+p(3)),p(3)/(p(1)+p(2)+p(3))]=[0.22,0.44,0.35].
    那么可想而知,下一步选择城市B(2)的概率最大,C(3)其次,故和我们之前观察到的有一定的关系,当然这里随着次数的增多,精度会越来越大,选择2,3的概率会越来越大,逼近最优解。
    最后经过多试验检测,发现,结果多数都是符合要求:起始点如果随机到D点开始,那么基本上都是Shortest_Route=4 2 1 3或者,4 3 1 2. Shortest_Length=12.6.当然这里只是无限逼近最优解,如果随着m增大,NC_max次数增多,更加符合实际解。所以说这是正反馈机制或称增强型学习系统。
  6. 总结
    通过了解,学习,看源码,到实验,对该算法有一定的了解,但是其中的奥秘还任然需要一些时间去揣摩。比如我就有一下几个疑惑?
    第一:在仿真过程中有些参数是我自己选的,比如信息素强度Q、信息素残留因子1-ρ、信息启发式因子α、期望启发式因子β、其选区方式和选区原则直接影响到蚁群算法的全局收敛性和求解效率。如何选择蚁群算法最优组合参数也是我接下来要学习东西:
    1: 确定蚂蚁数目M,根据 城市规模 / 蚂蚁数目 ≈1.5的选择策略来确定蚂蚁的总数目。(这里我觉的是1.5的倍数)
    2: 参数粗调,即调整数值范围较大的信息启发式因子α、期望启发式因子β、信息素强度Q等参数,已得到较理想的解。
    3: 参数微调,即调整数值范围较小的信息素残留因子1-ρ。
    那么这些参数都是无规律的?都只能一个个自己去调试,会不会太麻烦?这些值得我去学习。
    第二:该算法的时间复杂性怎么样?好还是不好,可以从哪方便进行改进,又有哪些好的算法模式可以借鉴?这些都应该从一些论文去找文献,需要花大时间去深入解读。
    第三:具体在工程上的应用有哪些,就好可以找出一两个实例来进行剖析看一看这个算法是不是个好东西。

你可能感兴趣的:(算法,研究生涯,蚁群,matlab)