这里以 C-TAEA算法和MW11问题为例
原代码是只显示CA的种群的分布是,不显示DA种群分布,也不显示CPF和UPF。我们把后面三种显示出来
一、先看效果图
二、完整过程如下
为了节约时间,我这里就不详细介绍哪些代码的具体作用了
同时最好少修改PlatEMO封装的原来代码,最好采用新增方法
1、修改 GUI 下的 module_test.m
将
PRO.DrawObj(ALG.result{index,2});
替换为
if ~isempty(ALG.result2) % 自己扩展的
PRO.DrawObj2(ALG.result{index,2}, ALG.result2{index,2});
else
PRO.DrawObj(ALG.result{index,2});
end
即当 result2 存在的时候,调用 DrawObj2 方法,DrawObj2代码下面会介绍
2、修改ALGORITHM.m
1)新增一个 result2 属性
2)初始化 result2 属性
3)新增一个 NotTerminated2 方法,内容拷贝 NotTerminated 方法
将 Population 改成 Population1, Population2
obj.result 那一行代码复制一份,修改变量名
3、修改PROBLEM.m
1)新增 uncon_optimum 变量
2)初始化uncon_optimum变量
3)定义一个GetUnconOptimum方法
代码可以复制GetOptimum的
4)在 DrawObj 方法尾部添加
% 绘制带约束的帕累托前沿,自己扩展的
if ~isempty(obj.optimum)
if size(obj.optimum,1) > 1 && obj.M < 4
if obj.M == 2
plot(ax,obj.optimum(:,1),obj.optimum(:,2),'.k');
elseif obj.M == 3
plot3(ax,obj.optimum(:,1),obj.optimum(:,2),obj.optimum(:,3),'.k');
end
end
end
% 绘制不带约束的帕累托前沿,自己扩展的
if ~isempty(obj.uncon_optimum)
if size(obj.uncon_optimum,1) > 1 && obj.M < 4
if obj.M == 2
plot(ax,obj.uncon_optimum(:,1),obj.uncon_optimum(:,2),'.r');
elseif obj.M == 3
plot3(ax,obj.uncon_optimum(:,1),obj.uncon_optimum(:,2),obj.uncon_optimum(:,3),'.');
end
end
end
不需要的情况,可以考虑注释掉这段
5)新建DrawObj2,代码从DrawObj拷贝
主要是改了参数,从1个变为2个。然后新增一行ax那个代码,注意Population改成了Population1
% 自己扩展的
function DrawObj2(obj,Population1, Population2) % DrawObj即画出目标函数值
% 自己扩展的,显示2个种群的分布
ax = Draw(Population1.objs,'o', {'\it f\rm_1','\it f\rm_2','\it f\rm_3'});
ax = Draw(Population2.objs,'+', {'\it f\rm_1','\it f\rm_2','\it f\rm_3'});
if ~isempty(obj.PF) % PF即Pareto front
if ~iscell(obj.PF)
if obj.M == 2
plot(ax,obj.PF(:,1),obj.PF(:,2),'-k','LineWidth',1);
elseif obj.M == 3
plot3(ax,obj.PF(:,1),obj.PF(:,2),obj.PF(:,3),'-k','LineWidth',1); % plot3即画出三维曲线
end
else
if obj.M == 2
surf(ax,obj.PF{1},obj.PF{2},obj.PF{3},'EdgeColor','none','FaceColor',[.85 .85 .85]); % surf即画出三维曲面
elseif obj.M == 3
surf(ax,obj.PF{1},obj.PF{2},obj.PF{3},'EdgeColor',[.8 .8 .8],'FaceColor','none');
end
set(ax,'Children',ax.Children(flip(1:end)));
end
elseif size(obj.optimum,1) > 1 && obj.M < 4
if obj.M == 2
plot(ax,obj.optimum(:,1),obj.optimum(:,2),'.k');
elseif obj.M == 3
plot3(ax,obj.optimum(:,1),obj.optimum(:,2),obj.optimum(:,3),'.k');
end
end
% 绘制带约束的帕累托前沿,自己扩展的
if ~isempty(obj.optimum)
if size(obj.optimum,1) > 1 && obj.M < 4
if obj.M == 2
plot(ax,obj.optimum(:,1),obj.optimum(:,2),'.k');
elseif obj.M == 3
plot3(ax,obj.optimum(:,1),obj.optimum(:,2),obj.optimum(:,3),'.k');
end
end
end
% 绘制不带约束的帕累托前沿,自己扩展的
if ~isempty(obj.uncon_optimum)
if size(obj.uncon_optimum,1) > 1 && obj.M < 4
if obj.M == 2
plot(ax,obj.uncon_optimum(:,1),obj.uncon_optimum(:,2),'.r');
elseif obj.M == 3
plot3(ax,obj.uncon_optimum(:,1),obj.uncon_optimum(:,2),obj.uncon_optimum(:,3),'.');
end
end
end
end
4、修改Problem里的MW11.m
新建GetUnconOptimum方法,代码可以从本文件中GetOptimum方法里拷贝
然后删除掉约束的代码,即去掉c1,c2,c3,c4以及那个while循环代码
最终代码如下
%% 自己扩展的,无约束的无约束的最优解
function R = GetUnconOptimum(obj,N)
R(:,1) = (0:1/(N-1):1)';
R(:,2) = 1 - R(:,1);
R = R./repmat(sqrt(sum(R.^2,2)/2),1,2);
R = [R;1,1];
R = R(NDSort(R,1)==1,:);
end
5、修改C-TAEA
调用 Algorithm.NotTerminated2
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