function NP=CMOPSO(f,tag,xbound,pnum,gnum,cubelen,t_max,parameter)
%%f为从决策空间到目标空间(m维)的映射集合,为长m的函数名向量(元胞数组,用{}而非[])
%%tag为目标函数优化方向,+1表示该维朝目标函数大的方向优化,
%%-1表示该维朝目标函数小的方向优化,tag为长度为m的向量
%%xbound为决策空间边界(n维),为2*n的矩阵
%%pnum与gnum为粒子群及外部粒子群数量
%%cubelen为各维度上超立方网格长度,设置为一个值
%%t_max为最大优化次数
%%parameter为粒子转移时的相关参数,为长度为3的向量,依次为惯性权重和加速常数
%%返回该多目标粒子群的pareto前沿
n=size(xbound,2);
x=zeros(pnum,n);%粒子位置
v=zeros(pnum,n);%粒子速度
NP=[];%外部粒子群
%=====================================初始化
for i=1:pnum%初始化位置
x(i,:)=unifrnd(xbound(1,:),xbound(2,:));
end
NP=getDS(x,xfy(f,x),gnum,tag);%初始化非支配集
pbest=x;%初始化粒子自身最好位置
[cube,position]=getcube(xfy(f,NP),cubelen);%各个粒子的分布
p=1/cube(:,1);%定义适应度值
p=p/sum(p);%将适应度转换为概率
sel=select(p,pnum);%为每个粒子选择一个格子
for i=1:pnum
sel(i)=cube(sel(i),ceil(rand*cube(sel(i),1))+1);
end
gbest=NP(sel,:);%为每个粒子选择全局最优解
%====================================开始优化
t=1;
plotnum=[1,ceil([1:20]*(t_max/20))];%测试绘图计数
while t<t_max
% ==========测试绘图============
io=find(plotnum==t);
if io
t
s=xfy(f,NP);subplot(5,4,io);scatter(s(:,1),s(:,2),3,'r');
end
%================================更新粒子位置
mid=v;
v=parameter(1)*v+parameter(2)*rand(pnum,n).*(pbest-x)+...
parameter(3)*rand(pnum,n).*(gbest-x);
x=x+mid;
%================================防止粒子飞出空间
for i=1:pnum
mid=find(x(i,:)>xbound(2,:));
x(i,mid)=xbound(2,mid);
v(i,mid)=-1*v(i,mid);
mid=find(x(i,:)<xbound(1,:));
x(i,mid)=xbound(1,mid);
v(i,mid)=-1*v(i,mid);
end
for i=1:pnum
%================================维护外部粒子档案
if inferior(xfy(f,x(i,:)),xfy(f,NP),tag)
continue;
else
mid=zeros(size(NP,1),1);
for j=1:size(NP,1)
if inferior(xfy(f,NP(j,:)),xfy(f,x(i,:)),tag)
mid(j)=1;
end
end
NP(find(mid),:)=[];NP=[NP;x(i,:)];
if size(NP,1)>gnum
[cube,position]=getcube(xfy(f,NP),cubelen);
mid=find(cube(:,1)==max(cube(:,1)));
mid=mid(ceil(rand*length(mid)));
mid=cube(mid,ceil(rand*cube(mid,1))+1);
NP(mid,:)=[];
end
end
%================================更新粒子历史最优位置
if inferior(xfy(f,pbest(i,:)),xfy(f,x(i,:)),tag)|rand<0.5
pbest(i,:)=x(i,:);
end
end
%===============================更新全局最优粒子
[mid,ll]=setdiff(gbest,NP,'rows');
[cube,position]=getcube(xfy(f,NP),cubelen);%各个粒子的分布
p=1/cube(:,1);%定义适应度值
p=p/sum(p);%将适应度转换为概率
sel=select(p,length(ll));%为每个粒子选择一个格子
for i=1:length(ll)
sel(i)=cube(sel(i),ceil(rand*cube(sel(i),1))+1);
end
gbest(ll,:)=NP(sel,:);%为每个粒子选择全局最优解
t=t+1;
end
评论4