引言
多项式杂交方式,产生的个体的结果可以理解为是在某个范围内的随机变化取值,并不能一定保证子代个体优于父代个体,因为这种情况,也导致算法的收敛速度不佳。为了改变这种情况,提高算法的收敛速度,借鉴粒子群算法,提出了一种新的杂交方式——引导式杂交,使产生的个体尽可能的往好的方向进化。
算法介绍
选择两个个体作为父代进行杂交,两个个体之间有着基因上的差距,假如两者产生的后代的性状表现为一半像父亲,一半像母亲,那么后代的基因应该从两个父代中各取一半。然而在实际的自然界中,很少这种现象,一般都是更像父亲,或者更像母亲,这个取决与子代的形状表现。借鉴粒子群算法中个体受到个体历史最优和种群最优的影响,从而往最优的方向走的方式;改进进化计算的杂交方式,使得每次杂交产生的子代进化的方向,是根据两个父代个体中的最优方向和两个父代个体共同的基因来决定的。具体的杂交方式如下:
假设
p
1
,
p
2
为父代个体,且
p
1
优于
p
2
(若等级一样,则按照拥挤距离判断);
c
1
,
c
2
表示产生的后代个体。
两个概念:
①、
c
p
=
p
1
−
p
2
:两个父代之间的基因差别;
②、
z
p
=
p
1
+
p
2
2
:两个父代之间的基因共同点。
子代的产生之子代进化方向:
v
p
1
=
k
⋅
c
p
+
h
1
⋅
r
1
⋅
(
p
1
−
z
p
)
+
h
2
⋅
r
2
⋅
(
p
2
−
z
p
)
v
p
2
=
k
⋅
c
p
+
h
1
⋅
r
3
⋅
(
p
2
−
z
p
)
+
h
2
⋅
r
4
⋅
(
p
1
−
z
p
)
子代的生成:
c
1
=
p
1
+
v
p
1
c
2
=
p
2
+
v
p
2
其中,
k
,
h
1
,
h
2
,
为常数,
r
1
,
r
2
,
r
3
,
r
4
为
0
−
1
的随机数。
根据粒子群算法,个人建议:
k
取值
[
0.5
,
1
]
,
h
1
取值
[
1
,
2
]
,
h
2
取值
(
0
,
1
]
。
h
1
,
h
2
:
控制所受父代的影响程度。
\begin{aligned} & 假设p_1,p_2为父代个体,且p_1优于p_2(若等级一样,则按照拥挤距离判断);c_1,c_2表示产生的后代个体。 \\& 两个概念:\\& ①、cp = p_1-p_2:两个父代之间的基因差别;\\& ②、zp = \frac{p_1+p_2}{2}:两个父代之间的基因共同点。\\& 子代的产生之子代进化方向:\\& vp_1 = k\cdot cp + h1\cdot r_1\cdot (p_1-zp)+ h2\cdot r_2\cdot (p_2-zp)\\& vp_2 = k\cdot cp + h1\cdot r_3\cdot (p_2-zp)+ h2\cdot r_4\cdot (p_1-zp)\\& 子代的生成:\\& c_1 = p_1+vp_1\\& c_2 = p_2+vp_2\\& 其中,k,h_1,h_2,为常数,r_1,r_2,r_3,r_4为0-1的随机数。\\& 根据粒子群算法,个人建议: k取值[0.5,1],h_1取值[1,2],h_2取值(0,1]。 \\& \\& h_1,h_2:控制所受父代的影响程度。 \end{aligned}
假设p1,p2为父代个体,且p1优于p2(若等级一样,则按照拥挤距离判断);c1,c2表示产生的后代个体。两个概念:①、cp=p1−p2:两个父代之间的基因差别;②、zp=2p1+p2:两个父代之间的基因共同点。子代的产生之子代进化方向:vp1=k⋅cp+h1⋅r1⋅(p1−zp)+h2⋅r2⋅(p2−zp)vp2=k⋅cp+h1⋅r3⋅(p2−zp)+h2⋅r4⋅(p1−zp)子代的生成:c1=p1+vp1c2=p2+vp2其中,k,h1,h2,为常数,r1,r2,r3,r4为0−1的随机数。根据粒子群算法,个人建议:k取值[0.5,1],h1取值[1,2],h2取值(0,1]。h1,h2:控制所受父代的影响程度。
代码实现
function child_pop = myga_crossover(parent_pop,dimension,bounds)
%GA算法
parent_pop = sortrows(parent_pop,[2+dimension+1,-(2+dimension+2)]);
parent_pop = parent_pop(:,1:dimension);
[popsize,~] = size(parent_pop);
%定义交叉的概率,这里定义为全部需要交叉
crossover = 1;
child = [];
for i = 1:popsize
c_r = rand(1);
%交叉变换
if c_r < crossover
%随机选择一个个体与该个体进行杂交
p1 = randperm(popsize,1);
if p1<=i
parent1 = parent_pop(p1,:);
parent2 = parent_pop(i,:);
else
parent1 = parent_pop(i,:);
parent2 = parent_pop(p1,:);
end
child1 = zeros(1,dimension);
child2 = zeros(1,dimension);
% 按照定义产生后代个体
vga1 = parent1 - parent2;
vga2 = (parent1 + parent2)*0.5;
v1 = 0.729*vga1 + 1.5*rand*(parent1-vga2) + rand*(parent2 - vga2) ;
v2 = 0.729*vga1 + 1.5*rand*(parent2-vga2) + rand*(parent1 - vga2) ;
child1 = parent1 + v1;
child2 = parent2 + v2;
for j = 1:dimension
if child1(j) > bounds(j,2)
child1(j) = bounds(j,2);
elseif child1(j) < bounds(j,1)
child1(j) = bounds(j,1);
end
if child2(j) > bounds(j,2)
child2(j) = bounds(j,2);
elseif child2(j) < bounds(j,1)
child2(j) = bounds(j,1);
end
end
child = [child;child1;child2];
end
end