蚁群算法简介(part2: 蚁群算法之构造路径)
蚁群算法主要可以分为以下几个步骤:首先,蚁群中的每只蚂蚁都根据地面上信息素浓度的大小找出一条从原点通向终点的遍历所有城市一次的路径(构造路径);然后每只蚂蚁沿着自己刚刚找到的路径回溯,在路径经过的各个component(在旅行商问题中component指的是连接两座城市的那条边)上根据找到路径的整体质量(在旅行商问题中,质量好坏可以用路径总长度的大小来评价)分泌出相应浓度的信息素(更新信息素);当所有蚂蚁都找到了遍历所有城市的路径并通过回溯完成了信息素的更新工作后,所有component上的信息素按照一定的挥发率进行挥发。我们不断地重复上面的步骤直到找到一条从原点通向终点的最优路径为止。
除了信息素之外,在构造路径时我们还要计算一个经验值来帮助引导蚂蚁的路径选择,以旅行商问题为例,这个经验值通常是当前访问的城市到其它城市之间的直线距离,一个城市离蚂蚁当前所在的城市距离越近,这个城市作为蚂蚁下一个访问的城市的概率就越大。下面的公式体现了蚂蚁如何按照经验值和信息素这两个因素来计算某个城市作为下一个被访问到的城市的概率:
aaarticlea/png;base64,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" alt="" />
在上面的公式中k代表蚂蚁的编号,pij代表如果第k个蚂蚁当前位于城市i那么它下一个要访问的城市是j的概率。tij代表第i个城市通向第j个城市的边上存储的信息素的值,nij代表第i个城市通向第j个城市的边上的经验值(与i和j间的距离成反比),l指的是与i有边相连且从未访问过的城市。alpha和beta分别是两个参数,在分母中的l表示与i之间有边直接相连的城市编号。下面的代码给出了如何根据pij的值来选择下一个要访问的城市的伪代码:
rouletteWheel =
states = ant.getUnvisitedStates()//找到与当前城市state有边直接相连且从未访问的城市,把这些城市编号存到states里
/*计算上面公式的分母*/
for newState in states do
rouletteWheel += Math.pow(getPheromone(state, newState), getParam('alpha'))
* Math.pow(calcHeuristicValue(state, newState), getParam('beta'))
end for randomValue = random()//产生一个0-1之间的随机数
wheelPosition = 0
/* 从候选城市的集合states中逐一取出城市编号newstate,计算上面公式的分子部分,
并把计算出来的值进行累加,直到取出某个城市newState
后的累加值(即wheelPosition的值)大于等于随机数randomValue为止,
返回这个newState作为下一个访问的城市
*/
for newState in states do
wheelPosition += (Math.pow(getPheromone(state, newState), getParam('alpha'))
* Math.pow(calcHeuristicValue(state, newState), getParam('beta')))/rouletteWheel
if wheelPosition >= randomValue do
return newState
end for
需要注意的是在旅行商问题中每座城市只能被访问一次,因此我们需要将已经访问过的城市做标记,在计算上面公式的分母时不去考虑这些到过的城市。
Exploration and Exploitation 策略
在选择下一个访问城市的问题上,有一种叫作Exploration和Exploitation的策略,该策略的思路是生成一个0-1的随机数,将这个随机数和一个预先设定好的0-1之间的参数进行比较,如果随机数<这个参数,则通过Exploitation选择下一个访问的城市,否则通过Exploration操作选择下一个城市。Exploratation这个操作就是上面代码所示的操作,而Exploitation操作指的是在和当前节点(state)有边直接相连的尚未被访问的候选城市(newState)中挑选
Math.pow(getPheromone(state, newState), getParam('alpha'))* Math.pow(calcHeuristicValue(state, newState), getParam('beta'))
最大的那个城市作为下一个访问的城市。
蚁群算法简介(part2: 蚁群算法之构造路径)的更多相关文章
- 蚁群算法简介(part3: 蚁群算法之更新信息素)
信息素的局部更新策略 每只蚂蚁在构造出一条从起点到终点的路径后,蚁群算法还要求根据路径的总长度来更新这条路径所包含的每条边上信息素的浓度(在旅行商问题中每座城市是图中的一个节点,城市两两间有一条边 ...
- 从零开始学C++之STL(四):算法简介、7种算法分类
一.算法 算法是以函数模板的形式实现的.常用的算法涉及到比较.交换.查找.搜索.复制.修改.移除.反转.排序.合并等等. 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用. 算法的 ...
- 排列熵算法简介及c#实现
一. 排列熵算法简介: 排列熵算法(Permutation Entroy)为度量时间序列复杂性的一种方法,算法描述如下: 设一维时间序列: 采用相空间重构延迟坐标法对X中任一元素x(i)进行相空间 ...
- 7.redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?
作者:中华石杉 面试题 redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 面试官心理分析 在前几年, ...
- AI - 机器学习常见算法简介(Common Algorithms)
机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...
- Zookeeper简介与集群搭建【转】
Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...
- PageRank 算法简介
有两篇文章一篇讲解(下面copy)< PageRank算法简介及Map-Reduce实现>来源:http://www.cnblogs.com/fengfenggirl/p/pagerank ...
- zookeeper(分布式协调框架)简介与集群搭建
ZooKeeper 的由来: Zookeeper最早起源于雅虎研究院的一个研究小组.在当时,研究人员发现,在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布 ...
- 【异常检测】孤立森林(Isolation Forest)算法简介
简介 工作的过程中经常会遇到这样一个问题,在构建模型训练数据时,我们很难保证训练数据的纯净度,数据中往往会参杂很多被错误标记噪声数据,而数据的质量决定了最终模型性能的好坏.如果进行人工二次标记,成本会 ...
随机推荐
- 简单的oracle分页语句
SELECT * FROM ( SELECT rownum rn,te.* FROM (SELECT * FROM tb_enterprise) te WHERE rownum <= 10) ...
- apache on centos
httpd https://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-apache-startstop.html
- 使用Visual Studio扩展插件Visual assist X给代码插入注释模板
Visual Assist 是由Whole Tomato公司为Microsoft Visual Studio开发的一款插件.它对Visual Studio的智能提示功能和代码高亮功能进行了增强,同时还 ...
- Ajax跨域的几种方法以及每种方法的原理
js中几种实用的跨域方法原理详解 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协 ...
- poj 2376 Cleaning Shifts
http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- Gulp自动添加版本号(转载)
本文转载自: gulp自动添加版本号
- c# 用户名 密码 访问 局域网共享
#region Ping 返回true则代表可以连接成功 public bool Ping(string remoteHost) { bool Flag = false; Process proc = ...
- 在执行Java命令或eclipse启动程序,提示报错’jvm.cfg无法找到’的解决办法
一.问题背景 昨天debug代码的时候,突然发现无法启动程序了.每次启动程序的时候均报如下错误:(回家以后重现了下这个问题.发现不同电脑,所在的lib下的文件夹不一样,应该和jdk安装时硬件的情况有关 ...
- WCF入门-项目间调用服务
练习WCF入库,添加了一个WCF项目,同时添加了一个控制台程序,在控制台程序启动时,调用WCF服务,报错. 控制台程序代码为: namespace WcfConsumer { class Progra ...
- jsonp 使用总结
首先:jsonp是json用来跨域的一个东西. 原理是通过script标签的跨域特性来绕过同源策略. 发送端: $.ajax({ type : "post", url : &quo ...