1、理论概述

1.1、TSP问题

旅行商问题,即TSP问题(旅行推销员问题、货郎担问题),是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。TSP问题是一个组合优化问题。该问题可以被证明具有NP计算复杂性,迄今为止,这类问题中没有一个找到有效解决算法,因此我们经常用一些近似求解算法,遗传算法、蚁群算法、粒子群算法等等。

1.2、蚁群算法

蚁群算法是一种仿生学算法,是由自然界中蚂蚁觅食的行为而启发的。在自然界中,蚂蚁觅食过程中,蚁群总能够按照寻找到一条从蚁巢和食物源的最优路径。以下是蚁群觅食过程:

在图1(a)中,一群蚂蚁从A到E觅食,由于是直线路径,所以蚂蚁直接从源到目的地。在A和E之间多了一个障碍物(b)图,那么在H点或者C点的蚂蚁将要做选择,由于一开始路上没有前面蚂蚁留下的信息素,蚂蚁朝着两个方向行进的概率是相等的。但是当有蚂蚁走过时,它将会在它行进的路上释放出信息素,并且这种信息素会以一定的速率散发掉。它后面的蚂蚁通过路上信息素的浓度,做出决策,往左还是往右。很明显,沿着短边的的路径上信息素将会越来越浓,随着时间的增长,右边路径的信息素浓度会因为路径的长度而散发掉,所以会有越来越多的蚂蚁沿着较短的路径前行。如图c。

蚁群算法的缺点是收敛速度慢,容易陷入局部最优解。

2、算法流程

假设蚁群中所有蚂蚁的数量为m,所有城市之间的信息素用矩阵pheromone表示,最短路径为bestLength,最佳路径为bestTour。每只蚂蚁都有自己的内存,内存中用一个禁忌表(Tabu)来存储该蚂蚁已经访问过的城市,表示其在以后的搜索中将不能访问这些城市;还有用另外一个允许访问的城市表(Allowed)来存储它还可以访问的城市;另外还用一个矩阵(Delta)来存储它在一个循环(或者迭代)中给所经过的路径释放的信息素;还有另外一些数据,例如一些控制参数(α,β,ρ,Q)用于辅助计算信息素挥发、下一个城市选中概率等等,该蚂蚁行走完全程的总成本或距离(tourLength)等。假定算法总共运行maxgen次,运行时间为t。图三是算法流程图。(注:实验系数的选定是多次试验计算的结果见论文table1)

2.1、每只蚂蚁行进过程

为每只蚂蚁选择下一个节点,该节点只能从未选择节点中以某种概率搜索到,首先计算城市选中概率,之后以一定的原则计算下一步要选的城市,如果该城市没去过,则下一个城市就是该城市。本实验的选择方式是,产生一个随机数,顺序计算各个城市的选中概率之和,直到大于该随机数,则选择循环系数代表的城市(前提是该城市没选过。)遍历完所有节点后,将起始节点加入到 tour中,形成一个完整回路。保留回路长度tourlength。接下来计算每个蚂蚁的信息素矩阵值。最后计算最佳路径,比较每个蚂蚁的路径成本,然后和bestLength比较,若它的路径成本比bestLength小,则将该值赋予bestLength,并在本次迭代中输出最优路径。本次迭代每只蚂蚁走完后结束。只要没有到达指定的迭代次数,则蚂蚁重新随机重置起始点,进入下一次迭代。

2.2、实验终止

如果达到最大迭代次数maxgen,算法终止,输出最优路径和最优路径长度;否则,重新初始化所有的蚂蚁的信息,并且重新选择起始位置为每只蚂蚁。根据几次的实验结果表明,在迭代次数较大的时候(>1000)基本在250次迭代以内就能达到收敛路径长,即达到局部最优。由于每次试验的结果不同,也表明蚁群算法容易陷入局部最优,而非每次都可以得到全局最优,当然,迭代次数少,可能最优的路径长还未得到就已经迭代结束。由于没有与其他算法作比较,对于蚁群算法收敛速度慢这个缺陷无法比较。

(2)

路径误差:

图三

2.3、数据来源

本次试验数据来源于TSPLib,http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/。为方便实验,数据只要包含城市总数,城市编号,城市横纵坐标即可。

图四为算法数据流程图:

图四

论文中的算法描述:

