• 大小: 13KB
    文件类型: .m
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: Matlab
  • 标签: 多目标  

资源简介

两个函数进行多目标粒子群优化,可以修改适应值即两个目标函数进行替换

资源截图

代码片段和文件信息


clc
clear all
%**************************************************************%
%---决策空间的设置1---%
m=20;             %population size
D=33;             %each particle position dimension
xmin=0;            %search space upper limit
xmax=2500;         %search space lower limit
vmax=xmax-xmin;     %maximum of velocity
%---决策空间设置1结束--%

%******种群位置与速度初始化*******%
%--薛师兄版本--%     
for i=1:m                                     
for j=1:D
    x(ji)=xmin+(xmax-xmin)*rand; % 产生D*m维矩阵作为粒子的位置信息
    v(ji)=rand*vmax;
end
end
%--薛师兄版本 完毕--%
%******种群位置初始化结束********%

%---目标空间设置---%
maxFun=2;         %number of objective function
%--目标空间设置结束--%

%--进化参数设置--%
maxIterations=40;  %maximum of iterations
wmax=0.9;          %maximum of inertia factor 
wmin=0.4;          %minimum of inertia factor
c1=2;              %1.4962; %learning factor1
c2=2;              %1.4962; %learning factor2
%--进化参数设置结束--%
%***************************************************************%



%*******计算初始种群的适应度值****%
disp(‘开始计算初始种群的适应度值....‘)
for i=1:m
    i
    f(1i)=fitness1(x(:i)D);
    f(2i)=fitness2(x(:i)D);
end

disp(‘计算初始种群的适应度值完毕....‘)
%--计算初始种群的适应度值结束--%

%--将粒子的“位置”信息与“适应度f1,f2”信息结合,生成Stem1矩阵--%
%Stem1矩阵共有m行,D+3列;
%前D列存放m个粒子的位置信息,第D+1列和D+2列分别对应存放双目标的适应度信息f1,f2,第D+3列存放对应粒子的拥挤距离信息
disp(‘生成Stem矩阵....‘)
for i=1:m
    Stem1(i1:D)=x(:i);        %存放位置信息
end
Stem1(:D+1)=f(1:);            %存放适应度信息f1
Stem1(:D+2)=f(2:);            %存放适应度信息f2
Stem1(:D+3)=0;                 %存放粒子拥挤距离信息

pbest=Stem1;
for i=1:m
    px(:i)=pbest(i1:D);       %初始化粒子的历史最优位置px,D*m矩阵
end

%-----外部归档集初始化初始化;外部归档集以Stem1的形式保存粒子信息(位置;适应度;拥挤距离信息)------%
disp(‘外部归档集初始化...‘)
archive=[];
for i=1:m  %每次只考虑将一个粒子加到外部归档集
    if(isempty(archive))        %第一个粒子直接存入archive
        archive(1:)=Stem1(i:); 
    else                        %第二个粒子开始,通过和archive中的所有粒子进行比较,进而判断是否将粒子存入archive
        
        %%--for循环作用:①判断第i个粒子是否可加入档案(“支配”或“非支配”所有archive中粒子) ②标记archive中被粒子i支配的粒子,准备删除
        for k=1:size(archive1) % 依次与archive中的所有粒子进行比较,
                                %注意:【支配】【被支配】【非支配】三种关系!!!
                                %【if与else分支】若待加入的粒子i“支配”某个archive中粒子,则将i支配的所有粒子标记(准备删除),但粒子i不一定被加入档案
                                %若待加入的粒子i与archive中所有粒子均“无支配”(“非支配”)关系,无法判断优劣,则insert-flag置1, 
                                %【elseif分支】若待加入粒子i被archive中某个粒子支配,即“被支配”,则inser-flag
                                %置0,不将第i个粒子加入档案(即使它有可能支配archive其中的粒子)但是被i支配的archive中粒子已被标记! 
            if((Stem1(iD+1)<=archive(kD+1))&&(Stem1(iD+2)<=archive(kD+2))&&(~((Stem1(iD+2)==archive(kD+2))&&(Stem1(iD+1)==archive(kD+1)))))
                %--i dominate k--%
                archive(k1)=1000000;%mark delete k
                insert_flag=1;
            elseif((Stem1(iD+1)>=archive(kD+1))&&(Stem1(iD+2)>=archive(kD+2))&&(~((Stem1(iD+2)==archive(kD+2))&&(Stem1(iD+1)==archive(kD+1)))))
                    %--k dominate i--%
                insert_flag=0

评论

共有 条评论