遗传算法解决旅行商问题
- 作者:Cukor丘克
- 环境:MatlabR202a + vscode
问题描述
旅行商问题(TSP). 一个商人欲从自己所在的城市出发,到若干个城市推销商品,然后回到其所在的城市。如何选择一条周游路线,使得商人经过每个城市一次且仅一次后回到起点,并使他所走过的路径最短?
TSP 即Travelling Salesman Problem. 中文翻译过来就是旅行商问题。
旅行商问题是一个典型的NP难问题。NP指的是Non-deterministic Polynomial,即多项式复杂程度的非确定性问题。由于该问题的组合特性,旅行商问题已成为测试新算法的标准问题,如模拟退火、神经网络和演化算法等都用旅行商问题作为测试用例。旅行商问题的一个实例可由一个距离矩阵所给定。
用遗传算法求解旅行商问题时,适应函数可以取为目标函数或目标函数的一个简单变换,选择策略可以是轮盘赌选择,所以算法设计的重点主要集中在以下三个方面:
- 采用适当的方法对周游路线编码
- 设计专门的遗传算子,以避免不可行性
- 防止过早收敛
下面讨论周游路线常用的几种表示及其相应的遗传算子。
周游路线编码
主要有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. 1−2−4−3−8−5−9−6−7−1.
显然,每一条周游路线都对应一个近邻表示,但任一近邻排列却不一定对应于一条周游路线。
例如,排列
( 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 1−2−4−1,因而无法对应一条周游路线。所以周游路线的近邻表示就没有必要再往下介绍。
次序表示
次序表示将一条周游路线表示为 n n n个城市的有序表,其中,表中的第 i i i个元素在 1 1 1到 n − i + 1 n-i+1 n−i+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 n−1个城市的参照排列 ( q 1 , q 2 , . . . , q k ) , k = n − 1 (q_1,q_2,...,q_k),k=n-1 (q1,q2,...,qk),k=n−1,再记录城市 Π 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=n−1中的次序 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=n−1中删除得 n − 2 n-2 n−2个城市的参照排列 ( r 1 , r 2 , . . . , r k ) , k = n − 2 (r_1,r_2,...,r_k), k=n-2 (r1,r2,...,rk),k=n−2,以此类推,直到城市 Π 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