3、算法实现描述

工程主要包括:蚂蚁类、蚁群算法、主调程序。

3.1、蚂蚁类主要包括以下几点:

顺序参观城市记录 int[]tour,城市是否参观记录int[] unvisitedcity,蚂蚁所走的总路长int tourlength,城市数目;方法主要有随机城市选择函数void RandomSelectCity(int citycount),下一个城市选择函数void SelectNextCity(int index,double[][]tao,int[][]distance)和总路程长度计算函数void CalTourLength(int [][]distance)。

3.2、蚁群算法主要包括以下几点:

数据成员:

ant []ants; //定义蚂蚁群

int antcount;//蚂蚁的数量

int [][]distance;//表示城市间距离

double [][]tao;//信息素矩阵

int citycount;//城市数量

int[]besttour;//求解的最佳路径

int bestlength;//求的最优解的长度

方法成员:

初始化函数,初始化文件信息,信息素矩阵,上述变量,蚂蚁初始位置等信息void init(String filename,int antnum)。

蚁群算法主要运行程序,包括迭代次数为实验参数,记录每一只蚂蚁的行进过程,计算本次迭代的这群蚂蚁的最优路径长,如果出现更短的路径,更新路径记录变量,迭代一次之后更新信息素矩阵以及蚂蚁重新初始化最初位置,知道到达指定迭代次数,输出收敛路径长。经过几次试验表明,一般在100次内可以达到一个收敛值,后续的若干次的剩余的迭代次数输出的路径长基本不变了。但是必须要到指定的迭代次数才会停止实验。

3.3、主程序包括以下几点:

调用蚁群算法,给定蚂蚁数量,城市信息文件,迭代次数,最后输出最优(局部)路径结果。蚁群算法内部,在对蚂蚁行进记录时会调用蚂蚁类的城市选择函数。

3.4、类关系图:

1 import java.io.*;2 /**

3 *蚁群优化算法,用来求解TSP问题4 */

