-
以下源代碼為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,beta); %從支配個體輪盤賭選出全局最佳個體