遗传算法解决TSP问题
1实验环境
实验环境:CPU i5-2450M@2.50GHz,内存6G,windows7 64位操作系统
实现语言:java (JDK1.8)
实验数据:TSPLIB,TSP采样实例库中的att48数据源
数据地址:http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/att48.tsp.gz
TSPLIB是一个从各种来源和各种类型中产生的TSP及其相关问题的采样实例库,这里选取TSP采样实例库中的att48数据源,最优值为10628。该数据源中有48个地点坐标,实验过程是基于这48个坐标求解TSP问题。

2 TSP问题回顾
旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
3 TSP问题常见解法
|
算法 |
优点 |
缺点 |
|
穷举法(暴力) |
实现简单 |
时间和空间复杂度太大,不适合解决城市数太多的情况。 |
|
贪心算法 |
实现简单、计算速度快 |
容易得出局部最优解而不是全局最优解。 |
|
动态规划 |
随着城市数的增加,计算量大大减少,得到了中间各点到终点的最短路径。 |
同样不适合处理城市数太多的情况。 |
以上三种常见算法都各自的问题,穷举法和动规不能解决城市数多的情况,而贪心法在城市数少的时候都有可能得不到全局最优解,那么是否存在既能解决城市数多的情况又能得到最优呢?遗传算法。
4遗传算法
遗传算法(Genetic Algorithm)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
5 算法实现步骤
5.1初始化阶段
初始化对象:种群规模、城市数量、运行代数、交叉概率、变异概率
初始化数据:读入数据源,将坐标转换为距离矩阵(标准化欧式距离)
初始化种群:随机生成n个路径序列,n表示种群规模。
5.2.计算种群适应度
这里表示每条路径求和。
5.3计算累计概率
计算初始化种群中各个个体的累积概率
5.4迭代
选择算子:赌轮选择策略挑选下一代个体。
交叉运算:第k个算子和k+1个算子有一定的概率交叉变换,k=0、2、4、...、2n
变异运算:每个算子有一定概率基因多次对换,概率处决与变异概率
计算新的种群适应度以及个体累积概率,并更新最优解。
将新种群newGroup复制到旧种群oldGroup中,准备下一代进化(迭代)
5.5输出
输出迭代过程中产生的最短路径长度、最短路径出现代数、以及最短路径
6关键算法
6.1 赌轮选择算法
又称比例选择方法.其基本思想是:各个个体被选中的概率与其适应度大小成正比.
具体操作如下:
(1)计算出群体中每个个体的适应度f(i=1,2,…,M),M为群体大小;
(2)计算出每个个体被遗传到下一代群体中的概率;

(3)计算出每个个体的累积概率;
(q[i]称为染色体x[i] (i=1, 2, …, n)的积累概率)


(4)在[0,1]区间内产生一个均匀分布的伪随机数r
(5)若r<q[1],则选择个体1,否则,选择个体k,使得:q[k-1]<r≤q[k]
成立;
(6)重复(4)、(5)共M次
6.2交叉算法
第k(k=0、2、4、...、2n)个算子和k+1个算子有一定的概率交叉变换,这个概率就是交叉概率。

