基于matlab的多目标粒子群算法(开源)

代码仅供参考,代码如下:

1.基于最小角度的gbest引导;

2.基于概率和支配关系的pbest引导;

3.基于支配关系和粒子密度的最优集选择;

4.增加克隆变异,对处于目标函数最值得粒子进行克隆与变异,当找到比最值点还要小或者大的点时,替换原来的点;(可以注释这部分)

(代码仅供参考,能运行,如有错误,欢迎留言)

xlimit行数要与适应度函数变量数目相等!!!!!!!!!!!!

结果说明:[变量1,变量2...变量n,适应度函数1,适应度函数2...,适应度函数m];

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------2022/04/13更新----------------------------------------------------------

clc;
close all;
format long

%%%%%%%%%%%%%%%%%%%多目标粒子群算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%多目标多变量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%基于最小角度的全局引导,基于概率的个体引导%%%%%%%%%%%%%%%
%%%%%基于支配关系和粒子密度的A集更新,基于克隆变异的多样性更新%%%%%%%

%% 初始设置
%1. --决策空间的设置-- %
xlimit = [-100,100];
% xlimit = [-5,5;-5,5];   %% 确定位置变量范围,维数与变量个数相等,左小右边大变量名称从左往右为
% xlimit = [0,pi/2;0,pi/2];
% xlimit = [1,1.6;0.3,0.8];
% xlimit = [75,95;4,6;41.5,49];
% xlimit = [1,1.6;0.3,0.8;0.2,0.7;-2.3,2.6];
% xlimit = [1,1.6;0.3,0.8;0.2,0.7;-4,2.6;-5.1,10.25];
c2 = 2;                            %%社会学习系数
c1 = 0.75;                         %%自我学习系数
w = 0.2;                           %%惯性系数
pointnum = 4;                      %几位小数运算
maxgen = 80;                       %迭代步数     100-1000
popsize = 600;                     %种群数    
vrange = 0.3;                      %%速度范围                     
achievemaxnum = 200;               %achieve集最大个数
copymode = 1;                      %是否变异
copynum = 500;                     %克隆个数
colrag = [0.01,0.35];               %变异范围
popdimension = size(xlimit,1);     %变量维数目
vlimit = vrange*[-xlimit(:,2)+xlimit(:,1),xlimit(:,2)-xlimit(:,1)];        %0.1-0.5

%% 2. --种群位置与速度初始化-- %
pop = repmat(xlimit(:,1)',popsize,1)+repmat(diff(xlimit'),popsize,1).*rand(popsize,popdimension);  %一行为一个点
v = repmat(vlimit(:,1)',popsize,1)+repmat(diff(vlimit'),popsize,1).*rand(popsize,popdimension);

%% 3. --计算初始种群的适应度值-- %
fitness = round(fcn(pop)*10^pointnum)/(10^pointnum);       %行向量
fcnnum = size(fitness,2);  %目标函数个数

%% 4. --初始pbest赋值-- %
pbest = pop;
pbestfitness = fitness;
tic;

%% 5. --外部归档集archive初始化-- %
archive = [];
archivefitness = [];

%% 6. --A集更新-- %
for i=1:1:popsize   %每次只考虑将一个粒子加到外部归档集
    %{
    输入-pop、popsize、fitness、archive、archivefitness、achievemaxnum
    输出 archive archivefitness
    %}
    if isempty(archive)       %第一个粒子直接存入archive
        archive(1,:) = pop(i,:);
        archivefitness(1,:) = fitness(i,:);
    else
        bijiaojvzhen = repmat(fitness(i,:),size(archivefitness,1),1);
        bigcop = bijiaojvzhen >= archivefitness;
        equcop = bijiaojvzhen == archivefitness;
        smallcop = bijiaojvzhen <= archivefitness;
        maybedeleterow = all(bigcop > 0,2);   %全大于等于0的行为1
        notdeleterow = all(equcop > 0,2);     %全等于0的行为1
        dominaterow = all(smallcop>0,2);         %被A集支配的行为1
        todeleterow = logical(maybedeleterow - notdeleterow);   %要删除的行为1
        if sum(dominaterow,'all')>0                                        %pop被A集支配
            archive(todeleterow,:) = [];                                    %删除被pop支配A集粒子
            archivefitness(todeleterow,:) = [];                             %删除被pop支配A集粒子
        else                                                                %pop不能被A集支配
            archive(todeleterow,:) = [];                                    %删除被pop支配A集粒子
            archivefitness(todeleterow,:) = [];                             %删除被pop支配A集粒子
            extremum = [min(archivefitness,[],1);...                        %算出适应度端点
                max(archivefitness,[],1)];
            if size(archive,1) < 2                                          %如果空了就直接加进去
                archive(end+1,:) = pop(i,:);
                archivefitness(end+1,:) = fitness(i,:);
            elseif any((fitness(i,:)>extremum(2,:))>0,'all') ||...
                    any((fitness(i,:)<extremum(1,:))>0,'all')               %如果新的点不在旧的区间直接加进去
                archive(end+1,:) = pop(i,:);
                archivefitness(end+1,:) = fitness(i,:);
            else                                                            %如果新的点在旧的区间网格更新
                archivefitnessdist = diff(extremum,1,1);                    %适应度距离 (1行向量)
                elementdist = archivefitnessdist/achievemaxnum;             %单元距离 (1行向量)
                updatacol = (elementdist > 0);                              %对区间大于0的目标
                popmeshnum = zeros(1,fcnnum);                               %粒子网格号码(1行向量)
                archivemeshnum = zeros(size(archive,1),fcnnum);             %A集网格号码(多行向量)
                popmeshnum(:,updatacol) = ceil((fitness(i,updatacol)-extremum(1,updatacol))...
                    ./elementdist(:,updatacol));                            %更新粒子网格号码(1行向量)
                archivemeshnum(:,updatacol) = ceil((archivefitness(:,updatacol)-extremum(1,updatacol))...
                    ./elementdist(:,updatacol));                            %更新A集网格号码(多行向量)
                archivemeshnumuiq = unique(archivemeshnum,'rows');          %A集唯一网格号码(多行向量)
                if ~ismember(popmeshnum,archivemeshnumuiq)                   %如果号码没有粒子,加入
                    archive(end+1,:) = pop(i,:);
                    archivefitness(end+1,:) = fitness(i,:);
                else                                                         %如果号码有粒子了
                    reshapearchivemeshnumuiq = reshape(archivemeshnumuiq.',1,...
                        size(archivemeshnumuiq,2),size(archivemeshnumuiq,1));    %A集唯一网格号码转为三维矩阵(1行)
                    reparchivemeshnum = repmat(archivemeshnum,1,1,...
                        size(archivemeshnumuiq,1));                              %A集网格号码转为三维矩阵&#
  • 2
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值