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问题的更多相关文章

  1. 转:遗传算法解决TSP问题

    1.编码 这篇文章中遗传算法对TSP问题的解空间编码是十进制编码.如果有十个城市,编码可以如下: 0 1 2 3 4 5 6 7 8 9 这条编码代表着一条路径,先经过0,再经过1,依次下去. 2.选 ...

  2. 遗传算法解决TSP问题实现以及与最小生成树的对比

    摘要: 本实验采用遗传算法实现了旅行商问题的模拟求解,并在同等规模问题上用最小生成树算法做了一定的对比工作.遗传算法在计算时间和占用内存上,都远远优于最小生成树算法. 程序采用Microsoft vi ...

  3. 用遗传算法解决TSP问题

    浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(小m\)在踏上寻找\(小o\)的路程之后不小心碰到了大魔王\(fat ...

  4. tsp问题——遗传算法解决

    TSP问题最简单的求解方法是枚举法. 它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间.搜索空间是n个点的全部排列的集合.大小为(n-1)! .能够形象地把解空间看成是一个无穷大的丘陵地带,各山 ...

  5. 遗传算法解决寻路问题——Python描述

    概要 我的上一篇写遗传算法解决排序问题,当中思想借鉴了遗传算法解决TSP问题,本质上可以认为这是一类问题,就是这样认为:寻找到一个序列X,使F(X)最大. 详解介绍 排序问题:寻找一个序列,使得这个序 ...

  6. 遗传算法解决旅行商问题(TSP)

    这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...

  7. 基础遗传算法的TSP问题

    一.简介 旅行商问题是一个经典的组合优化问题.一个经典的旅行商问题可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地.应如何选择行进路线,以使总的 ...

  8. C++实现禁忌搜索解决TSP问题

    C++实现禁忌搜索解决TSP问题 使用的搜索方法是Tabu Search(禁忌搜索) 程序设计 1) 文件读入坐标点计算距离矩阵/读入距离矩阵 for(int i = 0; i < CityNu ...

  9. 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 ...

随机推荐

  1. 【距离GDOI:130天】 AC自动机ing

    弄完后缀数组,终于能安心来复习AC自动机了..其实当时学的很不好,非常不好..模版都是有问题的...今天花了第一节晚修和一节自习算是把AC自动机的基础弄好了...切掉3道基础题,然后就被某道坑爹题坑掉 ...

  2. spark与storm比对与选型

    大数据实时处理平台市场上产品众多,本文着重讨论spark与storm的比对,最后结合适用场景进行选型. 一.spark与storm的比较 比较点 Storm Spark Streaming 实时计算模 ...

  3. POJ3717 Decrypt the Dragon Scroll

    Description Those who have see the film of "Kong Fu Panda" must be impressive when Po open ...

  4. P1613 跑路 (最短路,倍增)

    题目链接 Solution 发现 \(n\) 只有 \(50\), 可以用 \(floyd\) . 然后 \(w[i][j][l]\) 代表 \(i\) 到 \(j\) 是否存在 \(2^l\) 长的 ...

  5. atan 和 atan2

     转自http://blog.csdn.net/chinabinlang/article/details/6802686 atan函数与atan2函数的一点区别 . atan 和 atan2 都是求反 ...

  6. ARM嵌入式开发中的GCC内联汇编__asm__

    在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...

  7. 基于CSOCKET的Client简单实例(转)

    原文转自 http://blog.csdn.net/badagougou/article/details/78410382 第一步:创建一个基类为CSOCKET类的新类,Cclient,并在主对话框类 ...

  8. Android Sshd使用

    1. 介绍 因为某些原因, 笔者需要在android上开发,  使用adb比较麻烦, 于是想使用sshd. 推荐的软件是openssh, 其他选择有dropbear, mosh.当然还有其他选择, 如 ...

  9. 打印PE目录数据信息

    printf("数据目录信息:\n"); PIMAGE_DATA_DIRECTORY MyDataDir; MyDataDir = PIMAGE_DATA_DIRECTORY((& ...

  10. java模拟生日发祝福

    1.新建customer表生日都选为当天 所需jar包 2.使用c3p0连接到数据的xml配置文件 3.连接数据库的工具类 package com.cc.birthday; import java.s ...