遗传算法解决旅行商问题
算法简介
模拟自然界的生命进化机制
实现方法
(1) 根据具体问题确定可行解域,确定一种编码方法,能用数值串或字符串表示可行解域的每一解。
(2) 对每一解应有一个度量好坏的依据,用适应度函数表示,一般由目标函数构成。
(3) 确定进化参数、交叉概率、变异概率、进化终止条件。
生物遗传概念在遗传算法中的对应关系
适者生存:算法停止时,最优目标值的可行解有最大的可能被留住
个体:可行解
染色体:可行解的编码
基因:可行解中每一分量的特征
适应性:适应度函数值
种群:根据适应度函数值选取的一组可行解
交配:通过交配原则产生一组新可行解的过程
变异:编码的某一分量发生变化的过程
算法实现
假设有一个100个城市的旅行商问题,编号为2~101,出发地点的编号为1和102(方便编程)。
求解的遗传算法的参数设定如下:
种群大小
M
=
50
;
M=50;
M=50;最大代数
G
=
1000
;
G=1000;
G=1000;
交叉率
p
c
=
1
p_{\mathrm{c}}=1
pc=1,交叉概率为 1 能保证种群的充分进化; 变异率
p
m
=
0.1
p_{\mathrm{m}}=0.1
pm=0.1,一般而言,变异发生的可能性较小。
1.编码策略
采用十进制编码,用随机数列
ω
1
ω
2
⋯
ω
102
\omega_1\omega_2\cdots\omega_{102}
ω1ω2⋯ω102作为染色体,其中
0
⩽
ω
i
⩽
1
(
i
=
2
,
3
,
⋯
,
0\leqslant\omega_i\leqslant1\left(i=2,3,\cdots,\right.
0⩽ωi⩽1(i=2,3,⋯, 101 )
,
ω
l
=
0
, \omega _{\mathrm{l} }= 0
,ωl=0
,
ω
102
=
1
, \omega _{102}= 1
,ω102=1 ;每一个随机序列都和种群中的一个个体相对应,例如,9 目标问题的一个染色体为
[0.23,0.82,0.45,0.74,0.87,0.11,0.56,0.69,0.78],
式中:编码位置
i
i
i为目标
i
i
i,位置
i
i
i的随机数表示目标
i
i
i在巡回中的顺序。
将这些随机数按升序排列得到如下巡回:
6
−
1
−
3
−
7
−
8
−
4
−
9
−
2
−
5
。
6-1-3-7-8-4-9-2-5。
6−1−3−7−8−4−9−2−5。
2.初始种群
先利用经典的近似算法——改良圈算法求得一个较好的初始种群。
对于随机产生的初始圈
C
C
C =
π
1
\pi _{1}
π1
⋯
\cdots
⋯
π
u
−
1
\pi _{u- 1}
πu−1
π
u
\pi _{u}
πu
π
u
+
1
\pi _{u+ 1}
πu+1
⋯
\cdots
⋯
π
v
−
1
\pi _{v- 1}
πv−1
π
v
\pi _{v}
πv
π
v
+
1
\pi _{v+ 1}
πv+1
⋯
\cdots
⋯
π
102
\pi _{102}
π102 ,2
⩽
\leqslant
⩽
u
u
u <
v
v
v
⩽
\leqslant
⩽ 101 ,2
⩽
\leqslant
⩽
π
u
\pi _{u}
πu <
π
v
\pi _{v}
πv
⩽
\leqslant
⩽ 101 ,
交换
u
u
u与
v
v
v之间的顺序,此时的新路径为
π
1
⋯
π
u
−
1
π
v
π
v
−
1
⋯
π
u
+
1
π
u
π
v
+
1
⋯
π
102
∘
\pi_1\cdots\pi_{u-1}\pi_v\pi_{v-1}\cdots\pi_{u+1}\pi_u\pi_{v+1}\cdots\pi_{102}\circ
π1⋯πu−1πvπv−1⋯πu+1πuπv+1⋯π102∘
记
Δ
f
=
(
d
π
u
−
1
π
v
+
d
π
u
π
v
+
1
)
−
(
d
π
u
−
1
π
u
+
d
π
v
π
v
+
1
)
\Delta f=(d_{\pi_{u-1}\pi_{v}}+d_{\pi_{u}\pi_{v+1}})-(d_{\pi_{u-1}\pi_{u}}+d_{\pi_{v}\pi_{v+1}})
Δf=(dπu−1πv+dπuπv+1)−(dπu−1πu+dπvπv+1),若
Δ
f
<
0
\Delta f<0
Δf<0,则以新路经修改旧路径,直到不能修改为止,就得到一个比较好的可行解。
直到产生M个可行解,并把这M个可行解转换成染色体编码。
3.目标函数
目标函数为侦察所有目标的路径长度,适应度函数就取为目标函数。
要求 min f ( π 1 , π 2 , ⋯ , π 102 ) = ∑ i = 1 101 d π i π i + 1 \min f(\:\pi_1\:,\pi_2\:,\cdots,\pi_{102}\:)\:=\:\sum_{i\:=\:1}^{101}\:d_{\pi_i\pi_{i+1}\:} minf(π1,π2,⋯,π102)=i=1∑101dπiπi+1
4.交叉操作
交叉操作采用单点交叉。对于选定的两个父代个体
f
1
=
ω
1
ω
2
⋯
ω
102
,
f
2
=
ω
1
′
ω
2
′
⋯
f_1=\omega_1\omega_2\cdots\omega_{102},f_2=\omega_1^{\prime}\omega_2^{\prime}\cdots
f1=ω1ω2⋯ω102,f2=ω1′ω2′⋯
ω
102
′
\omega_{102}^{\prime}
ω102′,随机地选取第
ι
\iota
ι个基因处为交叉点,则经过交叉运算后得到的子代个体为
s
1
s_1
s1和
s
2
,
s
1
s_2,s_1
s2,s1 的基因由
f
1
f_1
f1的前
t
t
t个基因和
f
2
f_2
f2的后 102 -
t
t
t个基因构成
,
s
2
,s_2
,s2的基因由
f
2
f_2
f2的前
ι
\iota
ι个基因和
f
1
f_1
f1 的后 102
−
t
-t
−t个基因构成,例如:
f
1
=
[
0
,
0.
14
,
0.
25
,
0.
27
,
1
0.
29
,
0.
54
,
⋯
,
0.
19
,
1
]
,
f
2
=
[
0
,
0.
23
,
0.
44
,
0.
56
,
∣
0.
74
,
0.
21
,
⋯
,
0.
24
,
1
]
,
f_{1}\:=\:\left[\:0\:,0.\:14\:,0.\:25\:,0.\:27\:,\:1\:0.\:29\:,0.\:54\:,\cdots,0.\:19\:,1\:\right],\\f_{2}\:=\:\left[\:0\:,0.\:23\:,0.\:44\:,0.\:56\:,\:|\:0.\:74\:,0.\:21\:,\cdots,0.\:24\:,1\:\right],
f1=[0,0.14,0.25,0.27,10.29,0.54,⋯,0.19,1],f2=[0,0.23,0.44,0.56,∣0.74,0.21,⋯,0.24,1],
设交叉点为第四个基因处,则
s
1
=
[
0
,
0.
14
,
0.
25
,
0.
27
,
∣
0.
74
,
0.
21
,
⋯
,
0.
24
,
1
]
,
s
2
=
[
0
,
0.
23
,
0.
44
,
0.
56
,
∣
0.
29
,
0.
54
,
⋯
,
0.
19
,
1
]
。
s_{1}\:=\:\left[\:0\:,0.\:14\:,0.\:25\:,0.\:27\:,\:|\:0.\:74\:,0.\:21\:,\cdots,0.\:24\:,1\:\right],\\s_{2}\:=\:\left[\:0\:,0.\:23\:,0.\:44\:,0.\:56\:,\:|\:0.\:29\:,0.\:54\:,\cdots,0.\:19\:,1\:\right]。
s1=[0,0.14,0.25,0.27,∣0.74,0.21,⋯,0.24,1],s2=[0,0.23,0.44,0.56,∣0.29,0.54,⋯,0.19,1]。
5.变异操作
变异也是实现群体多样性的一种手段,同时也是全局寻优的保证。按照给定的变异率,对选定变异的个体,随机地取三个整数,满足 1 < u < v < w < 102 1<u<v<w<102 1<u<v<w<102,把 u , v u,v u,v之间(包括 u u u 和 v v v )的基因段插到 w w w后面。
6.选择
在父代种群和子代种群中选择目标函数最小的M个个体进化到下一代,保证父代的优良特性被保存下来。
Matlab参考代码