NSGA2算法MATLAB实现(能够自定义优化函数)

以前写了一个简单的NSGA2的算法能够用在ZDT1函数上:http://www.omegaxyz.com/2017/05/04/nsga2matlabzdt1/

那个NSGA2的算法不具有普遍性,下面参考课国外的课题小组的代码重新修改了内部冗余内容,使之能够自定义优化函数。

NSGA2的过程为:

1、随机产生一个初始父代Po,在此基础上采用二元锦标赛选择、交叉和变异操作产生子代Qo, Po 和Qo群体规模均为N

2、将Pt和Qt并入到Rt中(初始时t=0),对Rt进行快速非支配解排序,构造其所有不同等级的非支配解集F1、F2........

3、按照需要计算Fi中所有个体的拥挤距离,并根据拥挤比较运算符构造Pt+1,直至Pt+1规模为N,图中的Fi为F3

具体解释请见:http://www.omegaxyz.com/2017/04/14/nsga-iiintro/

C++代码请见(测试函数ZDT1):http://www.omegaxyz.com/2017/04/20/nsga2zdt1/

下面是完整版的代码:

①nsga2-optimization.m

②initialize_variables.m

③non_domination_sort_mod.m

④tournament_selection.m

⑤genetic_operator.m

⑥replace_chromosome.m

⑦自定义评价函数(我选用的ZDT1函数)

500个种群运行500代的结果:

代码打包下载:http://download.csdn.net/download/xyisv/10217700

Github项目地址:https://github.com/xyjigsaw/NSGA2_MATLAB

46 评论

  1. up,想问一下,得到最后pareto的图了,但是如何从图像上得到各维度x的值呢

    • Xi作为一个变量,应该是有多个维度的,可以从chromosome获得变量X的值

  2. 您好,我想请教一下如何把目标函数替换成我的近似模型(神经网络)

  3. 您好,博主,我想问一下,改完自定义函数后,我运行出来是的图是一条平行于x轴的点点

  4. 博主您好~ 我在运行您的代码时,repalce_chromosome.m一直提示:
    >> repalce_chromosome
    输入参数的数目不足。

    出错 repalce_chromosome (第 5 行)
    [N, m] = size(intermediate_chromosome);

    您知道是什么原因么

  5. 应该是我能找到可读性最好的代码了,非常容易修改,我是一个0基础的小白,经过几天的学习也能理解了,感谢

  6. 您好 请问下 怎样能显示Pareto前沿对应的决策变量的数值呢?

  7. 请问chromosome这个数据是一个矩阵吗?行数是种群数量,每一列包含了决策变量,目标函数,还有什么?

  8. 您好 我是小白 我想问您的代码放这是开源吗 那我如果只是自己写主函数 其它的用您的代码算抄袭吗

  9. mu = 20;
    mum = 20;
    模拟二进制交叉参数mu和多项式变异参数mum为什么设置为20呢?mu不是一般建议取1吗?设置多少有什么影响吗

  10. 您好,我想问一下怎么改变量的范围,就比如目标函数的x1和x2取值范围不同,我看程序里面只能改min_range和max_range。谢谢

  11. 未定义与 ‘double’ 类型的输入参数相对应的函数 ‘replace_chromosome’。

    出错 nsga_2_optimization (line 32)
    chromosome = replace_chromosome(intermediate_chromosome, M, V, pop);

    请问运行①nsga2-optimization.m时会出现上面的报错问题该如何解决(刚开始接触,见笑了)

  12. 您好,我想问下您这个代码是否可以加入非线性约束呢,如果可以该怎么加

  13. 您好,最近刚接触这个算法,幸运的看到了您的分享,非常感谢,想请教一下可否基于您的代码修改自己的目标函数和约束条件,都应该改哪些行呢?如果我问的太傻请小哥哥见谅啦

    • 目标函数在⑦自定义评价函数(我选用的ZDT1函数),如果要修改约束条件比较复杂,如果是线性约束的话可以考虑在交叉变异生成子代的时候增加约束条件。

    • 注意x是一个个体,M是目标数,V是维度,请在函数设计时把一个个体传入即可。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注