遗传算法解决TSP问题

1实验环境

实验环境:CPU [email protected],内存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),很接近了,但不是最优。

谢 谢!     未 完 待 续 ...

时间: 2024-10-24 10:52:29

遗传算法解决TSP问题的相关文章

用遗传算法解决TSP问题

浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(mzf\)在踏上寻找\(oxy\)的路程之后不小心碰到了大魔王\(fater\). 大魔王看了看\(mzf\)的命运,心生怜悯,便给\(mzf\)和自己做一个交换的机会. 这个交换是这样的: 由于\(oxy\)不知在天涯海角,\(mzf\)的要找到实在是太难了.所以大魔王愿意把\(mzf\)和\(oxy\)同时扔到一个迷宫(\(n\)个点的完全无向图)里,但是\(o

tsp问题——遗传算法解决

TSP问题最简单的求解方法是枚举法.它的解是多维的.多局部极值的.趋于无穷大的复杂解的空间,搜索空间是n个点的所有排列的集合,大小为(n-1)!.可以形象地把解空间看成是一个无穷大的丘陵地带,各山峰或山谷的高度即是问题的极值.求解TSP,则是在此不能穷尽的丘陵地带中攀登以达到山顶或谷底的过程. 这一篇将用遗传算法解决TSP问题. 1)评价.这个评价算法应该比较简单了,就是找计算总距离,小的为优.目标函数转化为适应度函数可以取倒数. 2)突变.为了防止重复访问,不能随机的进行突变.因为每个城市只能

蚁群算法解决TSP问题

一.论述 1.算法来源 蚁群算法的基本原理来源于自然界蚂蚁觅食的最短路径原理,根据昆虫学家的观察,发现自然界的蚂蚁虽然视觉不发达,但它可以在没有任何提示的情况下找到从食物源到巢穴的最短路径,并且能在环境发生变化(如原有路径上有了障碍物)后,自适应地搜索新的最佳路径. 2.单个蚂蚁寻找路径 正反馈: 单个的蚂蚁为了避免自己迷路,它在爬行时,同时也会释放一种特殊的分泌物--信息素(Pheromone),而且它也能觉察到一定范围内的其它蚂蚁所分泌的信息素,并由此影响它自己的行为.当一条路上的信息素越来

遗传算法求解TSP源码及解析

1.算法效果 图 1?1算法效果1 图 1?2算法效果2 2.原理说明 TSP问题是指假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市.路径的选择目标是要求得的路径路程为所有路径之中的最小值.本文使用遗传算法解决att30问题,即30个城市的旅行商问题. 旅行商问题是一个经典的组合优化问题.一个经典的旅行商问题可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地.应如何选择

基于遗传算法求解TSP问题(Java界面)

近期为做展示,改写了一个遗传算法求TSP的Java界面版,思路代码和 http://blog.csdn.net/wangqiuyun/article/details/12838903 这篇文章思路是一样的,追加了Java用Graphics画点及画线做路径展示,展示部分做得比較粗糙,须要的拿走,效果图例如以下. 下载地址:http://download.csdn.net/detail/wangqiuyun/7406201 另C#界面版:http://blog.csdn.net/wangqiuyun

【高级算法】遗传算法解决3SAT问题(C++实现)

转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46910079 1 SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 全然问题.在定义可满足性问题SAT之前,先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使A为真. 显然,如A为真,则CNF的每一个子句中必有一个命题变元为1(真). 2 遗传算法

遗传算法解决3SAT问题(C++实现代码)

1 SAT问题描述 命题逻辑中合取范式 (CNF) 的可满足性问题 (SAT)是当代理论计算机科学的核心问题, 是一典型的NP 完全问题.在定义可满足性问题SAT之前,先引进一些逻辑符号. 一个 SAT 问题是指: 对于给定的 CNF 是否存在一组关于命题变元的真值指派使A为真. 显然,如A为真,则CNF的每个子句中必有一个命题变元为1(真). 2 遗传算法 遗传算法类似于自然进化,通过作用于染色体上的基因寻找好的染色体来求解问题.与自然界相似,遗传算法对求解问题的本身一无所知,它所需要的仅是对

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 22.3900 93.3700 25.2300 97.2400 22.0000 96.0500 20.4700 97.0200 17.2000 96.2900 16.3000 97.3800 14.0500 98.1200 16.5300 97.3800 21.5200 95.5900 19.4100

遗传算法解决0-1背包问题

1 import numpy 2 import matplotlib.pyplot as plt 3 4 5 data = numpy.array([[77, 92], 6 [22, 22], 7 [29, 87], 8 [50, 46], 9 [99, 90]]) 10 11 12 class GA(object): 13 """ 14 遗传算法解决0-1背包问题 15 """ 16 17 def __init__(self, length,