信息素的局部更新策略  

每只蚂蚁在构造出一条从起点到终点的路径后,蚁群算法还要求根据路径的总长度来更新这条路径所包含的每条边上信息素的浓度(在旅行商问题中每座城市是图中的一个节点,城市两两间有一条边相连)。下面给出了蚁群算法更新信息素的公式:

.

上面的第一个公式体现了信息素的更新值的计算,其中,Ck代表第k只蚂蚁所构造的路径的总长度,Q是凭经验设定的一个参数,通常置为1。component(i,j)表示从城市i到城市j的一条边,m是蚂蚁的总数。上面的第二个公式是说i和j这条边的信息素值tau等于这条边上原有的信息素加上在上一次构造路径活动中所有经过这条边的蚂蚁贡献的信息素更新值(即第一个公式)。

假设三只蚂蚁构造的路径长度如下所示:

Tour 1: 450
Tour 2: 380
Tour 1: 460

则它们的信息素的更新值相加结果为:componentNewPheromone = (Q / 450) + (Q / 380) + (Q / 460)

最后把它加到各个蚂蚁的路径中每条边原来的信息素值之上:

componentPheromone = componentPheromone + componentNewPheromone

上述信息素更新过程的伪代码如下所示:

for ant in colony do //蚁群中每条蚂蚁都逐个更新自己路径经过边上的的信息素
    tour = ant.getTour(); //蚂蚁计算路径的总长度
    pheromoneToAdd = getParam('Q') / tour.distance(); //蚂蚁计算信息素的更新值
    for cityIndex in tour do //回溯路径中的每个城市
        if lastCity(cityIndex) do // 如果当前城市是路径上的最后一个城市,取出它和第一个城市间的边
            edge = getEdge(cityIndex, )
        else do
            edge = getEdge(cityIndex, cityIndex+) //否则,取当前城市和路径上下一个城市间的边
        end if
        currentPheromone = edge.getPheromone(); //获得边上之前的信息素
        edge.setPheromone(currentPheromone + pheromoneToAdd)//原有信息素加上更新值后得到新信息素
    end for // ant路径上所有的边的信息素更新完毕
end for //蚁群中所有蚂蚁都处理完毕

信息素的挥发

在自然界中蚂蚁遗留下来的信息素经过一段时间后会挥发,我们在算法中也模拟上述过程,具体公式如下:

rho是一个人为设定的参数,称为挥发率,一般为0-1间的数。

相应的伪代码如下所示:

for edge in edges
    updatedPheromone = ( - getParam('rho')) * edge.getPheromone()
    edge.setPheromone(updatedPheromone)
end for

精英蚂蚁策略

 精英蚂蚁是对蚁群算法的一种改进,所谓精英蚂蚁是指当全部蚂蚁都构造完各自的路径之后,所有路径中最短的那条路径所对应的蚂蚁。精英蚂蚁策略的公式如下所示,它和上面的信息素局部更新公式的唯一区别在于精英蚂蚁在像其它蚂蚁一样更新完自己路径上的信息素后,还要再重复一遍信息素的更新过程,只不过这次要把更新值乘上一个参数e,e通常选在0和1之间。

蚁群算法简介(part3: 蚁群算法之更新信息素)的更多相关文章

  1. 蚁群算法简介(part2: 蚁群算法之构造路径)

    蚁群算法主要可以分为以下几个步骤:首先,蚁群中的每只蚂蚁都根据地面上信息素浓度的大小找出一条从原点通向终点的遍历所有城市一次的路径(构造路径):然后每只蚂蚁沿着自己刚刚找到的路径回溯,在路径经过的各个 ...

  2. 从零开始学C++之STL(四):算法简介、7种算法分类

    一.算法 算法是以函数模板的形式实现的.常用的算法涉及到比较.交换.查找.搜索.复制.修改.移除.反转.排序.合并等等. 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用. 算法的 ...

  3. 排列熵算法简介及c#实现

    一.   排列熵算法简介: 排列熵算法(Permutation Entroy)为度量时间序列复杂性的一种方法,算法描述如下: 设一维时间序列: 采用相空间重构延迟坐标法对X中任一元素x(i)进行相空间 ...

  4. 蚁群算法简介(part 1:蚁群算法之绪论)

    群算法是Marco Dorigo在1992年提出的一种优化算法,该算法受到蚂蚁搜索食物时对路径的选择策略的启示.蚁群算法作为群体智能算法的一种利用分布式的种群搜索策略来寻找目标函数的最优解.蚁群算法与 ...

  5. AI - 机器学习常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

  6. Zookeeper简介与集群搭建【转】

    Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...

  7. PageRank 算法简介

    有两篇文章一篇讲解(下面copy)< PageRank算法简介及Map-Reduce实现>来源:http://www.cnblogs.com/fengfenggirl/p/pagerank ...

  8. [Machine Learning] Learning to rank算法简介

    声明:以下内容根据潘的博客和crackcell's dustbin进行整理,尊重原著,向两位作者致谢! 1 现有的排序模型 排序(Ranking)一直是信息检索的核心研究问题,有大量的成熟的方法,主要 ...

  9. 一致性hash算法简介与代码实现

    一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...

随机推荐

  1. iOS用三种途径实现一方法有多个返回值

    以前觉得这种标题有点偏向于理论,实际开发中怎么会有这种诡异的需求,但是真正遇到了这种硬需求时觉得还是有那么点价值的,理论付诸了实践在此也就做了个整理. 以我私下开发中的一处代码为例,本意是希望有这么一 ...

  2. X3850M2安装CertOS 7 KVM 2--VNC

    需要安装远程桌面,否则无鼠标的日子比较难. VNC的安装需要步骤较多,重点参考以下文章: http://www.itzgeek.com/how-tos/linux/centos-how-tos/con ...

  3. 【转】分布式数据层 TDDL 来自:阿里巴巴

    淘宝根据自己的业务特点开发了TDDL(Taobao Distributed Data Layer 外号:头都大了 ©_Ob)框架,主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制,它是一个 ...

  4. JVM-并发-线程

    线程 1.线程的实现 (1)实现线程主要有3中方式:使用内核线程实现,使用用户线程实现和使用用户线程加轻量级进程混合实现. (2)使用内核线程实现 内核线程就是直接由操作系统内核支持的线程,这种线程由 ...

  5. Ubuntu 14.04 eclipse 提示框背景色更改

    首先查看系统设置->外观->主题. 不同的主题需要更改的文件不同 sudo vim /usr/share/themes/主题(就是刚才主题的名字,ubuntu14.04默认是Ambianc ...

  6. 实用的PHP正则表达式

    正则表达式是程序开发中一个重要的元素,它提供用来描述或匹配文本的字符串,如特定的字符.词或算式等.但在某些情况下,用正则表达式去验证一个字符串比较复杂和费时.本文为你介绍10种常见的实用PHP正则表达 ...

  7. SE 2014年4月17日

    描述BGP路由属性 MED.首选值 的特点 MED相当于IGP协议中的度量值,在其他条件相同时,当本自治系统有多条到达外部自治系统的链路时,MED值小的路由优选.MED属性只能在两个自治系统间传递. ...

  8. lua-TestMore(转)

    http://fperrad.github.io/lua-TestMore/ http://www.softpedia.com/get/Programming/Debuggers-Decompiler ...

  9. 【java】i++与++i、i--运算

    package test; //i++与--i运算 public class test { public static void main(String[] args) { int b=0; int ...

  10. [C++]几种排序

    本文为大大维原创,最早于博客园发表,转载请注明出处!!! 1.冒泡: #include<cmath> #include<cstdlib> #include<ctime&g ...