TSP、MTSP问题遗传算法详细解读及python实现

写在前面

遗传算法是一种求解NPC问题的启发式算法,属于仿生进化算法族的一员。仿生进化算法是受生物行为启发而发明的智能优化算法,往往是人们发现某种生物的个体虽然行为较为简单,但生物集群通过某种原理却能表现出智能行为。于是不同的人研究不同的生物行为原理,受到启发而发明出新的仿生进化算法。比如免疫优化算法,蚁群算法,模拟退火算法等,这些算法以后也会简单介绍。
本文的主题是遗传算法,该算法也是受到生物行为启发。物竞天择,适者生存,优胜劣汰,是该优化算法的核心思想。笔者在业务中需要用到遗传算法求解TSP问题,但是网上能查找到的资料对遗传算法的讲解不够通俗易懂,往往上来就是遗传变异交叉,对于我这样的初学者来说有点不知所云,于是不得不直接看源码,一行一行地理解代码的意思,才弄懂了原理。这种方法对于初学者和编程基础薄弱者颇为困难,而且费时费力,苦不堪言。同时,由于读者可能熟练掌握的是不同的语言,因此若代码是某一种语言编写的,那么掌握其他语言的读者很可能难以吸收,浪费了资源。此外,网上关于TSP问题的资料很多,但是关于MTSP问题的资料却凤毛麟角。因此有了创作本文的意图,旨在用最通俗详尽的语言深入浅出地解释遗传算法解TSP、MTSP问题的原理及应用

遗传算法解TSP问题原理

一、TSP问题

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
想要求解出TSP问题的最优解,目前唯一的方法是穷举出所有的路径。然而,路径的数量级是n!,也就是目标点数量的阶乘。当n为14时,n!已经大于800亿。当n更大,为30,40 时,更是天文数字,即使计算机一秒钟计算一亿次,其求解时间也远大于我们的寿命。因此,穷举法解TSP问题根本不可行,需要别的启发式算法来代替。

二、遗传算法解TSP原理

2.1

笔者认为,大多数的遗传算法讲解让人难以理解的原因在于其术语名称的意义不明确,往往与其实际意义相去甚远。譬如,什么是适应度函数,什么是遗传,变异,交叉。乍一听总有不知所云的感觉,这跟TSP问题求最短路径有什么关系。因此本文将从TSP问题出发,讲解遗传算法的思想和原理。

2.2

对于TSP问题,我们拿到的是n个目标点的坐标,作为例子,我们视为面对的是n=10个城市。有了坐标,我们便可以计算出n个城市之间的距离,得到一个n*n的矩阵,这个矩阵表示的是城市之间两两连接形成的无向图,边的权重是城市之间的距离,而TSP问题则是从图中找出一个包含所有城市的最小的环。

2.3

问题明确了,接下来就是遗传算法登场了。

2.3.1 种群初始化

首先是初始化种群,TSP里的初始化种群其实就是一个长度为n=10的包含1~n(这个例子里为10)且不含重复元素的序列,其意义就是一个人从某个点出发,随机访问下一个未访问过的城市,直到所有的城市都访问完毕,他再从最后一个城市返回出发城市。他的轨迹就是一个包含了所有城市且没有重复访问的环。种群数量设为M,那么该种群初始化的意义就是M个人独立、随机、不重复地访问一遍各个城市,单个个体轨迹构成一个环。

2.3.2 适应度计算

M个个体的轨迹得到了,这些轨迹是随机游走得到的,当然很可能远远不包含属于最优解,而是比最优解坏得多。但是,随机游走的路径也有大有小,有好有坏。因此需要有一个函数衡量个体的好坏,也就是环路径的长短。
那么这个函数就被称为适应度函数,其功能是衡量个体的好坏。对于TSP问题,其适应度函数当然是距离相关的了。个体的好坏,衡量标准就是该个体序列的路径长度。路径越长,个体越“坏”,路径越短,个体越“好”。因此,设序列为x,那么该序列的路径长度便是d(x),而适应度函数则应该取为1/d(x),适应度越大,个体越优。

2.3.3 选择

有了每个个体的适应度,就能评价每个个体的好坏。物竞天择,优胜劣汰,将优秀的个体选择出来进行交配,以期得到更好的个体,并由此不断进化,一代代传承,后代不断比前一代变得更好,最终收敛,种群中的某个个体达到了优秀的极限,便是最优解。
对于TSP问题,选择的具体操作是,计算出所有个体的适应度,也就是路径距离的倒数。然后将所有个体的适应度归一化,得到概率。然后从数量为n的个体中以轮盘赌的形式选择出若干个个体,视为优秀个体。
举个例子,为了简单起见,设种群大小m=4。并计算出了四个个体的适应度分别为1,2,3,4。对适应度进行归一化得到概率:0.1,0.2,0.3,0.4。那么这四个概率就可以构成一个轮盘,每个个体对应的被选择的概率分别为0.1,0.2,0.3,0.4。随后,在这个转盘上转动m次,此处为4。将选中的个体放入一个集合,未选中的个体抛弃。
注意,这是一种重复抽样的选择方式,并且重复抽到的个体不去重。每次抽样,轮盘都是相同的轮盘,并没有改变。比如,在这个例子中,种群数量为4,那么就要抽取四次,那么0.4对应的个体很可能被多次抽样,而0.1对应的个体很可能未被抽到,直接淘汰。那么被选择的个体集合就很可能含有多个适应度为4的个体,并且被选择的集合的种群数量仍旧为m,只不过抛弃了较坏的个体,而可能保留了多个优秀的个体。个体越优秀,被重复选择的概率就越大。

2.3.4 交叉(遗传)

遗传算法中的交叉属于遗传算法的核心以及关键步骤,其思想受启发于生物遗传中的染色体交叉。
对于TSP问题,有如下的交叉方式进行交叉。

  1. Partial-Mapped Cross

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值