精华内容
下载资源
问答
  • 多目标粒子群算法

    2018-01-16 10:13:09
    多目标粒子群问题-----------------------------------------------------------------------------------------------
  • 多目标粒子群算法,挺详细的完美运行。 目标粒子群(MOPSO)算法是由CarlosA. Coello Coello等在2004年提出来的。目的是将原来只能用在单目标上的粒子群算法(PSO)应用于多目标上。
  • 粒子群算法(启发式算法)的多目标优化,我也翻过一些这方面的论文。单目标多目标优化主要区别在于多目标优化问题有目标函数,一个解对于某个目标来说可能是较好的,而对于其他目标来讲可能是较差的。因此,存在...
  • 使用matlab编程,分为个.m文件编写,包括支配关系选择,全局领导者选择,删除多于的非劣解,创建...套用算法只需要改动Mycost函数与主函数中粒子的取值与维度,即主函数中问题定义处与MOPSO设置处,其余不需要改动
  • 多目标搜索算法相对于单目标算法来说,更加贴近于实际问题,求解结果更具有参考价值。通过多目标搜索算法最终得到的不是一个最优解,而是一个非劣解集,需要从非劣解集中根据实际问题的需要选择一个解作为该问题的...
  • 运筹学优化领域,多目标优化算法多目标自适应粒子群优化算法;并简要介绍了开源多目标优化算法框架jMetal。 原文参见 https://blog.csdn.net/dkjkls/article/details/88364570
  • 基于Pareto支配的多目标粒子群算法程序,用matlab设计实现,已经通过个公认测试函数测试,结果良好。基于Pareto支配的多目标粒子群算法程序,用matlab设计实现,已经通过个公认测试函数测试,结果良好。
  • mopso多目标粒子群算法 python源码 粒子群速度位置更新 pareto最优解集 外部存档 拥挤度计算
  • 针对多目标粒子群算法存在的问题,提出了一种可行性规则动态调整的多目标粒子群算法。在算法中,根据粒子之间的相似度值动态非线性地更新算法的惯性权重,使得算法可以高效地平衡全局和局部搜索之间的矛盾;采用动态...
  • mopso 多目标粒子群算法 mopso 多目标粒子群算法 mopso 多目标粒子群算法 可直接运行
  • 飞行器的航迹规划问题-蚁群算法和多目标粒子群算法的赛题应用,学习算法的最好应用案例,带讲解的算法。
  • 为平衡目标粒子群的全局和局部搜索能力, 提出一种基于高斯混沌变异和精英学习的自适应多目标粒子群算法. 首先, 提出一种新的种群收敛状态检测方法, 自适应调整惯性权重和学习因子的值, 以达到探索和开发的最佳平衡...
  • 文件夹内有三种算法的matlab代码文件,包括多目标粒子群、拉格朗日、增广拉格朗日算法
  • 关于环形拓扑模态多目标粒子群算法的代码,直接在MATLAB上运行即可
  • 改进的约束多目标粒子群算法.pdf
  • 根据Coello和Pulido等在2004年发表的文章Handling Multiple Objectives With Particle Swarm Optimization制作,内附原文及代码
  • Multi-Objective Particle Swarm Optimization (MOPSO) is proposed by Coello Coello et al., in 2004. It is a multi-objective version of PSO which incorporates the Pareto Envelope and grid making ...
  • 为提高多目标粒子群算法的局部搜索能力,提出了一种模糊学习子群多目标粒子群算法(FLSMOPSO)。在搜索过程中,每个粒子模糊自适应学习生成不确定的p个粒子形成一个子群而不是只产生一个新粒子,然后在其中选择模糊...
  • 网格环境的特点是开放性和动态性,...将多目标粒子群优化算法应用于求解网格工作流调度中的目标优化问题,并尝试对MOPSO算法进行改进,以更好地适应网格工作流调度系统。实验表明,该算法是可行的且具有良好的可扩展性。
  • A题飞行器的航迹规划问题-蚁群算法和多目标粒子群算法的赛题应用,学习算法的最好应用案例,带讲解的算法。
  • 提出了一个改进的粒子群算法并将其用于解决多目标优化问题.该算法利用粒子群算法的信息传递机制,引入多目标演化算法常用的归档技术,采用 SPEA2算法的环境选择和配对选择策略,使得整个群体在保持适当的选择压力的情况...
  • 多目标粒子群优化算法(PSO)的MATLAB程序,其中还以风电场为例进行算法的应用。该算法只需根据实际情况修改适应度函数即可。单目标见后续
  • MOPSO多目标粒子群算法nsga算法
  • 占优的自适应多目标粒子群算法(??DMOPSO). 在??DMOPSO算法中, 每个粒子的 邻居根据粒子的运行动态地组建, 且粒子的速度不由其邻居中运行最好的粒子来调整, 而是由其所有邻居共同调整. 同时, 采用外部存档...
  • 为了平衡多目标粒子群算法的多样性和收敛性,提出一种基于多样性检测的多子群多目标粒子群算法.首先,将多样性检测方法引入到多目标粒子群算法中,并结合多目标粒子群算法的特点进行改进.然后,将种群分为两个不同分工的...
  • A structure MATLAB implementation of MOPSO for Evolutionary Multi-Objective Optimization A structured MATLAB implementation of MOEA/D for Evolutionary Multi-Objective Optimization
  • 代码仅供参考,代码如下: 1.基于最小角度的gbest引导; 2.基于概率和支配关系的pbest引导; 3.基于支配关系和粒子密度的最优集选择;...%%%%%%%%%%%%%%%%%%%多目标粒子群算法%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

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

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

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

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

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

    clc;
    clear;
    close all;
    format bank
    
    %%%%%%%%%%%%%%%%%%%多目标粒子群算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%多目标多变量%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%基于最小角度的全局引导,基于概率的个体引导%%%%%%%%%%%%%%%
    %%%%%基于支配关系和粒子密度的A集更新,基于克隆变异的多样性更新%%%%%%%
    
    %1. --决策空间的设置-- %
    % limit = [-5,5;-5,5];   %% 确定位置变量范围,一行为一个变量
    % limit = [1,1.6;0.3,0.8];
    limit = [75,95;4,6;41.5,49];
    % limit = [1,1.6;0.3,0.8;0.2,0.7;-2.3,2.6];
    % limit = [1,1.6;0.3,0.8;0.2,0.7;-4,2.6;-5.1,10.25];
    popsize = 1000;           %种群数    目标函数个数*1000
    maxgen = 5;               %迭代步数     100-1000
    fcnnum = 2;               %目标函数个数
    achievemaxnum = 200;      %achieve集最大个数
    copynum = 100;            %克隆个数
    
    w = 0.2;
    c1 = 0.6;           %1.4962; %learning factor1
    c2 = 1.5;           %1.4962; %learning factor2
    virnum = size(limit,1);   %变量维数目
    vlimit = 0.3*[-limit(:,2) + limit(:,1),limit(:,2) - limit(:,1)];     %0.1-0.5速度限制
    box = zeros(popsize,virnum+fcnnum+fcnnum);         %点位置,适应度,网格号码
    
    %2. --种群位置与速度初始化-- %
    box(:,1:virnum) = repmat(limit(:,1)',popsize,1)+repmat(diff(limit'),popsize,1).*rand(popsize,virnum);  %一行为一个点
    x = box(:,1:virnum);
    v = repmat(vlimit(:,1)',popsize,1)+repmat(diff(vlimit'),popsize,1).*rand(popsize,virnum);
    
    %3. --计算初始种群的适应度值-- %
    for i = 1: 1: popsize
        box(i,virnum +1 : virnum + fcnnum) = fcn1(box(i,1:virnum));
    end
    
    %4. --初始pbest赋值-- %
    pbest = box;
    
    %5. --外部归档集archive初始化-- %
    disp('----开始初始化----');
    tic;
    archive = [];
    for i=1:1:popsize  %每次只考虑将一个粒子加到外部归档集
        noordtimes = 0;
        if(isempty(archive))        %第一个粒子直接存入archive
            archive(1,:) = box(i,:);
        else
            for k = 1:1:size(archive,1)              %依次与archive中的所有粒子进行比较
                bigcop = box(i,virnum+1:virnum+fcnnum) ...
    >= archive(k,virnum+1:virnum+fcnnum);
                equcop = box(i,virnum+1:virnum+fcnnum) ...
    == archive(k,virnum+1:virnum+fcnnum);%适应度大小关系
                if all(bigcop == 1,2) && ~all(equcop == 1,2) %支配archive中的一个粒子
                    archive(k,:) = -71.5 + 28.15i;       %k做标记
                    noordtimes = noordtimes + 1;
                elseif all(bigcop == 0,2) || all(equcop == 1,2) %被archive中的一个粒子支配
                    %无操作,但不加noordtimes,避免加入archive
                else                                            %无支配关系
                    noordtimes = noordtimes + 1;
                end
            end
            %与所有archive粒子比较完成后
            archive(all(archive == -71.5 + 28.15i,2),:) = [];  %去掉标记的行
            if (isempty(archive))
                archive(1,:) = box(i,:);
            else
                %%%%%更新archive
                %计算archive中粒子的网格号码
                extremum = [min(archive(:,virnum+1:virnum+fcnnum),[],1);...
                    max(archive(:,virnum+1:virnum+fcnnum),[],1)];     %找到archive适应度函数最值
                normofa = (diff(extremum,1,1))/achievemaxnum;            %找到archive适应度函数max - min距离
                cols = find(normofa~=0);    %找到archive适应度函数max - min部位零的列 (包含列的信息)
                archive(:,virnum+fcnnum+cols) = ceil((archive(:,virnum+cols) - extremum(1,cols))./normofa(1,cols));
                
                %统计archive中粒子的每个网格号码出现次数
                meshsnum = archive(:,virnum+fcnnum+1:end);            %archive中的粒子序列号传递到meshsnum,保持位置一致
                meshsnum(meshsnum>achievemaxnum) = achievemaxnum;
                meshsnumuni = unique(meshsnum,'rows');                %archive中的粒子的唯一序列号集meshsnumuni(无重复)
                meshsnumuni(:,end+1) = 0;                             %在meshsnumuni加一列,记录次数
                %%%%%更新archive完成
                
                if noordtimes == size(archive,1)               %对点box(i,:)可以加入a集
                    for iii = 1:1:size(meshsnumuni,1)
                        meshsnumuni(iii,end) = sum(ismember(meshsnum,meshsnumuni(iii,1:fcnnum),'rows')); %确定每个序列号的次数,即网格里面的粒子数
                    end
                    %网格里面最多,最少,平均的粒子数(只统计有粒子的)
                    meanpointnuminmesh = mean(meshsnumuni(:,end));             %粒子数均值
                    minpointnuminmesh = min(meshsnumuni(:,end),[],'all');      %粒子数最少(不小于1)
                    maxpointnuminmesh = max(meshsnumuni(:,end),[],'all');      %粒子数最多
                    
                    if sum((box(i,virnum+1:virnum+fcnnum) >  extremum(2,:)))>0  %点i有一个最大值大于所有a集的粒子,加入
                        archive(end+1,:) = box(i,:);
                    elseif sum((box(i,virnum+1:virnum+fcnnum) < extremum(1,:)))>0 %点i有一个最小值小于a集的粒子,加入
                        archive(end+1,:) = box(i,:);
                    else     %%点i在a集中间则计算i点在a集的网格号码
                        box(i,virnum+fcnnum+cols) = ceil((box(i,virnum+cols) - extremum(1,cols))./normofa(1,cols));
                        tempmatrix = box(i,virnum+fcnnum+cols);
                        tempmatrix(tempmatrix>achievemaxnum) = achievemaxnum;
                        box(i,virnum+fcnnum+cols) = tempmatrix;   %得到序列号
                        meshfindrow = find(ismember(meshsnumuni(:,1:fcnnum),box(i,virnum+fcnnum+1:end),'rows'));%得到序列号是否在已知的序列号中,找到是meshsnumuni的哪一行(meshfindrow行)
                        if isempty(meshfindrow)      %网格号码不在已知
                            archive(end+1,:) = box(i,:);
                        else                     %网格号码在已知,计算概率
                            if maxpointnuminmesh - minpointnuminmesh == 0   %网格的粒子数都一样
                                p = 0.21;
                                if rand(1,1) < p
                                    archive(end+1,:) = box(i,:);
                                    meshsnumuni(meshfindrow,end) = meshsnumuni(meshfindrow,end) + 1; %次数加1
                                end
                            else                                           %网格的粒子数不一样
                                if (meanpointnuminmesh - meshsnumuni(meshfindrow,end))>=0    %本号码所对应粒子数少于平均
                                    p = (((meanpointnuminmesh - meshsnumuni(meshfindrow,end))/...
                                        (meanpointnuminmesh - minpointnuminmesh))*0.74+0.21);  %计算p
                                    if rand(1,1) < p
                                        archive(end+1,:) = box(i,:);
                                        meshsnumuni(meshfindrow,end) = meshsnumuni(meshfindrow,end) + 1;
                                    end
                                elseif (meanpointnuminmesh - meshsnumuni(meshfindrow,end))< 0    %%本号码所对应粒子数大于平均
                                    p = (((meshsnumuni(meshfindrow,end) - maxpointnuminmesh)/...
                                        (meanpointnuminmesh - maxpointnuminmesh))*0.24+0.01);  %计算p
                                    if rand(1,1) < p
                                        archive(end+1,:) = box(i,:);
                                        meshsnumuni(meshfindrow,end) = meshsnumuni(meshfindrow,end) + 1;
                                    end
                                end
                            end
                        end
                    end
                else     %点不可以加入a集
                    %无操作
                end
            end
        end
        if size(archive,1) <= achievemaxnum  %a集未超出范围
            %无操作
        else                                %a集超出范围
            rowmax = find( meshsnumuni(:,end) == max(meshsnumuni(:,end),[],'all') ); %meshsnumuni集中密度最大的序号(rowmax行)
            alltodeletpointindex = ismember(meshsnum,meshsnumuni(rowmax(randi([1,size(rowmax,1)],1,1)),1:fcnnum),'row');
            rowtodelet = find(alltodeletpointindex~=0); %meshsnumuni集中rowmax行的序列对应的a集粒子的行号码(rowtodelet行)
            tempclec = randi([1,size(rowtodelet,2)],1,1);%随机在rowtodelet行中取一个行号
            archive(rowtodelet(tempclec),:) = [];
        end
    end
    %更新archive中粒子的网格号码
    extremum = [min(archive(:,virnum+1:virnum+fcnnum),[],1);...
        max(archive(:,virnum+1:virnum+fcnnum),[],1)];     %找到archive适应度函数最值
    normofa = (diff(extremum,1,1))/achievemaxnum;            %找到archive适应度函数max - min距离
    cols = find(normofa~=0);    %找到archive适应度函数max - min部位零的列 (包含列的信息)
    archive(:,virnum+fcnnum+cols) = ceil((archive(:,virnum+cols) - extremum(1,cols))./normofa(1,cols));
    tempmatrix = archive(:,virnum+fcnnum+cols);
    tempmatrix(tempmatrix>achievemaxnum) = achievemaxnum;
    archive(:,virnum+fcnnum+cols) = tempmatrix;
    clear tempclec iii tempmatrix;
    archive = sortrows(archive,virnum+1);              %初始化完好的archive集合
    toc;
    disp('----初始化完成----');
    
    archiverownums = size(archive,1);                 %archive行数
    extremum = [min(archive(:,virnum+1:virnum+fcnnum),[],1);...
        max(archive(:,virnum+1:virnum+fcnnum),[],1)]; %archive适应度函数最值
    if archiverownums < 5
        disp('增加种群数!');
        cont = 0;
    else
        %6. --计算第一代gbest-- %
        angle = zeros(archiverownums,1);
        gpbstindex = zeros(popsize,1);
        for i = 1:1:popsize         %对每一个粒子:计算当前空间中与a集角度最小的粒子
            for j = 1:1:archiverownums  %a集每个粒子
                angle(j,1) = acosd(dot(box(i,virnum +1 : virnum + fcnnum),archive(j,virnum +1 : virnum + fcnnum))...
                    /(norm(box(i,virnum +1 : virnum + fcnnum))*norm(archive(j,virnum +1 : virnum + fcnnum))));
            end
            tempgpbstindex = find( angle==min(angle,[],'all') );  %a集的行号,本身为列向量
            gpbstindex(i,1) = tempgpbstindex( randi([1,size(tempgpbstindex,2)],1,1) );  %随机取个可行的a集的行号
        end
        gbest = [archive(gpbstindex,1:virnum),gpbstindex];
        clear angle gpbstindex i j tempgpbstindex gpbstindex
        
        %%%%%%%%%------------主循环-----------------%%%%%%%%
        disp('****开始主循环****');
        crtg = 1;
        %画图
        Fontsize = 10.5;
        LineWidth = 1.5;
        f1 = figure(1);
        f1.Visible = 'on';
        f1.Units = 'centimeters';
        f1.Position = [25 13 16 9];
        f1.Color = 'w';
        f1.NumberTitle = 'off';
        f1.Name = 'max';
        f1.Resize = 'off';
        ax1 = axes(f1);
        ax1.Box = 'off';
        ax1.Units = 'normalized';
        ax1.Position = [0.12 0.15 0.8 0.8];
        ax1.PositionConstraint = 'innerposition';
        ax1.Visible = 'on';
        ax1.NextPlot = 'add';
        ax1.Color= 'w';
        ax1.TickDir = 'in';
        ax1.FontUnits =  'points';
        ax1.FontSize = Fontsize;
        ax1.LineWidth = LineWidth;
        ax1.FontName = 'Times New Roman';
        ax1.FontWeight = 'bold';
        ax1.TitleFontSizeMultiplier = 1;
        ax1.LabelFontSizeMultiplier = 1;
        ax1.XColor = 'k';
        ax1.YColor = 'k';
        ax1.YAxisLocation = 'left';
        ax1.XAxisLocation = 'origin';
        ax1.TickLength = [0.005,0.035];
        ax1.XDir = 'normal';
        ax1.YDir = 'normal';
        grid(ax1,'on');
        ax1.GridLineStyle = '--';
        ax1.GridAlpha = 0.85;
        ax1.GridColor =  [0.85,0.85,0.85];
        f2 = figure(2);
        f2.Visible = 'on';
        f2.Units = 'centimeters';
        f2.Position = [25 1.5 16 9];
        f2.Color = 'w';
        f2.NumberTitle = 'off';
        f2.Name = 'min';
        f2.Resize = 'off';
        ax2 = axes(f2);
        ax2.Box = 'off';
        ax2.Units = 'normalized';
        ax2.Position = [0.12 0.15 0.8 0.8];
        ax2.PositionConstraint = 'innerposition';
        ax2.Visible = 'on';
        ax2.NextPlot = 'add';
        ax2.Color= 'w';
        ax2.TickDir = 'in';
        ax2.FontUnits =  'points';
        ax2.FontSize = Fontsize;
        ax2.LineWidth = LineWidth;
        ax2.FontName = 'Times New Roman';
        ax2.FontWeight = 'bold';
        ax2.TitleFontSizeMultiplier = 1;
        ax2.LabelFontSizeMultiplier = 1;
        ax2.XColor = 'k';
        ax2.YColor = 'k';
        ax2.YAxisLocation = 'left';
        ax2.XAxisLocation = 'origin';
        ax2.TickLength = [0.005,0.035];
        ax2.XDir = 'normal';
        ax2.YDir = 'normal';
        grid(ax2,'on');
        ax2.GridLineStyle = '--';
        ax2.GridAlpha = 0.85;
        ax2.GridColor =  [0.85,0.85,0.85];
        colormatrix = rand(fcnnum,3);
        maxfcn = zeros(fcnnum,maxgen);
        %画图
        tic;
        while(crtg <= maxgen)
            %8. --粒子的速度、位置更新与边界处理-- %%
            for j = 1: 1: popsize
                v(j,:)=w*v(j,:)+c1*rand*(pbest(j,1:virnum)-x(j,:))+c2*rand*(gbest(j,1:virnum)-x(j,:));
            end
            for j= 1: 1: virnum
                for k = 1: 1: popsize
                    if v(k,j) > vlimit(j,2)
                        v(k,j) = vlimit(j,2);
                    elseif v(k,j) < vlimit(j,1)
                        v(k,j) = vlimit(j,1);
                    end
                end
            end
            x(j,:) = x(j,:) + v(j,:);
            for j= 1: 1: virnum
                for k = 1: 1: popsize
                    if x(k,j) > limit(j,2)
                        x(k,j) = limit(j,2);
                    elseif x(k,j) < limit(j,1)
                        x(k,j) = limit(j,1);
                    end
                end
            end
            
            %9. --更新box信息矩阵-- %
            box(:,1:virnum) = x;
            for j = 1: 1: popsize
                box(j,virnum +1 : virnum + fcnnum) = fcn1 (box(j,1:virnum));
            end
            
            %10. --archive矩阵更新-- %
            for i=1:1:popsize  %每次只考虑将一个粒子加到外部归档集
                noordtimes = 0;
                if(isempty(archive))        %第一个粒子直接存入archive
                    archive(1,:) = box(i,:);
                else
                    for k = 1:1:size(archive,1)              %依次与archive中的所有粒子进行比较
                        bigcop = box(i,virnum+1:virnum+fcnnum) >= archive(k,virnum+1:virnum+fcnnum);
                        equcop = box(i,virnum+1:virnum+fcnnum) == archive(k,virnum+1:virnum+fcnnum);%适应度大小关系
                        if all(bigcop == 1,2) && ~all(equcop == 1,2)    %支配archive中的一个粒子
                            archive(k,:) = -71.5 + 28.15i;       %k做标记
                            noordtimes = noordtimes + 1;
                        elseif all(bigcop == 0,2) || all(equcop == 1,2) %被archive中的一个粒子支配
                            %无操作,但不加noordtimes,避免加入archive
                        else                                            %无支配关系
                            noordtimes = noordtimes + 1;
                        end
                    end
                    %与所有archive粒子比较完成后
                    archive(all(archive == -71.5 + 28.15i,2),:) = [];  %去掉标记的行
                    if (isempty(archive))
                        archive(1,:) = box(i,:);
                    else
                        %%%%%更新archive
                        %计算archive中粒子的网格号码
                        extremum = [min(archive(:,virnum+1:virnum+fcnnum),[],1);...
                            max(archive(:,virnum+1:virnum+fcnnum),[],1)];        %找到archive适应度函数最值
                        normofa = (diff(extremum,1,1))/achievemaxnum;            %找到archive适应度函数max - min距离
                        cols = find(normofa~=0);    %找到archive适应度函数max - min部位零的列 (包含列的信息)
                        archive(:,virnum+fcnnum+cols) = ceil((archive(:,virnum+cols) - extremum(1,cols))./normofa(1,cols));
                        
                        %统计archive中粒子的每个网格号码出现次数
                        meshsnum = archive(:,virnum+fcnnum+1:end);            %archive中的粒子序列号传递到meshsnum,保持位置一致
                        meshsnum(meshsnum>achievemaxnum) = achievemaxnum;
                        meshsnumuni = unique(meshsnum,'rows');                %archive中的粒子的唯一序列号集meshsnumuni(无重复)
                        meshsnumuni(:,end+1) = 0;                             %在meshsnumuni加一列,记录次数
                        %%%%%更新archive完成
                        
                        if noordtimes == size(archive,1)                      %对点box(i,:)可以加入a集
                            for iii = 1:1:size(meshsnumuni,1)
                                meshsnumuni(iii,end) = sum(ismember(meshsnum,meshsnumuni(iii,1:fcnnum),'rows')); %确定每个序列号的次数,即网格里面的粒子数
                            end
                            %网格里面最多,最少,平均的粒子数(只统计有粒子的)
                            meanpointnuminmesh = mean(meshsnumuni(:,end));             %粒子数均值
                            minpointnuminmesh = min(meshsnumuni(:,end),[],'all');      %粒子数最少(不小于1)
                            maxpointnuminmesh = max(meshsnumuni(:,end),[],'all');      %粒子数最多
                            
                            if sum((box(i,virnum+1:virnum+fcnnum) >  extremum(2,:)))>0  %点i有一个最大值大于所有a集的粒子,加入
                                archive(end+1,:) = box(i,:);
                            elseif sum((box(i,virnum+1:virnum+fcnnum) < extremum(1,:)))>0 %点i有一个最小值小于a集的粒子,加入
                                archive(end+1,:) = box(i,:);
                            else     %%点i在a集中间则计算i点在a集的网格号码
                                box(i,virnum+fcnnum+cols) = ceil((box(i,virnum+cols) - extremum(1,cols))./normofa(1,cols));
                                tempmatrix = box(i,virnum+fcnnum+cols);
                                tempmatrix(tempmatrix>achievemaxnum) = achievemaxnum;
                                box(i,virnum+fcnnum+cols) = tempmatrix;   %得到序列号
                                meshfindrow = find(ismember(meshsnumuni(:,1:fcnnum),box(i,virnum+fcnnum+1:end),'rows'));%得到序列号是否在已知的序列号中,找到是meshsnumuni的哪一行(meshfindrow行)
                                if isempty(meshfindrow)      %网格号码不在已知,计算单个号码的重复次数
                                    archive(end+1,:) = box(i,:);
                                else                     %网格号码在已知,计算概率
                                    if maxpointnuminmesh - minpointnuminmesh == 0   %网格的粒子数都一样
                                        p = 0.21; %0.21
                                        if rand(1,1) < p
                                            archive(end+1,:) = box(i,:);
                                            meshsnumuni(meshfindrow,end) = meshsnumuni(meshfindrow,end) + 1; %次数加1
                                        end
                                    else                                           %网格的粒子数不一样
                                        if (meanpointnuminmesh - meshsnumuni(meshfindrow,end))>=0    %本号码所对应粒子数少于平均
                                            p = (((meanpointnuminmesh - meshsnumuni(meshfindrow,end))/...
                                                (meanpointnuminmesh - minpointnuminmesh))*0.75+0.21);  %计算p
                                            if rand(1,1) < p
                                                archive(end+1,:) = box(i,:);
                                                meshsnumuni(meshfindrow,end) = meshsnumuni(meshfindrow,end) + 1;
                                            end
                                        elseif (meanpointnuminmesh - meshsnumuni(meshfindrow,end))< 0    %%本号码所对应粒子数大于平均
                                            p = (((meshsnumuni(meshfindrow,end) - maxpointnuminmesh)/...
                                                (meanpointnuminmesh - maxpointnuminmesh))*0.2+0.01);  %计算p
                                            if rand(1,1) < p
                                                archive(end+1,:) = box(i,:);
                                                meshsnumuni(meshfindrow,end) = meshsnumuni(meshfindrow,end) + 1;
                                            end
                                        end
                                    end
                                end
                            end
                        else     %点不可以加入a集
                            %无操作
                        end
                    end
                end
                if size(archive,1) <= achievemaxnum  %a集未超出范围
                    %无操作
                else                                %a集超出范围
                    rowmax = find( meshsnumuni(:,end) == max(meshsnumuni(:,end),[],'all') ); %meshsnumuni集中密度最大的序号(rowmax行)
                    alltodeletpointindex = ismember(meshsnum,meshsnumuni(rowmax(randi([1,size(rowmax,1)],1,1)),1:fcnnum),'row');
                    rowtodelet = find(alltodeletpointindex~=0); %meshsnumuni集中rowmax行的序列对应的a集粒子的行号码(rowtodelet行)
                    tempclec = randi([1,size(rowtodelet,2)],1,1);%随机在rowtodelet行中取一个行号
                    archive(rowtodelet(tempclec),:) = [];
                end
            end
            
            %更新archive中粒子的网格号码
            extremum = [min(archive(:,virnum+1:virnum+fcnnum),[],1);...
                max(archive(:,virnum+1:virnum+fcnnum),[],1)];     %找到archive适应度函数最值
            normofa = (diff(extremum,1,1))/achievemaxnum;            %找到archive适应度函数max - min距离
            cols = find(normofa~=0);    %找到archive适应度函数max - min部位零的列 (包含列的信息)
            archive(:,virnum+fcnnum+cols) = ceil((archive(:,virnum+cols) - extremum(1,cols))./normofa(1,cols));
            tempmatrix = archive(:,virnum+fcnnum+cols);
            tempmatrix(tempmatrix>achievemaxnum) = achievemaxnum;
            archive(:,virnum+fcnnum+cols) = tempmatrix;
            clear tempclec iii tempmatrix;
            archiverownums = size(archive,1);
            archive = sortrows(archive,virnum+1);              %更新完好的archive集合
            
            %12. --更新gbest-- %
            angle = zeros(archiverownums,2);
            angle(:,2) = (1:size(archive,1)).';
            gpbstindex = zeros(popsize,1);
            for i = 1:1:popsize         %对每一个粒子:计算当前空间中与a集角度最小的粒子
                for j = 1:1:archiverownums     %a集每个粒子
                    angle(j,1) = acosd(dot(box(i,virnum +1 : virnum + fcnnum),archive(j,virnum +1 : virnum + fcnnum))...
                        /(norm(box(i,virnum +1 : virnum + fcnnum))*norm(archive(j,virnum +1 : virnum + fcnnum))));%第一列为角度,第二列为a集的序列号
                end
                angle = sortrows(angle,1);
                tempgpbstindex = angle(1:round(size(archive,1)*0.1),end);   %a集的行号(取前15%的a集行号),本身为列向量
    %             tempgpbstindex = find( angle==min(angle,[],'all') );  %a集的行号,本身为列向量
                gpbstindex(i,1) = tempgpbstindex( randi([1,size(tempgpbstindex,1)],1,1) );  %随机取个可行的a集的行号(列向量)
            end
            %测试 全局最优点粒子浓度
            gpbstindexuni = unique(gpbstindex);
            for i = 1:1:size(gpbstindexuni,1)
                gpbstindexuni(i,2) = sum(ismember(gpbstindex,gpbstindexuni(i,1)));  %以gpbstindexuni(:,1)位全局最优点的box粒子数目
            end
            %测试
            gbest = [archive(gpbstindex,1:virnum),gpbstindex];
            clear angle gpbstindex i j tempgpbstindex gpbstindex
            
            %13. --更新pbest-- %
            for i = 1:1:popsize
                bigcop = box(i,virnum+1:virnum+fcnnum) >= pbest(i,virnum+1:virnum+fcnnum);
                equcop = box(i,virnum+1:virnum+fcnnum) == pbest(i,virnum+1:virnum+fcnnum);
                if all(bigcop == 1,2) && ~all(equcop == 1,2)
                    %--新点代替旧点--%
                    pbest(i,:)= box(i,:);
                elseif all(bigcop == 0,2) || all(equcop == 1,2)
                    %--新点无法代替旧点--%
                else
                    %--新点代替旧点无法判断--%
                    if rand(1,1) >= 0.5
                        pbest(i,:)= box(i,:);
                    end
                end
            end
            
            %-------克隆变异--------%
            variindex = zeros(2,fcnnum);
            for i = 1:1:fcnnum
                varitemp2 = find( box(:,virnum+i) == max(box(:,virnum+i),[],'all') );     %要变异的box序列值,最大值行
                varitemp1 = find( box(:,virnum+i) == min(box(:,virnum+i),[],'all') );     %要变异的box序列值,最小值行
                variindex(:,i) = [varitemp1(1);varitemp2(1)];   %对应函数i要变异的box行数
            end
            clear varitemp2 varitemp;
            variindex = reshape(variindex,1,[]);
            variindex = unique(variindex);                      %全部无重复要变异的box行数索引(行向量)
            for  i = 1:1:size(variindex,2)
                variboxindex = variindex(i);
                varicopy = repmat(box(variboxindex,:),copynum,1);
                varicopy(2:end,1:virnum) = varicopy(2:end,1:virnum)+...
                    ( (0.4* rand(size(varicopy(2:end,1:virnum),1),size(varicopy(2:end,1:virnum),2)) -0.2)...
                    .*varicopy(2:end,1:virnum) );
                for j= 1: 1: size(varicopy(2:end,1:virnum),2)                 %防止超出边界
                    for k = 1: 1: size(varicopy(2:end,1:virnum),1)
                        if varicopy(k+1,j) > limit(j,2)
                            varicopy(k+1,j) = limit(j,2);
                        elseif varicopy(k+1,j) < limit(j,1)
                            varicopy(k+1,j) = limit(j,1);
                        end
                    end
                end
                %-------更新varicopy矩阵--------%
                for j = 1: 1: size(varicopy(2:end,1:virnum),1)
                    varicopy(j+1,virnum+1:virnum+fcnnum) = fcn1( varicopy(j+1,1:virnum) );
                end
                %-------选择varicopy矩阵中占优的------%
                maxcelectmatrix = (varicopy(2:end,virnum+1:virnum+fcnnum) > extremum(2,:));
                mincelectmatrix = (varicopy(2:end,virnum+1:virnum+fcnnum) < extremum(1,:));
                maxcelectmatrixsum = sum(maxcelectmatrix,2);
                mincelectmatrixsum = sum(mincelectmatrix,2);
                if max(maxcelectmatrixsum,[],'all')==0 && max(mincelectmatrixsum,[],'all')==0  %max(maxcelectmatrixsum,[],'all')==0 %
                    %无操作
                    %                     elseif max(maxcelectmatrixsum,[],'all')~=0
                else
                    if max(maxcelectmatrixsum,[],'all') >= max(mincelectmatrixsum,[],'all')
                        tovarirow = find( maxcelectmatrixsum==max(maxcelectmatrixsum,[],'all') );
                        x(j,:) = varicopy(tovarirow(1)+1,1:virnum);
                        pbest(j,1:virnum) = x(j,:);
                        gbest(j,1:virnum) = x(j,:);
                        v(j,:) = 0;
                    else
                        tovarirow = find( mincelectmatrixsum==max(mincelectmatrixsum,[],'all') );
                        x(j,:) = varicopy(tovarirow(1)+1,1:virnum);
                        pbest(j,1:virnum) = x(j,:);
                        gbest(j,1:virnum) = x(j,:);
                    end
                end
            end
            %-------克隆变异--------%
            
            maxfcn(:,crtg) = extremum(2,:).';
            minfcn(:,crtg) = extremum(1,:).';
            if crtg > 1
                for i = 1:1:fcnnum
                    p1 = plot(ax1,[crtg-1,crtg],[maxfcn(i,crtg-1),maxfcn(i,crtg)]);
                    p1.Visible = 'on';
                    p1.LineWidth = LineWidth;
                    p1.Color = colormatrix(i,:);
                    p1.LineStyle = '-';
                    p1.LineJoin = 'round';
                    ax1.XScale = 'linear';
                    ax1.YScale = 'linear';
                    p1 = plot(ax2,[crtg-1,crtg],[minfcn(i,crtg-1),minfcn(i,crtg)]);
                    p1.Visible = 'on';
                    p1.LineWidth = LineWidth;
                    p1.Color = colormatrix(i,:);
                    p1.LineStyle = '-';
                    p1.LineJoin = 'round';
                    ax2.XScale = 'linear';
                    ax2.YScale = 'linear';
                    pause(0.1);
                end
            end
            crtg = crtg +1;
        end
        toc;
        disp('****完成主循环****');
        disp('结果见PerotPoint');
        meanv = mean(v,'all');
        cont = 1;
        PerotPoint = sortrows(archive(:,1:end),virnum+1,'descend');
        clear xmin archiverownums bigcop box c1 c2 copyarchive copyarchive2 crtg...
            dist equcop extremum fcnnum i j k limit maxgen noordtimes pbest...
            popsize replacetimes  virnum vlimit vmax w x v xmax archive tempmatrix...
            achievemaxnum alltodeletpointindex cols maxpointnuminmesh ...
            meanpointnu minmeshmeshfindrow meshsnum meshsnumuni gpbstindexuni ...
            minpointnuminmesh normofa p rowmax rowtodelet colormatrix...
            p1 ax1 ax2 cont f1 f2 Fontsize h1 LineWidth maxfcn gbest...
            meanpointnuminmesh meanv meshfindrow minfcn varitemp1 ...
            variboxindex varicopy variindex mincelectmatrixsum copynum...
            maxcelectmatrix  mincelectmatrix tovarirow maxcelectmatrixsum;
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    function y = fcn1(x)    %%注意适应度函数越大越好
    x1 = x(:,1);
    x2 = x(:,2);
    x3 = x(:,3);
    y(1,1) = 100*sin(x1+x2+x3);             %目标函数1
    y(1,2) = 100*cos(x1+x2+x3);             %目标函数2
    % y(1,3) = sin(x2+x3);                  %目标函数3
    % y(1,4) = cos(x2+x3);                  %目标函数4
    end

    展开全文
  • 针对该问题,提出一种基于粒子群的高维多目标问题求解方法,在目标空间中引入一系列的参考点,根据参考点筛选出能兼顾多样性和收敛性的非支配解作为粒子的全局最优,以增大选择压力.同时,提出了基于参考点的外部档案维护...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,132
精华内容 2,452
关键字:

多目标粒子群算法

友情链接: I2C_EEPROM.rar