二维散点图的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.')
最终效果如下: