二维散点数据的pareto前沿绘制

二维散点图的pareto前沿绘制

最近使用了matlab的gamultiobj函数进行多目标优化,中断程序后发现利用所有代数的Score结果来绘制pareto前沿是件令人头疼的事情。
而gamultiobj函数中绘制pareto前沿的函数又无法直接调用(gamultiobj函数源代码太复杂了,绘图的具体索引是:gamultiobj—>optimotions—>gamultiobjsolve—>gadsplot—>gaplotpareto,在利用gaplotpareto函数完成绘图时,数据已经由前面的其他步骤处理完成)。

因此想了一个投机取巧的办法来达到目的,那就是将n行2列的散点数据data直接作为gamultiobj优化算法初代的Scores,且让程序只有初代就结束。

具体代码如下(简化版):

data=rand([500,2]);%二维散点数据
s=size(data);
%利用gamultiobj多目标优化算法内置的绘图函数来提取pareto前沿数据
options = optimoptions('gamultiobj','PlotFcn',@gaplotpareto,'PopulationSize',s(1),'InitialScores',data,'Generations',1);
[x,fval,exitflag,output,population,scores] = gamultiobj(@(x) x,2,[],[],[],[],[],[],options);
%fval即为pareto前沿数据

详细版:

clear;clc;
%rng('default'); %使rand函数每次运行都输出相同结果

%创建第三象限的单位圆数据data
data=rand([500,2]);
s=size(data);
for i=1:s(1)
    if (data(i,1)^2+data(i,2)^2)>1
data(i,:)=[0 0];
    end
end
data=-data;
%plot(data(:,1),data(:,2),'.')%观察原始数据分布

%利用gamultiobj多目标优化算法内置的绘图函数来提取pareto前沿数据
options = optimoptions('gamultiobj','PlotFcn',@gaplotpareto,'PopulationSize',s(1),'InitialScores',data,'Generations',1);
[x,fval,exitflag,output,population,scores] = gamultiobj(@(x) x,2,[],[],[],[],[],[],options);
%fval即为pareto前沿数据

%利用fval数据重新绘制图形灵活度更高
clf;
plot(fval(:,1),fval(:,2),'rp','MarkerSize',9)
axis([-1,-0,-1,0])
set(gca,'XTick',-1:0.1:0,'YTick',-1:0.1:0)
xlabel('x');ylabel('y')
title('Patero Front')
set(gca,'Fontname','times new Roman','FontSize',12);
grid on

%将pareto前沿与原始数据绘制在同一张图上
hold on
plot(data(:,1),data(:,2),'k.')

最终效果如下:
在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值