6.3变异算法
每个算子有一定概率(变异概率)基因多次对换。
对一个算子,随机生成两个不相等的范围在[1,城市数]之间的随机整数。将该算子在这两个随机整数对应的位置的城市编号对换,进行上述n次对换,n也是一个[1,城市数]之间的随机整数。
7程序结果分析
主要参数:种群规模、城市数量、最大运行代数、交叉概率、变异概率
7.1种群规模对结果的影响
不变参数
|
最大运行代数 |
城市数量 |
交叉概率 |
变异概率 |
|
1000 |
10 |
0.9 |
0.09 |
10个城市最短长度为6178,路径:3->9->4->5->6->8->7->0->2->1->3
变参:种群规模
种群规模分别为10、20、30、40、50、100时的运行结果看excel-
sheet1
结论:上述情况下,当种群规模大于等于30的时候算法基本能得到正确解,达到40算法能100%得到最短路径,但是最佳路径出现代数并不稳定,当种群规模达到1000时稳定在50代之内得到正确结果。
7.2最大运行代数对结果的影响
不变参数
|
种群规模 |
城市数量 |
交叉概率 |
变异概率 |
|
30 |
10 |
0.9 |
0.09 |
10个城市最短长度为6178,路径:3->9->4->5->6->8->7->0->2->1->3
变参:最大运行代数
最大运行代数分别为50、100、200、300、500、1000、10000时的运行结果看excel- sheet2
结论:
上述情况下,当最大运行代数达到1000时算法运行结果趋于稳定(稳定得到最短路径),这时算法的效率比较高。
当达到10000时100%正确,但是最佳路径出现代数稳定在2000代以内,所以想要2000代之后的计算都是不必要的,算法的最大运行代数最优参数为2000。
7.3城市数量对结果的影响
不变参数
|
种群规模 |
最大运行代数 |
交叉概率 |
变异概率 |
|
30 |
1000 |
0.9 |
0.09 |
变参:城市数量
城市数量分别为5、8、10、12、15、48时的运行结果看excel-
sheet2
结论:上述情况下,当城市数量<=8时,算法100%的到正确解。当城市数量达到12时,这套参数已经不能得到最优解了,必须调整某些参数。调整分以下情况:
(1)其他参数不变,种群规模逐渐调到120时,算法结果稳定。
(2)其他参数不变,最大运行代数逐渐调到10000时,算法结果稳定。
(3)其他参数不变,交叉概率不管怎么调,算法都得不到最优解。但是将种群规模调大到40,交叉概率调为0.1时,算法结果趋于稳定
综合(1)(2)(3)发现似乎一开始交叉概率就有问题,对于该算法交叉概率应该调低。当交叉概率较高时无论是提高种群规模还是最大运行代数,代价都太大。
当城市数量为48时(最优解10628)
(1)
|
种群规模 |
最大运行代数 |
交叉概率 |
变异概率 |
|
1000 |
10000 |
0.1 |
0.09 |
算法运行时间为6s,算法结果(10937)优于贪心结果(12842),很接近了,但不是最优。
谢 谢! 未 完 待 续 ...
遗传算法解决TSP问题的更多相关文章
- 转:遗传算法解决TSP问题
1.编码 这篇文章中遗传算法对TSP问题的解空间编码是十进制编码.如果有十个城市,编码可以如下: 0 1 2 3 4 5 6 7 8 9 这条编码代表着一条路径,先经过0,再经过1,依次下去. 2.选 ...
- 遗传算法解决TSP问题实现以及与最小生成树的对比
摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...
- 用遗传算法解决TSP问题
浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(小m\)在踏上寻找\(小o\)的路程之后不小心碰到了大魔王\(fat ...
- tsp问题——遗传算法解决
TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...
- 遗传算法解决寻路问题——Python描述
概要 我的上一篇写遗传算法解决排序问题,当中思想借鉴了遗传算法解决TSP问题,本质上可以认为这是一类问题,就是这样认为:寻找到一个序列X,使F(X)最大. 详解介绍 排序问题:寻找一个序列,使得这个序 ...
- 遗传算法解决旅行商问题(TSP)
这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...
- 基础遗传算法的TSP问题
一.简介 旅行商问题是一个经典的组合优化问题.一个经典的旅行商问题可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地.应如何选择行进路线,以使总的 ...
- C++实现禁忌搜索解决TSP问题
C++实现禁忌搜索解决TSP问题 使用的搜索方法是Tabu Search(禁忌搜索) 程序设计 1) 文件读入坐标点计算距离矩阵/读入距离矩阵 for(int i = 0; i < CityNu ...
- SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu
%SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题——Jason niu X = [16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 2 ...
随机推荐
- 【普通の惨败】GDOI2015卖萌记
前记:这次可真的全程卖萌了.... Day 0 早早坐上前往广州的火车,然后转车到韶关 然后就到了偏远郊区的(准)四星酒店 周围连路灯都没有,极其僻静极其荒凉 大家都极其安静地回到自己房间复习 这一天 ...
- Avito Cool Challenge 2018:C. Colorful Bricks
C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色 ...
- 解决crlf 和 lf不同带来的冲突问题
crlf 和 lf 是文本换行的不同方式: crlf: "\r\n", windows系统的换行方式 lf: "\n", Linux系统的换行方式 他们之间的不 ...
- [转]Google gflags使用说明
gflags是什么: gflags是google的一个开源的处理命令行参数的库,使用c++开发,具备python接口,可以替代getopt. gflags使用起来比getopt方便,但是不支持参数的简 ...
- Appium+python自动化20-查看iOS上app元素属性【转载】
前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素Mac版的appium1.6的版 ...
- .apache.commons.io 源代码学习(二)FilenameUtils类
FilenameUtils是apache common io中一个独立的工具类,对其他没有依赖,看其源代码的import即可知道. import java.io.File;import java.io ...
- 搭建负载均衡的环境(利用虚拟机上的四台centos)
以下转载: 准备 l 系统:Centos6 (三台) l 负载均衡:LVS + keepalived l 服务器1:Http l 服务器2:Http ip配置 1.VIP(virtual ip): ...
- mac-command-line-doing
创建文件夹 mkdir myDirectory 新建文件 touch a.html 编辑文件 vim a.html 删除文件 rm a.html 删除整个文件夹 rm -rf myDirectory ...
- POJ 1741 Tree 树的分治
原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...
- bzoj 3462: DZY Loves Math II
3462: DZY Loves Math II Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 211 Solved: 103[Submit][Sta ...