• 以下源代码为MOPSO的双目标规划,目标函数使用ZDT1来测试
  • 多目标粒子群(MOPSO)
  • 起源:1995年,受到鸟群觅食行为的规律性启发,James Kennedy和Russell Eberhart建立了一个简化算法模型,经过多年改进最终形成了粒子群优化算法(Particle Swarm Optimization, PSO) ,也可称为粒子群算法。粒子群算法的思想源于对鸟群觅食行为的研究,鸟群通过集体的信息共享使群体找到最优的目的地。

MATLAB程序:

clc;
 clear;
 close all;
 CostFunction = @(x) evaluate_objective(x);  %目标函数ZDT1
 nVar = 30;                                     %变量个数
 VarSize = [1 nVar];                            %变量矩阵大小
 VarMin = 0;                                    %变量值定义域
 VarMax = 1;                                    %注意: 该函数变量不能出现负值
 MaxIt = 200;                                   %最大迭代次数
 N = 40;                                        %种群规模
 nRep = 50;                                     %档案库大小
 w = 0.9;                                       %惯性权重系数
 wdamp = 0.99;                                  %惯性权重衰减率
 c1 = 1.7;                                      %个体学习因子
 c2 = 1.8;                                      %全局学习因子
 nGrid = 5;                                     %每一维的分格数
 alpha = 0.1;                                   %膨胀率
 beta = 2;                                      %最佳选择压
 gamma = 2;                                     %删除选择压
 mu = 0.1;                                      %变异概率
 empty_particle.Position = [];                  %粒子位置向量
 empty_particle.Velocity = [];                  %粒子速度向量
 empty_particle.Cost = [];                      %粒子目标值向量
 empty_particle.Best.Position = [];             %粒子最佳位置向量
 empty_particle.Best.Cost = [];                 %粒子最佳目标值向量
 empty_particle.IsDominated = [];               %粒子被支配个体向量
 empty_particle.GridIndex = [];                 %粒子栅格索引向量
 empty_particle.GridSubIndex = [];              %粒子栅格子索引向量
 pop = repmat(empty_particle,N,1);              %粒子初始空矩阵
 
 for i = 1:N  %初始化N个个体
     % 产生服从均匀分布, VarSize大小的位置矩阵
     pop(i).Position = unifrnd(VarMin,VarMax,VarSize);
     pop(i).Velocity = zeros(VarSize);
     pop(i).Cost = CostFunction(pop(i).Position);
     pop(i).Best.Position = pop(i).Position;
     pop(i).Best.Cost = pop(i).Cost;
 end
 
 pop = DetermineDomination(pop);
 rep = pop(~[pop.IsDominated]);
 Grid = CreateGrid(rep,nGrid,alpha);
 for i = 1:numel(rep)
     rep(i) = FindGridIndex(rep(i),Grid);
     % GridIndex = 绝对位置,.GridSubIndex = 坐标位置
 end
 
 %MOPSO主循环
 for it = 1:MaxIt
     for i = 1:N %逐一个体更新速度和位置,0.5的概率发生变异
         leader = SelectLeader(rep,