python实现遗传算法实例_遗传算法求解旅行商问题

导语:旅行商问题(Traveling Saleman Problem,TSP)是比较经典的运筹学优化问题,在离散组合优化中研究较多,具有较为广泛的工程应用和现实生活背景,如飞机航线的安排、公路网络的建设、物流货物配送等, 所有这些实际应用问题均可以转变为 TSP 问题来解决。该问题是在寻求单一旅行商由某一城市出发,经过所有给定的城市之后,最后再回到出发城市的最短路径,属于车辆路径问题(Vehicle Routing Problem,VRP)的一个特例,当1辆货车由物流中心出发,在满足载货量约束及路程约束前提下,依次通过各客户点,最后返回物流中心,此时该问题就转化为旅行商问题。该问题规则虽然简单,但在城市数目增多后可行解的数量呈几何级增长,出现组合爆炸现象,难以在合理时间内求出精确最优解。本文从最基本的旅行商问题入手,学习如何使用遗传算法求解旅行商问题。

1、概述

旅行商问题(Traveling Saleman Problem,TSP)是指单一的旅行商需要到n个城市去推销商品,要求从某一城市出发,经过n-1个城市,旅行商在途径的(n-1)个城市能且仅能经过一次,再回到出发城市,使得旅行商的路程最短。本文以中国知网发表的高引用文章作参考,以旅行商的路径最短为目标函数,约束条件为:除出发城市外,其余城市必须经过且只能经过1次。

2、遗传算法

遗传算法(Genetic Algorithm, GA)是一种较为经典的智能优化算法,经大量的研究表明,其在求解离散组合优化问题中有着优异的表现。遗传算法的思想为优胜劣汰,通过交叉操作、变异操作获得多样性的解,在下一代中保留目标函数最优的解,并通过轮盘赌方式选择下一代个体,不断循环迭代,从而不断优化问题的解。遗传算法求解旅行商问题的步骤与求解车辆路径问题相同,仅在解码操作和计算目标值方面不同,因两个问题采用的编码方式相同(染色体均为互不相同的一组整数排列),所以遗传算法的交叉操作、变异操作、选择操作可不发生变化(遗传操作详见文章《遗传算法》:https://zhuanlan.zhihu.com/p/125779424)。

2.1 编码

旅行商问题为离散优化问题,根据约束条件除出发城市外,其余城市必须经过且只能经过1次,采用城市编号的排列作为编码方式,并默认一组排列的第1个城市为出发城市。例如城市规模为8,根据编码规则,一组染色体为2-4-1-6-8-3-5-7,表示旅行商从城市2出发,依次经过城市4、1、6、8、3、5、7,最后回到城市2。

2.2 计算目标值

旅行商问题的解为一组遍历所有城市的路径,一般我们可以得到各城市的坐标(x i,y i)、(x j,y j),将其转换为城市间的距离D:
%% 计算两两城市之间的距离%输入 a  各城市的位置坐标%输出 D  两两城市之间的距离function D=Distanse(a)row=size(a,1);D=zeros(row,row);for i=1:rowfor j=i+1:rowD(i,j)=((a(i,1)-a(j,1))^2+(a(i,2)-a(j,2))^2)^0.5;D(j,i)=D(i,j);endend
根据编码方式,目标值等于旅行商行驶路径上相邻城市间的距离加上最后到达城市与出发城市间的距离和。该编码方式下的旅行商路径均为可行解,且只有1条路径,因此无须进行解码操作。

2.3 遗传操作

遗传算法包括三个遗传操作:交叉、变异、选择。遗传操作的设计是遗传策略的主要组成部分,也是调控和控制进化的重要工具。交叉操作、变异操作主要是根据父代的基因信息来产生新解,新解中包含了父代的部分信息,其中交叉操作从单个父代遗传下来的片段较少,新解的变化程度较大,变异操作从父代遗传下来的片段较多,新解的变化程度较小,分别对应了遗传算法的广度搜索和深度搜索策略,通过交叉概率和变异概率来达到广度搜索与深度搜索的平衡,既能搜索到较优的局部最优解,又能以一定概率跳出局部最优解;选择操作则是根据目标值大小来判断解的优劣,在最小化优化问题中,目标值较小的解更加优秀,根据选择操作从种群中淘汰掉较劣的解,并挑选优秀的解作为下一代的种群。

2.4 算法验证

采用 Matlab 2010b编写求解 TSP 问题的遗传算法,并选用 TSPLIB测试库实例dantzig42进行测试,该实例中的城市数量为42个,要求规划旅行商的城市路线,最后回到出发城市,使旅行商行驶路程最短。

首先在遗传算法中加载问题数据,并设置遗传算法的参数,通过GA_TSP求得最优解【8-3-4-7-6-5-2-1-42-41-40-39-38-37-36-35-34-33-32-31-30-29-28-21-20-19-18-15-14-13-16-17-22-23-12-11-24-27-26-25-10-9-8】。GA_TSP求解实例dantzig42的最短距离为【691.5183】,TSPLIB测试库提供的最短距离为【699】,本文算法求得了比测试库提供的更优的解,验证了算法的正确性。

python实现遗传算法实例_遗传算法求解旅行商问题_第1张图片  python实现遗传算法实例_遗传算法求解旅行商问题_第2张图片

本文采用matlab实现了求解旅行商问题的遗传算法,因时间和精力有限,该算法还有很大的进步空间,比如可以采用多种交叉、变异操作来提高解的质量,可以优化算法结构,缩短运行时间,在大规模问题上的求解质量还有待提高。【 以上内容仅供交流,于2020年4月29日】 如有疑问请及时交流,后面我也会将大家的疑问整理出来,或者有更好的建议也请提给我,最后谢谢大家阅读。

附录:

1、【遗传算法求解车辆路径问题】

https://zhuanlan.zhihu.com/p/125779424

2、TSPLIB测试库

http://elib.zib.de/pub/mp-testdata/tsp/tsplib/tsp/index.html

你可能感兴趣的:(python实现遗传算法实例,双调欧几里得旅行商问题,遗传算法matlab,遗传算法实数编码实例,遗传算法经典实例)