原文转载于https://www.cnblogs.com/biaoyu/archive/2012/09/26/2704456.html

  1. 蚁群算法简介
    蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题提供了一个新的可能性。蚁群算法最早是由意大利学者Colorni A., Dorigo M. 等于1991年提出。经过20多年的发展,蚁群算法在理论以及应用研究上已经得到巨大的进步。

    蚁群算法是一种仿生学算法,是由自然界中蚂蚁觅食的行为而启发的。在自然界中,蚂蚁觅食过程中,蚁群总能够按照寻找到一条从蚁巢和食物源的最优路径。图(1)显示了这样一个觅食的过程。

在图1(a)中,有一群蚂蚁,假如A是蚁巢,E是食物源(反之亦然)。这群蚂蚁将沿着蚁巢和食物源之间的直线路径行驶。假如在A和E之间突然出现了一个障碍物(图1(b)),那么,在B点(或D点)的蚂蚁将要做出决策,到底是向左行驶还是向右行驶?由于一开始路上没有前面蚂蚁留下的信息素(pheromone),蚂蚁朝着两个方向行进的概率是相等的。但是当有蚂蚁走过时,它将会在它行进的路上释放出信息素,并且这种信息素会议一定的速率散发掉。信息素是蚂蚁之间交流的工具之一。它后面的蚂蚁通过路上信息素的浓度,做出决策,往左还是往右。很明显,沿着短边的的路径上信息素将会越来越浓(图1(c)),从而吸引了越来越多的蚂蚁沿着这条路径行驶。

  1. TSP问题描述

    蚁群算法最早用来求解TSP问题,并且表现出了很大的优越性,因为它分布式特性,鲁棒性强并且容易与其它算法结合,但是同时也存在这收敛速度慢,容易陷入局部最优(local optimal)等缺点。

    TSP问题(Travel Salesperson Problem,即旅行商问题或者称为中国邮递员问题),是一种,是一种NP-hard问题,此类问题用一般的算法是很大得到最优解的,所以一般需要借助一些启发式算法求解,例如遗传算法(GA),蚁群算法(ACO),微粒群算法(PSO)等等。

    TSP问题可以分为两类,一类是对称TSP问题(Symmetric TSP),另一类是非对称问题(Asymmetric TSP)。所有的TSP问题都可以用一个图(Graph)来描述:

V={c1,c2,…,ci,…,cn},i=1,2,…,n是所有城市的集合. ci表示第i个城市, n为城市的数目;

E={(r,s):r,s∈V}是所有城市之间连接的集合;

C={crs:r,s∈V}是所有城市之间连接的成本度量(一般为城市之间的距离);

如果crs=csr, 那么该TSP问题为对称的,否则为非对称的。

一个TSP问题可以表达为:

求解遍历图G=(V,E,C),所有的节点一次并且回到起始节点,使得连接这些节点的路径成本最低。

  1. 蚁群算法原理

    假如蚁群中所有蚂蚁的数量为m,所有城市之间的信息素用矩阵pheromone表示,最短路径为bestLength,最佳路径为bestTour。每只蚂蚁都有自己的内存,内存中用一个禁忌表(Tabu)来存储该蚂蚁已经访问过的城市,表示其在以后的搜索中将不能访问这些城市;还有用另外一个允许访问的城市表(Allowed)来存储它还可以访问的城市;另外还用一个矩阵(Delta)来存储它在一个循环(或者迭代)中给所经过的路径释放的信息素;还有另外一些数据,例如一些控制参数(α,β,ρ,Q),该蚂蚁行走玩全程的总成本或距离(tourLength),等等。假定算法总共运行MAX_GEN次,运行时间为t。

蚁群算法计算过程如下:

(1)初始化

设t=0,初始化bestLength为一个非常大的数(正无穷),bestTour为空。初始化所有的蚂蚁的Delt矩阵所有元素初始化为0,Tabu表清空,Allowed表中加入所有的城市节点。随机选择它们的起始位置(也可以人工指定)。在Tabu中加入起始节点,Allowed中去掉该起始节点。

(2)为每只蚂蚁选择下一个节点。

为每只蚂蚁选择下一个节点,该节点只能从Allowed中以某种概率(公式1)搜索到,每搜到一个,就将该节点加入到Tabu中,并且从Allowed中删除该节点。该过程重复n-1次,直到所有的城市都遍历过一次。遍历完所有节点后,将起始节点加入到Tabu中。此时Tabu表元素数量为n+1(n为城市数量),Allowed元素数量为0。接下来按照(公式2)计算每个蚂蚁的Delta矩阵值。最后计算最佳路径,比较每个蚂蚁的路径成本,然后和bestLength比较,若它的路径成本比bestLength小,则将该值赋予bestLength,并且将其Tabu赋予BestTour。

(公式1)

(公式2)

其中p(t)ij表示选择城市j的概率,k表示第k个蚂蚁,τ(t)ij表示城市i,j在第t时刻的信息素浓度,ηij表示从城市i到城市j的可见度,

ηij=1dij,dij表示城市i,j之间的成本(或距离)。由此可见dij越小,ηij越大,也就是从城市i到j的可见性就越大。Δτkij表示蚂蚁k在城市i与j之间留下的信息素。

Lk表示蚂蚁k经过一个循环(或迭代)锁经过路径的总成本(或距离),即tourLength.α,β,Q 均为控制参数。

(3)更新信息素矩阵

令t=t+nt,按照(公式3)更新信息素矩阵phermone。

τij(t+n)=ρ⋅τij(t)+Δτij
(公式3)