5 public classACO {6

7 ant []ants; //定义蚂蚁群

8 int antcount;//蚂蚁的数量

9 int [][]distance;//表示城市间距离

10 double [][]tao;//信息素矩阵

11 int citycount;//城市数量

12 int[]besttour;//求解的最佳路径

13 int bestlength;//求的最优解的长度14 //filename tsp数据文件15 //antnum 系统用到蚂蚁的数量

16 public void init(String filename,int antnum) throwsFileNotFoundException, IOException{17 antcount=antnum;18 ants=newant[antcount];19 //读取数据tsp里的数据包括第I个城市与城市的X,Y坐标

20 int[] x;21 int[] y;22 String strbuff;23 BufferedReader tspdata = new BufferedReader(new InputStreamReader(newFileInputStream(filename)));24 strbuff = tspdata.readLine();//读取第一行,城市总数(按文件格式读取)

25 citycount =Integer.valueOf(strbuff);26 distance = new int[citycount][citycount];27 x = new int[citycount];28 y = new int[citycount];29 for (int citys = 0; citys < citycount; citys++) {30 strbuff =tspdata.readLine();31 String[] strcol = strbuff.split(" ");32 x[citys] = Integer.valueOf(strcol[1]);//读取每排数据的第2二个数字即横坐标

33 y[citys] = Integer.valueOf(strcol[2]);34 }35 //计算两个城市之间的距离矩阵,并更新距离矩阵

36 for (int city1 = 0; city1 < citycount - 1; city1++) {37 distance[city1][city1] = 0;38 for (int city2 = city1 + 1; city2 < citycount; city2++) {39 distance[city1][city2] = (int) (Math.sqrt((x[city1] - x[city2]) * (x[city1] -x[city2])40 + (y[city1] - y[city2]) * (y[city1] -y[city2])));41 distance[city2][city1] = distance[city1][city2];//距离矩阵是对称矩阵

42 }43 }44 distance[citycount - 1][citycount - 1] = 0;45 //初始化信息素矩阵

46 tao=new double[citycount][citycount];47 for(int i=0;i

56 for(int i=0;i

62 public void run(intmaxgen){63 for(int runtimes=0;runtimes>>"+runtimes);66 //每一只蚂蚁移动的过程

67 for(int i=0;i

70 }71 //计算蚂蚁获得的路径长度

72 ants[i].CalTourLength(distance);73 if(ants[i].tourlength

75 bestlength=ants[i].tourlength;76 //runtimes仅代表最大循环次数,但是只有当,有新的最优路径的时候才会显示下列语句。77 //如果后续没有更优解(收敛),则最后直接输出。

78 System.out.println("第"+runtimes+"代(次迭代),发现新的最优路径长度:"+bestlength);79 for(int j=0;j

81 }82 }83 //更新信息素矩阵

84 UpdateTao();85 //重新随机设置蚂蚁

86 for(int i=0;i

92 * 更新信息素矩阵93 */

94 private voidUpdateTao(){95 double rou=0.5;96 //信息素挥发

97 for(int i=0;i

101 for(int i=0;i

109 public voidReportResult(){110 System.out.println("最优路径长度是"+bestlength);111 System.out.println("蚁群算法最优路径输出:");112 for(int j=0;j>");//输出最优路径

114 }115 }

1 importjava.util.Random;2 /*

3 蚂蚁类4 */

5 public classant {6 /**

7 * 蚂蚁获得的路径8 */

9 public int[]tour;//参观城市顺序10 //unvisitedcity 取值是0或1,1表示没有访问过,0表示访问过

11 int[] unvisitedcity;12 /**

13 * 蚂蚁获得的路径长度14 */

15 public int tourlength;//某蚂蚁所走路程总长度。

16 int citys;//城市个数

17 /**

18 * 随机分配蚂蚁到某个城市中19 * 同时完成蚂蚁包含字段的初始化工作20 *@paramcitycount 总的城市数量21 */

22 public void RandomSelectCity(intcitycount){23 citys=citycount;24 unvisitedcity=new int[citycount];25 tour=new int[citycount+1];26 tourlength=0;27 for(int i=0;i

31

32 long r1 = System.currentTimeMillis();//获取当前时间

33 Random rnd=newRandom(r1);34 int firstcity=rnd.nextInt(citycount);//随机指定第一个城市

35 unvisitedcity[firstcity]=0;//0表示访问过

36 tour[0]=firstcity;//起始城市

37 }38 /**

39 * 选择下一个城市40 *@paramindex 需要选择第index个城市了41 *@paramtao 全局的信息素信息42 *@paramdistance 全局的距离矩阵信息43 */

44 public void SelectNextCity(int index,double[][]tao,int[][]distance){45 double[]p;46 p=new double[citys];//下一步要走的城市的选中概率47 //计算选中概率所需系数。

48 double alpha=1.0;49 double beta=2.0;50 double sum=0;51 int currentcity=tour[index-1];//蚂蚁所处当前城市52 //计算公式中的分母部分(为下一步计算选中概率使用)

53 for(int i=0;i

55 sum+=(Math.pow(tao[currentcity][i], alpha)*

56 Math.pow(1.0/distance[currentcity][i], beta));57 }58 //计算每个城市被选中的概率

59 for(int i=0;i

62 else{63 //没走过,下一步要走这个城市的概率是?

64 p[i]=(Math.pow(tao[currentcity][i], alpha)*

65 Math.pow(1.0/distance[currentcity][i], beta))/sum;66 }67 }68 long r1 =System.currentTimeMillis();69 Random rnd=newRandom(r1);70 double selectp=rnd.nextDouble();71 //轮盘赌选择一个城市;

72 double sumselect=0;73 int selectcity=-1;74 //城市选择随机,直到n个概率加起来大于随机数,则选择该城市

75 for(int i=0;i

76 sumselect+=p[i];77 if(sumselect>=selectp){78 selectcity=i;79 break;80 }81 }82 if (selectcity==-1)//这个城市没有走过

83 System.out.println();84 tour[index]=selectcity;85 unvisitedcity[selectcity]=0;86 }87 /**

88 * 计算蚂蚁获得的路径的长度89 *@paramdistance 全局的距离矩阵信息90 */

91 public void CalTourLength(int[][]distance){92 tourlength=0;93 tour[citys]=tour[0];//第一个城市等于最后一个要到达的城市

94 for(int i=0;i

96 }97 }98 }

1 importjava.io.FileNotFoundException;2 importjava.io.IOException;3 importjava.util.logging.Level;4 importjava.util.logging.Logger;5 //蚁群算法求解旅行商问题,TSP数据来源6 //http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/

7 //数据中包括城市总量,每个城市的横纵坐标

8 public classMain {9 /**

10 *@paramargs the command line arguments11 */

12 public static voidmain(String[] args) {13 ACO aco;14 aco=newACO();15 try{16 aco.init("att48.txt", 100);//城市信息文件,蚂蚁数量

17 aco.run(1000);//迭代次数

18 aco.ReportResult();19 } catch(FileNotFoundException ex) {20 Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);21 } catch(IOException ex) {22 Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);23 }24 }25 }

java tsp问题_蚁群算法(Java)tsp问题相关推荐

  1. 蚁群算法java实现_蚁群算法java实现以及TSP问题蚁群算法求解

    1. 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题 ...

  2. java蚁群算法_蚁群算法JAVA版

    展开全部 说明:信息素权重,路径权重和信息素蒸发率对最后的结果影响很大,需要微调. 目前发现2 / 5 / 0.5 能达到稍e68a8432313133353236313431303231363533 ...

  3. tsp问题用蚁群算法java实现_TSP解决之道——蚁群算法

    参考 蚁群算法原理与应用1-自然计算与群体智能 简介 1.蚁群算法(Ant Clony Optimization,ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作 ...

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

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

  5. tsp java_蚁群算法java实现以及TSP问题蚁群算法求解

    1. 蚁群算法简介 蚁群算法(Ant Clony Optimization, ACO)是一种群智能算法,它是由一群无智能或有轻微智能的个体(Agent)通过相互协作而表现出智能行为,从而为求解复杂问题 ...

  6. 【运筹优化】ACO蚁群算法求解TSP问题(Java实现)

    文章目录 代码 Ant蚂蚁类 AntColonyOptimization_TSP蚁群算法类 运行结果 代码 Ant蚂蚁类 import lombok.Data;import java.util.Arr ...

  7. 蚁群算法-JAVA实现

    蚁群算法 基本思想 蚂蚁靠什么找出最短路径? • 信息素:信息素是一种由蚂蚁自身释放的易挥发的 物质,能够实现蚁群内的间接通信.蚂蚁在寻找食 物时,在其经过的路径上会释放信息素,信息素可 以被其他的蚂 ...

  8. 蚁群算法解决TSP问题

    原文转载于https://www.cnblogs.com/biaoyu/archive/2012/09/26/2704456.html 蚁群算法简介 蚁群算法(Ant Clony Optimizati ...

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

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

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

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

最新文章

  1. 工作发狂:Mybatis 中$和#千万不要乱用!
  2. Nature子刊:干旱条件下土壤细菌网络的稳定性不如真菌网络
  3. Android10.0 Binder通信原理(三)-ServiceManager篇
  4. Laravel增加自定义助手函数
  5. SpringBoot中使用thymeleaf模板时select下拉框怎样查询数据库赋值
  6. PHP 自学教程之MySQL数据库
  7. 科学前进的车轮永不停歇 2018-04-28
  8. ASP.NET MVC中ViewData、ViewBag和TempData
  9. json套json_JSON –拯救杰克逊
  10. 微擎php5.6无法上传图片,解决PHP5.6版本“No input file specified”的问题
  11. 【12-05】面试题
  12. C#学校有近千名学生,在操作上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数。
  13. aspen压缩因子_利用aspen plus进行物性参数的估算
  14. android7 es文件,让你更了解你的手机 – ES 文件管理器 #Android
  15. 页面不调转改变浏览器地址栏的方法
  16. android使用popupwindow仿微信点赞功能
  17. Mac pro 突然没有办法按住shift打出大写S
  18. RSA 2022/8/17
  19. postgresql 手动启动_postgresql怎么启动
  20. 一日一Shader·天空镜面反射【SS_26】

热门文章

  1. 200中国姓氏日语发音
  2. Maven - Maven3实战学习笔记(3)使用maven构建Web应用
  3. wkhtmltox html快速转成image或pdf
  4. HNOI2013 切糕
  5. shell脚本 空格
  6. WPF 使用MultiBinding ,TwoWay ,ValidationRule ,需要注意的事项
  7. Java的日期格式化常用方法
  8. ASP实例代码:搞个长文章分页代码
  9. 人的大脑是如何识别运动物体
  10. 20200517每日一句