遗传算法解决旅行商问题(TSP)

遗传算法解决旅行商问题

  • 作者:Cukor丘克
  • 环境:MatlabR202a + vscode

问题描述

旅行商问题(TSP). 一个商人欲从自己所在的城市出发,到若干个城市推销商品,然后回到其所在的城市。如何选择一条周游路线,使得商人经过每个城市一次且仅一次后回到起点,并使他所走过的路径最短?

TSP 即Travelling Salesman Problem. 中文翻译过来就是旅行商问题。

旅行商问题是一个典型的NP难问题。NP指的是Non-deterministic Polynomial,即多项式复杂程度的非确定性问题。由于该问题的组合特性,旅行商问题已成为测试新算法的标准问题,如模拟退火、神经网络和演化算法等都用旅行商问题作为测试用例。旅行商问题的一个实例可由一个距离矩阵所给定。

用遗传算法求解旅行商问题时,适应函数可以取为目标函数或目标函数的一个简单变换,选择策略可以是轮盘赌选择,所以算法设计的重点主要集中在以下三个方面:

  1. 采用适当的方法对周游路线编码
  2. 设计专门的遗传算子,以避免不可行性
  3. 防止过早收敛

下面讨论周游路线常用的几种表示及其相应的遗传算子。

周游路线编码

主要有3种编码表示

  1. 近邻表示
  2. 次序表示
  3. 路径表示

近邻表示

近邻表示将一条周游路线表示成 n n n个城市 的一个排列 Π = ( Π 1 , Π 2 , . . . , Π n ) Π=(Π_1,Π_2,...,Π_n) Π=(Π1,Π2,...,Πn) Π i = j Π_i=j Πi=j当且仅当周游路线中从城市 i i i到达的下一个城市为 j j j.

例如,排列

( 2   4   8   3   9   7   1   5   6 ) (2~4~8~3~9~7~1~5~6 ) (2 4 8 3 9 7 1 5 6)

表示周游路线为 1 − 2 − 4 − 3 − 8 − 5 − 9 − 6 − 7 − 1. 1-2-4-3-8-5-9-6-7-1. 1243859671.

显然,每一条周游路线都对应一个近邻表示,但任一近邻排列却不一定对应于一条周游路线

例如,排列

( 2   4   8   1   9   3   5   7   6 ) (2~4~8~1~9~3~5~7~6) (2 4 8 1 9 3 5 7 6)

导致了不完全回路 1 − 2 − 4 − 1 1-2-4-1 1241,因而无法对应一条周游路线。所以周游路线的近邻表示就没有必要再往下介绍。

次序表示

次序表示将一条周游路线表示为 n n n个城市的有序表,其中,表中的第 i i i个元素在 1 1 1 n − i + 1 n-i+1 ni+1取值。该表的一个优点是每一个次序表示都对应于一条合法的周游路线。

次序表示的基本思想是:取 n n n个城市的某个排列 ( Π 1 , Π 2 , . . . , Π n ) (Π_1,Π_2,...,Π_n) (Π1,Π2,...,Πn)作为参照排列,通常取 ( 1 , 2 , . . . , n ) (1,2,...,n) (1,2,...,n)作为参照排列,然后将周游路线中的城市按照其在参照排列中的次序记录下来,形成一个具有 n n n个元素的有序表.具体做法如下:

对给定的一条路径 Π 1 − Π 2 − . . . − Π n Π_1-Π_2-...-Π_n Π1Π2...Πn,首先记录城市 Π 1 Π_1 Π1在参照排列 ( p 1 , p 2 , . . . , p n ) (p_1,p_2,...,p_n) (p1,p2,...,pn)中的次序 i 1 i_1 i1,将 Π 1 Π_1 Π1 ( p 1 , p 2 , . . . , p n ) (p_1,p_2,...,p_n) (p1,p2,...,pn)中删除得 n − 1 n-1 n1个城市的参照排列 ( q 1 , q 2 , . . . , q k ) , k = n − 1 (q_1,q_2,...,q_k),k=n-1 (q1,q2,...,qk),k=n1,再记录城市 Π 2 Π_2 Π2在参照排列 ( q 1 , q 2 , . . . , q k ) , k = n − 1 (q_1,q_2,...,q_k),k=n-1 (q1,q2,...,qk),k=n1中的次序 i 2 i_2 i2,然后将城市 Π 2 Π_2 Π2 ( q 1 , q 2 , . . . , q k ) , k = n − 1 (q_1,q_2,...,q_k),k=n-1 (q1,q2,...,qk),k=n1中删除得 n − 2 n-2 n2个城市的参照排列 ( r 1 , r 2 , . . . , r k ) , k = n − 2 (r_1,r_2,...,r_k), k=n-2 (r1,r2,...,rk),k=n2,以此类推,直到城市 Π n Π_n Πn的次序 i n i_n in记录下来为止。有序表 ( i 1 , i 2 , . . . , i n ) (i_1,i_2,...,i_n) (i1,i2,...,in)称为路径 Π 1 − Π 2 − . . . − Π n Π_1-Π_2-...-Π_n Π1Π2...Πn的次序表示。注意 i j i_j ij的取值范围为 1 ≤ i j ≤ n − j + 1 1 \le i_j \le n-j+1

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值