- 以下源代码为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,