启发式算法之遗传算法
1.遗传算法算法流程
—————————————————————————————————————
Procedure:遗传算法主要流程
Input:问题数据集,GA参数
Begin
t ← 0 t \leftarrow0 t←0;
编码产生初始种群 P ( t ) P(t) P(t);
解码计算适应度值 e v a l u a t e ( P ) evaluate(P) evaluate(P);
while(不满足终止条件):
对 P ( t ) P(t) P(t) 实施交叉操作产生 C ( t ) C(t) C(t);
对 P ( t ) P(t) P(t) 实施变异操作产生 C ( t ) C(t) C(t);
解码计算适应度值 e v a l u a t e ( C ) evaluate(C) evaluate(C);
从 P ( t ) P(t) P(t)和 C ( t ) C(t) C(t)中选出 P ( t + 1 ) P(t+1) P(t+1);
End
Output:计算结果
—————————————————————————————————————
2.编码方式
1)直接表示法
直接用路线城市编号表示,例如TSP问题求解访问城市顺序,直接以城市编号作为序列表示。
2)随机数表示法
随机生成序列数,对随机数排序,次序对应城市编号。
3.交叉算子
3.1 部分映射算子 PMX
- 主要流程: 两个父代染色体,确定交换片段的起始和终止位置,进行基因片段交换,并根据片段映射关系,完善更新染色体基因编码。
- 算法流程
—————————————————————————————————————
Procedure:PMX交叉
Input:染色体 v 1 , v 2 v_1,v_2 v1,v2,染色体长度 l l l;
Output:子代染色体 v 1 ′ , v 2 ′ v_1^{'},v_2^{'} v1′,v2′;
begin
R ← \leftarrow ← ∅ \empty ∅;
s ← r a n d o m [ 1 , l − 1 ] s\leftarrow random[1,l-1] s←random[1,l−1];
t ← r a n d o m [ s + 1 , l ] t\leftarrow random[s+1,l] t←random[s+1,l];
v 1 ′ ← v_1^{'}\leftarrow v1′← v 1 [ 1 : s − 1 ] / / v 2 [ s : t ] / / v 1 [ t + 1 : l ] v_1[1:s-1]//v_2[s:t]//v1[t+1:l] v1[1:s−1]//v2[s:t]//v1[t+1:l];
v 2 ′ ← v_2^{'}\leftarrow v2′← v 2 [ 1 : s − 1 ] / / v 1 [ s : t ] / / v 2 [ t + 1 : l ] v_2[1:s-1]//v_1[s:t]//v2[t+1:l] v2[1:s−1]//v1[s:t]//v2[t+1:l];
R ← \leftarrow ← relation( v 1 [ s : t ] , v 2 [ s : t ] v_1[s:t],v_2[s:t] v1[s:t],v2[s:t])
legalize( v 1 ′ , v 2 ′ v_1^{'},v_2^{'} v1′,v2′,R)
end
—————————————————————————————————————
3.2 顺序交叉算子
- 主要流程:从一个父代染色体中选择某个基因片段遗传到子代中对应位置,然后从另一个父代染色体中,将未在子代基因片段中出现基因按照复杂顺序依次填充子代其它位置。
- 算法流程
———————————————————————————————————
Procedure:
Input:父代染色体 v 1 , v 2 v_1,v_2 v1,v2