NSGA-II改进之非均匀变异

这篇具有很好参考价值的文章主要介绍了NSGA-II改进之非均匀变异。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1-变异方式的选择

​ 在进化算法中,多项式的变异方式,变异算子的作用与进化代数是没有关系的,所以当算法演化到一定代数的时候,算法会缺乏局部搜索能力。为了将变异算子的作用与代数关联起来,使得算法可以在前期变异的范围会较大,随着演化代数的增加,变异范围越来越小,增加算法的微调能力。Z.Michalewicz提出了非均匀变异。

2-非均匀变异方式介绍

设 x = ( x 1 , x 2 , . . . x n ) 为待变异个体,变异产生一个新基因 y ,首先随机生成一个整数 k ∈ [ 1 , n ] 然后对 x 的第 k 个基因 进行变异。 \begin{aligned} &设x=(x_1,x_2,...x_n)为待变异个体,变异产生一个新基因y,首先随机生成一个整数k\in[1,n]然后对x的 第k个基因\\&进行变异。 \end{aligned} \\ x=(x1,x2,...xn)为待变异个体,变异产生一个新基因y,首先随机生成一个整数k[1,n]然后对x的第k个基因进行变异。
y k = { x k + Δ ( t , u k − x k ) i f x ≤ 0.5 x k − Δ ( t , u k − x k ) e l s e y_k=\{ \begin{aligned} & x_k+\Delta(t,u_k-x_k)\quad if \quad x\leq 0.5 \\& x_k-\Delta(t,u_k-x_k)\quad else \end{aligned} \\ yk={xk+Δ(t,ukxk)ifx0.5xkΔ(t,ukxk)else
则产生的新个体为 y = ( x 1 , x 2 , . . , x k , . . . , x n ) 。 其中随机数 r ∈ ( 0 , 1 ) , t 为当前进化代数,函数 Δ ( t , z ) 返回的是一个 [ 0 , z ] 的值,并且随 t 的增加 , 函数 Δ ( t , z ) 趋于 0 的概率增加。函数 Δ ( t , z ) 的特性使算法在前期具有较大的搜索范围,在后期可以进行小范围的调整。其中函数 Δ ( t , z ) 表示为: Δ ( t , z ) = z . ( 1 − r ( 1 − t / T ) b ) 上式中 r 是一个 0 到 1 的随机数, T 表示最大演化代数, b 是一个分均匀度的参数,一般取值为 2 到 5 。 \begin{aligned}& 则产生的新个体为y=(x_1,x_2,..,x_k,...,x_n)。 \\& 其中随机数r\in(0,1),t为当前进化代数,函数\Delta (t,z)返回的是一个[0,z]的值,并且随t的增加,函数\Delta (t,z)趋于0 \\& 的概率增加。函数 \Delta (t,z)的特性使算法在前期具有较大的搜索范围,在后期可以进行小范围的调整。其中函数\Delta (t,z)\\& 表示为: \end{aligned} \\ \Delta (t,z) = z.(1-r^(1-t/T)^b) \\ \begin{aligned}& 上式中r是一个0到1的随机数,T表示最大演化代数,b是一个分均匀度的参数,一般取值为2到5。 \quad \quad \quad \quad \quad \quad \quad \quad \end{aligned} 则产生的新个体为y=(x1,x2,..,xk,...,xn)其中随机数r(0,1),t为当前进化代数,函数Δ(t,z)返回的是一个[0,z]的值,并且随t的增加,函数Δ(t,z)趋于0的概率增加。函数Δ(t,z)的特性使算法在前期具有较大的搜索范围,在后期可以进行小范围的调整。其中函数Δ(t,z)表示为:Δ(t,z)=z.(1r(1t/T)b)上式中r是一个01的随机数,T表示最大演化代数,b是一个分均匀度的参数,一般取值为25

3-MATLAB代码实现

function child_pop = MyGA_mutate(parent_pop,dimension,bounds,t,T,x)
% t当前进进化次数,T最大迭代次数,x,问题编号
%GA算法
parent_pop = sortrows(parent_pop,[2+dimension+1,-(2+dimension+2)]);
parent_pop = parent_pop(:,1:dimension);
[popsize,~] = size(parent_pop);

%定义交叉变异的概率
mutation = 0.6;
%变异参数。b影响变异的范围。
b = 3;
child = [];
% 每个变异个体只做随机的单点变异
for i = 1:popsize
    %判断个体是否进行遗传操作
    m_r = rand(1);
    if m_r < mutation 
        k = randperm(dimension,1); % 取一个整数,确定变异点
        rk = rand(1);
        child1 = parent_pop(i,:);
        if rk >= 0.5  % 变异计算
            z = bounds(k,2) - parent_pop(i,k);
            xk = parent_pop(i,k) + z*(1-rand^((1-t/T)^b));
            child1(1,k) = xk;
        else
            z = parent_pop(i,k) - bounds(k,1);
            xk = parent_pop(i,k) - z*(1-rand^((1-t/T)^b));
            child1(1,k) = xk;
        end
        child = [child;child1];
    end
end
child_eva = calculation(child,x);
child_pop = [child,child_eva];

4-对比

只对比变异方式的不同,其余策略保持一致。

初始化:随机初始化

父代选择:锦标赛选择方式

交叉方式:多项式交叉

4.1-ZDT函数比较

非均匀变异 多项式变异
ZDT1 nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习 ZDT1nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习
ZDT2 nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习 ZDT2nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习
ZDT3 nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习 ZDT3nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习
ZDT4 nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习 ZDT4nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习
ZDT6 nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习 ZDT6 nsga2改进,基于NSGA-II算法的研究,matlab,算法,矩阵,学习

4.2-分析

从4.1的对比可以看出,采用非均匀变异和多项式变异的最大区别在ZDT4上,采用非均匀变异在ZDT4函数的求解中,是可以求得最佳前言的,而多项式变异在500代的时候依然差很远。而其他函数比较中,两者相差不远,甚至有些是多项式变异反而更优一点。

从非均匀变异的实现中,可以知道,越到后面,变异的范围就越小。所以最大迭代次数对变异有很大的影响,而多项式变异并不会受到这个方面的影响。

5-总结

算法步骤中实现策略的不同,效果也不同。一个策略的改变可能在某些方面上更优,但不一定在所有方面上都会更好。在针对不同问题的时候,对部分策略的改变也许就会得到更好的结果。

思考:

在【NSGA-II的算法介绍】中,多项式变异在处理超出边界的方案,是否合适呢?能否改为超出边界的时候,在范围空间中随机呢?这样做效果是否会更好呢?同样多项式交叉中的处理方式也是如此,改变之后的效果如何呢?多项式的交叉和变异也可以通过指数的变化控制变化范围,这个指数怎么取?是动态变化好还是固定好?文章来源地址https://www.toymoban.com/news/detail-678985.html

到了这里,关于NSGA-II改进之非均匀变异的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包