TSP问题求解方法

ACM-图论 专栏收录该内容
10 篇文章 0 订阅

原文

一名旅行商准备前往若干个城市推销他的产品,他想要从驻地出发,经过每个城市恰好一次,最后返回驻地,求满足条件的最短路径。这便是旅行商问题。旅行商问题是一个NP问题,至今尚未有准确的解法,现有的算法只能尽可能减小误差。目前最优的算法能在误差1%范围内估计上百万个城市的问题。

改良圈算法

改良圈算法的思想是首先求出一个哈密顿圈C,然后通过适当地修改哈密顿圈得到具有较小权值的另一个哈密顿圈。设初始圈 C=v1v2...vnv1

对于 1i<i+1<jn ,构造新的哈密顿圈,即删去边 vivi+1 和边 vjvj+1 ,添加边 vivj 和边 vi+1vj+1 得到的。

Cij=v1v2...vivjvj1vj2...vi+1vj+1...vnv1

ω(vivj)+ω(vi+1vj+1)<ω(vivi+1)+ω(vj,vj+1) 则用 Cij 代替 C ,Cij称为 C 的改良圈.

重复执行以上操作直至无法改进。

动态规划

动态规划的思想也比较简单,只需要用二进制来存储当前的状态(即当前已经走过的城市),dp(i,j)表示状态为 i ,从城市j出发的最短路径,转移方程如下

dp(i,j)=min(dp(i&u,j)+d(j,u)

遗传算法

遗传算法是一种启发式算法,适合解决TSP这种不确定性问题,遗传算法的主要步骤概括为 ,套用到旅行商问题上关键在于模型的建立,即如何初始化,如何选择(适应性评价方法),如何交叉变异

新群体产生

新群体产生可以随机生成几组1~n的排列,1~n为城市编号。排列1,3,4,2表示从1出发依次经过3,4到达2再返回到1。

选择

遗传算法每一轮选择适应度高的个体,可以使用路径长度的倒数或者相反数来评价个体的适应性。每一轮选择适应度高的个体

交叉

将父代样本两两分组,对染色体的某一段进行交叉,如

​ 9 5 1 | 3 7 4 2 | 10 8 6

​ 10 5 4 | 6 3 8 7 | 2 1 9

交叉为

​ 9 5 1 | 6 3 8 7 | 10 8 6

​ 10 5 4 | 3 7 4 2 | 2 1 9

对于有冲突的数字则将非交叉位置的重复数字用原位置的数代替,可以采用逐个交换,逐个代替的方法,如染色体1中的位置4与染色体2的位置4交换,即染色体1上位置4的数字变成6。6在染色体1中在第10位,则只需将染色体1位置4与位置10交换即可,染色体2也进行类似的操作

交叉后两条染色体变成

​ 9 5 1 | 6 3 8 7 | 10 4 2

​ 10 5 8 | 3 7 4 2 | 6 1 9

变异

变异的过程比较简单,随机选取几条染色体,并对每条染色体随机取两个位置,交换两个位置的数字即可。

进化逆转

随机去两个位置,将这两个位置中间的数反向,保留原染色体和反向后的染色体中适应性较强的染色体。

  • 2
    点赞
  • 2
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值