NSGA-II改进之引导式交叉

NSGA-II改进之引导式交叉

引言

多项式杂交方式,产生的个体的结果可以理解为是在某个范围内的随机变化取值,并不能一定保证子代个体优于父代个体,因为这种情况,也导致算法的收敛速度不佳。为了改变这种情况,提高算法的收敛速度,借鉴粒子群算法,提出了一种新的杂交方式——引导式杂交,使产生的个体尽可能的往好的方向进化。

算法介绍

选择两个个体作为父代进行杂交,两个个体之间有着基因上的差距,假如两者产生的后代的性状表现为一半像父亲,一半像母亲,那么后代的基因应该从两个父代中各取一半。然而在实际的自然界中,很少这种现象,一般都是更像父亲,或者更像母亲,这个取决与子代的形状表现。借鉴粒子群算法中个体受到个体历史最优和种群最优的影响,从而往最优的方向走的方式;改进进化计算的杂交方式,使得每次杂交产生的子代进化的方向,是根据两个父代个体中的最优方向和两个父代个体共同的基因来决定的。具体的杂交方式如下:
假设 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(若等级一样,则按照拥挤距离判断);c1c2表示产生的后代个体。两个概念:cp=p1p2:两个父代之间的基因差别;zp=2p1+p2:两个父代之间的基因共同点。子代的产生之子代进化方向:vp1=kcp+h1r1(p1zp)+h2r2(p2zp)vp2=kcp+h1r3(p2zp)+h2r4(p1zp)子代的生成:c1=p1+vp1c2=p2+vp2其中,k,h1,h2,为常数,r1,r2,r3,r401的随机数。根据粒子群算法,个人建议:k取值[0.5,1],h1取值[1,2],h2取值(0,1]h1h2:控制所受父代的影响程度。

代码实现

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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值