%% MOPSO Parameters |
MaxIt=200; % Maximum Number of Iterations |
nPop=50; % Population Size |
nRep=50; % Repository Size |
w=0.5; % Inertia Weight |
wdamp=0.99; % Inertia Weight Damping Rate |
c1=1; % Personal Learning Coefficient |
c2=2; % Global Learning Coefficient |
nGrid=5; % Number of Grids per Dimension |
alpha=0.1; % Inflation Rate |
beta=2; % Leader Selection Pressure |
gamma=2; % Deletion Selection Pressure |
mu=0.1; % Mutation Rate |
%% Initialization |
pop=repmat(empty_particle,nPop,1); |
for i=1:nPop |
pop(i).Position=unifrnd(VarMin,VarMax,VarSize); |
pop(i).Velocity=zeros(VarSize); |
pop(i).Cost=CostFunction(pop(i).Position); |
% Update Personal Best |
pop(i).Best.Position=pop(i).Position; |
pop(i).Best.Cost=pop(i).Cost; |
end |
% Determine Domination |
pop=DetermineDomination(pop); |
rep=pop(~[pop.IsDominated]); |
Grid=CreateGrid(rep,nGrid,alpha); |
for i=1:numel(rep) |
rep(i)=FindGridIndex(rep(i),Grid); |
end |
%% MOPSO Main Loop |
for it=1:MaxIt |
for i=1:nPop |
leader=SelectLeader(rep,beta); |
pop(i).Velocity = w*pop(i).Velocity … |
+c1*rand(VarSize).*(pop(i).Best.Position-pop(i).Position) … |
+c2*rand(VarSize).*(leader.Position-pop(i).Position); |
pop(i).Position = pop(i).Position + pop(i).Velocity; |
pop(i).Cost = CostFunction(pop(i).Position); |
% Apply Mutation |
pm=(1-(it-1)/(MaxIt-1))∧(1/mu); |
NewSol.Position=Mutate(pop(i).Position,pm,VarMin,VarMax); |
NewSol.Cost=CostFunction(NewSol.Position); |
rep=[rep; pop(~[pop.IsDominated])]; % Add Non-Dominated Particles to REPOSITORY |
rep=DetermineDomination(rep); % Determine Domination of New Resository Members |
rep=rep(~[rep.IsDominated]); % Keep only Non-Dminated Memebrs in the Repository |
Grid=CreateGrid(rep,nGrid,alpha); % Update Grid |
for i=1:numel(rep) % Update Grid Indices |
rep(i)=FindGridIndex(rep(i),Grid); |
end |
if numel(rep)>nRep % Check if Repository is Full |
Extra=numel(rep)-nRep; |
for e=1:Extra |
rep=DeleteOneRepMemebr(rep,gamma); |
end |
end |