多目标粒子群算法(MOPSO)函数寻优附Matlab代码

一、运行结果

二、多目标粒子群算法(MOPSO)函数寻优Matlab代码 

clc;
clear;
close all;
%% Problem Definition
CostFunction = @(x) ZDT(x);      % Cost Function
nVar = 5;             % Number of Decision Variables
VarSize = [1 nVar];   % Size of Decision Variables Matrix
VarMin = 0;          % Lower Bound of Variables
VarMax = 1;          % Upper Bound of Variables
%% MOPSO Parameters
MaxIt = 200;           % Maximum Number of Iterations
nPop = 200;            % Population Size
nRep = 100;            % Repository Size
w = 0.5;              % Inertia Weight
wdamp = 0.99;         % Intertia Weight Damping Rate
c1 = 1;               % Personal Learning Coefficient
c2 = 2;               % Global Learning Coefficient
nGrid = 7;            % 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
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, 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).Position = max(pop(i).Position, VarMin);
        pop(i).Position = min(pop(i).Position, VarMax);  
        pop(i).Cost = CostFunction(pop(i).Position);
        
        if Dominates(pop(i), pop(i).Best)
            pop(i).Best.Position = pop(i).Position;
            pop(i).Best.Cost = pop(i).Cost;    
        elseif Dominates(pop(i).Best, pop(i))
            % Do Nothing      
        else
            if rand<0.5
                pop(i).Best.Position = pop(i).Position;
                pop(i).Best.Cost = pop(i).Cost;
            end
        end
        
    end
    % Add Non-Dominated Particles to REPOSITORY
    rep = [rep
         pop(~[pop.IsDominated])]; %#ok
    % Determine Domination of New Resository Members
    rep = DetermineDomination(rep);
    % Keep only Non-Dminated Memebrs in the Repository
    rep = rep(~[rep.IsDominated]);
    % Update Grid
    Grid = CreateGrid(rep, nGrid, alpha);
    % Update Grid Indices
    for i = 1:numel(rep)
        rep(i) = FindGridIndex(rep(i), Grid);
    end  
    % Check if Repository is Full
    if numel(rep)>nRep    
        Extra = numel(rep)-nRep;
        for e = 1:Extra
            rep = DeleteOneRepMemebr(rep, gamma);
        end
        
    end 
    % Plot Costs
    figure(1);
    PlotCosts(pop, rep);
    pause(0.01); 
    % Show Iteration Information
    disp(['Iteration ' num2str(it) ': Number of Rep Members = ' num2str(numel(rep))]);
    % Damping Inertia Weight
    w = w*wdamp;   
end

function particle = FindGridIndex(particle, Grid)
    nObj = numel(particle.Cost);
    nGrid = numel(Grid(1).LB);
    particle.GridSubIndex = zeros(1, nObj);   
    for j = 1:nObj
        
        particle.GridSubIndex(j) = ...
            find(particle.Cost(j)<Grid(j).UB, 1, 'first');      
    end
    particle.GridIndex = particle.GridSubIndex(1);
    for j = 2:nObj
        particle.GridIndex = particle.GridIndex-1;
        particle.GridIndex = nGrid*particle.GridIndex;
        particle.GridIndex = particle.GridIndex+particle.GridSubIndex(j);
    end
end

function b = Dominates(x, y)

    if isstruct(x)
        x = x.Cost;
    end
    
    if isstruct(y)
        y = y.Cost;
    end

    b = all(x <= y) && any(x<y);

end

function pop = DetermineDomination(pop)
    nPop = numel(pop); 
    for i = 1:nPop
        pop(i).IsDominated = false;
    end
    for i = 1:nPop-1
        for j = i+1:nPop       
            if Dominates(pop(i), pop(j))
               pop(j).IsDominated = true;
            end    
            if Dominates(pop(j), pop(i))
               pop(i).IsDominated = true;
            end     
        end
    end
end

function rep = DeleteOneRepMemebr(rep, gamma)
    % Grid Index of All Repository Members
    GI = [rep.GridIndex];
    % Occupied Cells
    OC = unique(GI);  
    % Number of Particles in Occupied Cells
    N = zeros(size(OC));
    for k = 1:numel(OC)
        N(k) = numel(find(GI == OC(k)));
    end  
    % Selection Probabilities
    P = exp(gamma*N);
    P = P/sum(P);  
    % Selected Cell Index
    sci = RouletteWheelSelection(P); 
    % Selected Cell
    sc = OC(sci);
    % Selected Cell Members
    SCM = find(GI == sc);
    % Selected Member Index
    smi = randi([1 numel(SCM)]); 
    % Selected Member
    sm = SCM(smi);
    % Delete Selected Member
    rep(sm) = [];
end

function Grid = CreateGrid(pop, nGrid, alpha)
    c = [pop.Cost];
    cmin = min(c, [], 2);
    cmax = max(c, [], 2);
    dc = cmax-cmin;
    cmin = cmin-alpha*dc;
    cmax = cmax+alpha*dc;
    nObj = size(c, 1); 
    empty_grid.LB = [];
    empty_grid.UB = [];
    Grid = repmat(empty_grid, nObj, 1);
    for j = 1:nObj   
        cj = linspace(cmin(j), cmax(j), nGrid+1); 
        Grid(j).LB = [-inf cj];
        Grid(j).UB = [cj +inf];    
    end
end

function leader = SelectLeader(rep, beta)
    % Grid Index of All Repository Members
    GI = [rep.GridIndex]; 
    % Occupied Cells
    OC = unique(GI); 
    % Number of Particles in Occupied Cells
    N = zeros(size(OC));
    for k = 1:numel(OC)
        N(k) = numel(find(GI == OC(k)));
    end
    % Selection Probabilities
    P = exp(-beta*N);
    P = P/sum(P);
    % Selected Cell Index
    sci = RouletteWheelSelection(P);
    % Selected Cell
    sc = OC(sci); 
    % Selected Cell Members
    SCM = find(GI == sc); 
    % Selected Member Index
    smi = randi([1 numel(SCM)]);
    % Selected Member
    sm = SCM(smi);
    % Leader
    leader = rep(sm);
end

function i = RouletteWheelSelection(P)
    r = rand;
    C = cumsum(P);
    i = find(r <= C, 1, 'first');
end

function z = ZDT(x)
    n = numel(x);
    f1 = x(1);
    g = 1+9/(n-1)*sum(x(2:end));
    h = 1-sqrt(f1/g);
    f2 = g*h;
    z = [f1
       f2];
end

function PlotCosts(pop, rep)
    pop_costs = [pop.Cost];
    plot(pop_costs(1, :), pop_costs(2, :), 'ko');
    hold on;
    rep_costs = [rep.Cost];
    plot(rep_costs(1, :), rep_costs(2, :), 'r*');
    xlabel('1^{st} Objective');
    ylabel('2^{nd} Objective');
    grid on;
    hold off;
end