τij(t+n)为t+n时刻城市i与j之间的信息素浓度。ρ为控制参数,Deltaij为城市i与j之间信息素经过一个迭代后的增量。并且有

Δτij=∑k=1mΔτkij
(公式4)

其中Δτkij由公式计算得到。

(4)检查终止条件

如果达到最大代数MAX_GEN,算法终止,转到第(5)步;否则,重新初始化所有的蚂蚁的Delt矩阵所有元素初始化为0,Tabu表清空,Allowed表中加入所有的城市节点。随机选择它们的起始位置(也可以人工指定)。在Tabu中加入起始节点,Allowed中去掉该起始节点,重复执行(2),(3),(4)步。

(5)输出最优值

  1. Java实现

    在该java实现中我们选择使用tsplib上的数据att48,这是一个对称tsp问题,城市规模为48,其最优值为10628.其距离计算方法如图(2)所示:

蚁群算法解决TSP问题相关推荐

  1. 蚁群算法解决tsp问题c语言,蚁群算法解决TSP问题程序.doc

    蚁群算法解决TSP问题程序 蚁群算法用于求解TSP问题,经过仿真测试,发现此程序的优化效率和鲁棒性都非常好. 这与在无线多媒体传感器网络路由算法应用到的寻找最佳路径的蚁群算法非常相似. functio ...

  2. 蚁群算法解决tsp问题python_蚁群算法在解决TSP问题中的应用

    陈灵佳 文章首先对蚁群算法与TSP问题进行简要介绍,在此基础上对蚁群算法在解决TSP问题中的应用进行论述.期望通过本文的研究能够对TSP问题的解决有所帮助. [关键词]蚁群算法 TSP问题 最优解 1 ...

  3. 蚁群算法解决 TSP 问题

    蚁群算法解决 TSP 问题 数据集 Tools.py Ant.py ACO_G.py 运行效果 数据集 json 形式(c.json)的中国各省市经纬度数据集,一共 2241 个市的数据,为后来的 T ...

  4. 机器学习(MACHINE LEARNING)MATLAB蚁群算法解决TSP问题

    文章目录 1 蚁群算法 2 蚁群算法与TSP问题的关系 3 代码实现 1 蚁群算法 基本原理: (1)蚂蚁在携带等量的信息素一路释放 (2)信息素浓度会和路径的长度成反比 (3)下次蚂蚁来到该路口会选 ...

  5. 蚂蚁算法求解tsp问题matlab,蚁群算法解决TSP问题的MATLAB程序

    蚁群算法TSP(旅行商问题)通用matlab程序 function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_m ...

  6. 蚁群算法解决TSP问题(2#JAVA代码+详细注释+对比动态规划【JAVA】)

    第一部分:原理 TSP10cities.txt 1 2066 2333 2 935 1304 3 1270 200 4 1389 700 5 984 2810 6 2253 478 7 949 302 ...

  7. 蚁群算法解决TSP问题(matlab代码实现)

  8. 实验6:蚁群算法在TSP问题中的实现

    实验目的 (1)理解蚁群算法的原理以及优缺点 (2)能够用蚁群算法解决实际问题 实验内容 旅行商问题(TSP,traveling salesman problem):一商人去n个城市销货,所有城市走- ...

  9. MATLAB蚁群算法、遗传算法、粒子群算法解决TSP问题(可以直接运行)

    MATLAB蚁群算法.遗传算法.粒子群算法解决TSP问题(可以直接运行) 1. 生成数据文件citys_data.mat 2. 蚁群算法 流程图 代码 结果展示 3.遗传算法 流程图 代码 结果展示 ...

最新文章

  1. 15分钟实现AI端计算模型训练、加速与部署 | 百度EasyDL公开课
  2. 爬取豆瓣电影排名前250部电影并且存入Mongo数据库
  3. GCC 中文手册 - 摘自纯C论坛
  4. 热门专业学习之关于java的一些知识
  5. reactJS -- 13 JSX样式与CSS的互转
  6. 最大流matlab代码,计算最小费用最大流MATLAB源代码.doc
  7. C++ 派生类和virtual
  8. c语言api_C语言现在好找工作吗?我开始学了这么久的C语言,应该怎么办?
  9. Unix 环境高级编程 之 理解 rws 权限
  10. 使用命令强制关闭端口进程
  11. html video函数,HTML5 Video 的API函数
  12. H3CNE中Vlan间路由
  13. 从学生到职场,这位百万爬虫博主都经历了什么?
  14. 数据挖掘常用算法整理
  15. 玩客云:更好的迅雷从“共享计算”开始
  16. 百度鹰眼轨迹和虎鲸数据平台之浅谈
  17. UG模具设计之汽车特斯拉车灯与后备箱规律边境构建技巧
  18. 寻找书籍,以及格式转换网站
  19. Linux工具学习之【git】
  20. 哨兵 双向 java_SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级

热门文章

  1. 内核研究与嵌入式开发
  2. 深度长文|详解现象级ChatGPT发展历程、原理、技术架构详解和产业未来
  3. SylixOS下无法删除文件夹
  4. 100多种清除木马方法
  5. 【GRUB】GRUB2代码初步解析
  6. 都2020年了还能看见奇葩的SQL写法
  7. Python之父:GIL不是问题,是幸事
  8. vue安装Postcss_Flask和Vue.js构建全栈单页面web应用【通过Flask开发RESTful API】
  9. SIGIR‘21|SGL基于图自监督学习的推荐系统
  10. python_MODIS HDF数据转为tif并拼接图像