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

本文共951个字,预计阅读时间需要4分钟。

以前写了一个简单的NSGA2的算法能够用在ZDT1函数上:https://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

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

C++代码请见(测试函数ZDT1):https://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

19 位极客在 “NSGA2算法MATLAB实现(能够自定义优化函数)” 留下足迹

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

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

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

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

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

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

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

评论