PlatEMO扩展——显示双种群分布、无约束帕累托前沿,带约束帕累托前沿图像

avatar 2024年08月07日15:02:49 0 158 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此

这里以 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

  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0