双调欧几里得旅行商问题_工程优化设计与Matlab实现——遗传算法求解旅行商(TSP)问题...

TSP问题是一个排序问题,排序与编码有几分相似,我们可以用遗传算法解决TSP问题么?

毫无疑问,是的。

Part 1 旅行商问题

TSP是一个典型的组合优化问题:

假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

当城市数目n较小时可以求解比较容易,一旦n增加,TSP问题就变得复杂。

TSP的数学模型可以可以表示为如下形式:

a069d25eac7f9e71b68fc40636696d9b.png

Part 2 遗传算法求解旅行商问题的实现

基本遗传算法的主要步骤如下:

371211e8ab5890e92785a6478f6dadc0.png

对于TSP问题,每一个个体代表着一种排列方式,而排列方式本身就是一种编码,所以,我们得到路径即得到编码,无需再对数据进行编码。

也正是由于路径顺序即为编码,所以在交叉、变异时要受到不能重复的限制,这是使用遗传算法求解TSP问题与求解一般问题的最大不同。

Point 1 准备

  • 有n个城市,其坐标按以下方式给出:

cbbad228476aa094b2b8b3d8dae6d33f.png
  • 计算出所有城市之间的距离,定义存放城市间距离的矩阵如下:

28d672c6ce0f61c9a1961d0a0add6d96.png

计算程序如下:

for 
  • 假设种群中有m个个体,我们定义种群矩阵X如下,可以看出TSP问题本身是一个一元问题,一个个体对应一个染色体。

9a41ee022861e34851c744d8ffa548bc.png

Point 2 洗牌(乱序)操作

为了避免在迭代过程中交叉操作总是在相邻的两个个体的染色体之间发生,在交叉操作之前,先对种群中的每一个个体的前后顺序进行重新排列,即X的列向量打乱顺序。

程序如下:

shuffle 

Point 3 交叉操作

  • 随机选取两个交叉点
  • 将交叉点中间的基因段进行互换
  • 互换后,将互换的基因段与基因段以外的部分中重复(冲突)的元素用另一父本的相应位置来代替,直到没有冲突。

366d2ee57a1dfea204174e52d4bb07ce.png

交叉操作程序(太长了,影响阅读体验,详见最后总程序)

Point 4 变异操作

  • 随机选取两个变异点
  • 将变异点中间的基因段进行倒序

变异操作程序(太长了,影响阅读体验,详见最后总程序)

Point 5 选择操作

  • 计算每个个体对应的路径长度,定义如下矩阵来存放:

64a164a954c6790c18e8fc69b0ac09ba.png

路径长度计算程序:

function
  • 由于TSP问题求最短路径,所以适应度与路径长度成反比,定义适应度为:

9ec58b20eb9c585c1e18aff09da15528.png

定义存储适应度的矩阵为:

f8582eada842e84aaa0166875d83ddb1.png

适应度计算程序:

function
  • 轮盘赌法+精英保留策略进行选择
function

Point 6 总程序

以求10个城市的TSP问题为例,10个城市的坐标如下:

a87b628a16a81a442fa8b5da1ee5eba9.png
%----------求解TSP问题----------%

计算结果如下:

2fcb57123cc473d1b54c8e3a41c11228.png

da053773ec6faa3ca7a5dcf09eea4100.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值