遗传算法(GA)求解TSP问题

TSP

1.1问题描述

    给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起 始城市的最短回路。这里给定 10 个城市和两两之间的距离。如图 2.1 所示。
在这里插入图片描述

1.2 遗传算法求解
1.2.1 求解思路

    遗传算法是通过将优化函数的可能解表示成一个个体,每个个体用一定编码 方式形成基因,借助遗传算子,选择、交叉、变异操作,对种群进行演化,选择 出更适应环境的种群。
    在 TSP 问题中,我们将每一条访问城市的顺序编码为一个个体,每个种群有 n 个个体,即有 n 种访问顺序,同时,每个个体又有 9 个染色体,即[2,10]的随 机排列(城市 1 作为起始和终止城市,不进行粒子操作),代表访问城市的顺序。 通过每一代的演化,对粒子群进行位置、速度更新操作,选择合适个体(最优的 顺序)。
(1)编码:符号编码(G 编码)
(2)选择方式:采用轮盘赌/竞标赛选择方法,同时保留最优个体
(3)交叉方式:定义了两种交叉方法。循环交叉和单点交叉。 循环交叉(不进行 G 编码):从第一个父代第一个元素开始搜索第二个父 代对应索引的值,如果相等,则找到一个循环体,否则搜寻第二个父代对应 索引的值在第一个父代的索引,直达第二个父代的元素等于第一个父代的第 一个元素。循环体元素不变,其余元素互换形成交换。(如下示意图)
在这里插入图片描述
    循环交叉(进行 G 编码):先对个体进行 G 编码,任意产生一个交叉点的 位置,两个父代的交叉点到末尾的元素互换形成新的个体,在对新个体进行 G 解码。
在这里插入图片描述
(4)变异方式:定义了两种变异方法。常规变异和逆转变异。
    常规变异(进行 G 编码):首先对个体进行 G 编码。然后产生变异点位置 i, 然后产生变异值,变异值只在[1,n-i+1]中取值。最后对新个体进行 G 解码。
    逆转变异(不进行 G 编码):首先对随机产生两个变异点,对两点之间的子
串进行逆转,形成新的个体。
(5)适应度:为了能够让适应度高的个体保存下来,定义适应度为: f i t v a l u e = 2 / d i s t a n c e (1.1) fitvalue= 2/distance \tag{1.1} fitvalue=2/distance(1.1)其中 distance 为每个个体(路径)的距离。显然,如果距离最短,则适应 度最高,更利于遗传给后代。
(6)G 编码与解码:encode()函数用于对个体进行编码,对个体的第 i 个 元素编码值为个体第 i 个元素到末尾元素的升序排列对应的索引值。decode() 函数用于解码,解码思路,初始化数组 s=[2 3 4 5 6 7 8 9 10],从 G 码的第一 个元素开始,找到 s 中的位置,则为解码后的值,同时将 s 中该元素删除,依次 循环 G 码的所有元素。

在这里插入图片描述

1.2.2 流程图

在这里插入图片描述

1.3 结果

在这里插入图片描述

在这里插入图片描述

1.4 结果分析

    通过遗传算法,我们可以对比结果,显然这种结果是令人满意的。直观上看 过去,遗传算法给出的结果是最优的。但是遗传算法作为一种“概率”算法,不 一定每次都能够收敛到最优,在调试的时候,发现种群个体数和迭代次数在一定 范围内会更易于收敛到最优解。

1.5 源码

    GitHub传送门!!!

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuntou0906

玛莎拉蒂是我的目标!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值