改进粒子群优化算法matlab程序

改进粒子群优化算法matlab程序
参考文献《改进粒子群优化算法的概率可用输电能力研究-李国庆》

1 粒子群算法

粒子群算法(Particle Swarm Optimization,PSO)是一种基于群体智能的优化算法,是一种基于仿生学的优化算法。粒子群算法是通过模拟鸟群、鱼群等群体行为来实现优化的算法。粒子群算法最初由美国社会学家Kennedy和Eberhart于1995年提出,其基本思想是通过模拟鸟群、鱼群等群体行为来实现优化的算法。
粒子群算法的基本思想是将待优化的问题看作是一个多维空间中的搜索问题,将每个解看作是空间中的一个粒子,每个粒子在空间中移动,每个粒子的当前位置和速度都受到个体历史最优位置和全局历史最优位置的影响,从而实现全局最优解的搜索。在粒子群算法中,每个粒子代表一个解,每个粒子的位置和速度都可以描述为一个向量。在每一次迭代中,每个粒子都会根据当前位置和速度更新自己的位置和速度,并计算出当前位置的适应度值。粒子的速度和位置的更新规则是通过不断地迭代来实现的,每一次迭代都会更新粒子的速度和位置,并计算出当前位置的适应度值。适应度值是判断解的好坏的标准,适应度值越小表示解越好,适应度值越大表示解越差。粒子的速度和位置的更新规则是通过不断地迭代来实现的,每一次迭代都会更新粒子的速度和位置,并计算出当前位置的适应度值。适应度值是判断解的好坏的标准,适应度值越小表示解越好,适应度值越大表示解越差。粒子群算法的优点是收敛速度快、易于实现、对初始值不敏感、具有全局搜索能力等。但是,粒子群算法也存在一些缺点,如易陷入局部最优、对参数的选择敏感等。
总之,粒子群算法是一种基于群体智能的优化算法,其基本思想是通过模拟鸟群、鱼群等群体行为来实现优化的算法。粒子群算法具有收敛速度快、易于实现、对初始值不敏感、具有全局搜索能力等优点,但是也存在易陷入局部最优、对参数的选择敏感等缺点。在实际应用中,需要根据具体问题的特性来选择是否使用粒子群算法以及如何选择算法的参数。

2 改进粒子群算法
惯性权重w对 PSO 算法的优化性能影响很大。研究表明,较大的w值有利于跳出局部最优,而较小的w有利于加速收敛。因此,本文从收敛速度和搜索范围上对 PSO 进行改进,采用动态改变惯性权重的策略,使得
在这里插入图片描述

3 算例
在这里插入图片描述

4 结果对比
在这里插入图片描述

5 matlab程序
1)主函数

% 自适应惯性权重粒子群算法版 (改进粒子群)
clc;
clear;
close all;

%% 算法参数
nVar=2;              %变量个数
VarMin=-10*ones(1,2); % 变量下限

VarMax=10*ones(1,2); % 变量上限
MaxIt=100;      % 最大迭代次数
nPop=200;       % 种群规模

%% iaPSO Parameters 
CostFunction=@(x) fun_objective(x);        % Cost Function
w=1;            % Inertia Weight
wdamp=0.99;     % Inertia Weight Damping Ratio
c1=1.5;         % Personal Learning Coefficient
c2=2.0;         % Global Learning Coefficient
VarSize=[1 nVar];   % Size of Decision Variables Matrix
% Velocity Limits
VelMax=0.1*(VarMax-VarMin);
VelMin=-VelMax;

%% Initialization

empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Velocity=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];

particle=repmat(empty_particle,nPop,1);

GlobalBest.Cost=inf;

for i=1:nPop
    
    % Initialize Position
    particle(i).Position=unifrnd(VarMin,VarMax,VarSize);
    
    % Initialize Velocity
    particle(i).Velocity=zeros(VarSize);
    
    % Evaluation
    particle(i).Cost=CostFunction(particle(i).Position);
    
    % Update Personal Best
    particle(i).Best.Position=particle(i).Position;
    particle(i).Best.Cost=particle(i).Cost;
    
    % Update Global Best
    if particle(i).Best.Cost<GlobalBest.Cost
        
        GlobalBest=particle(i).Best;
        
    end
    
end

BestCost=zeros(MaxIt,1);
%自适应权重
ak=zeros(MaxIt,1);


%% PSO Main Loop
for it=1:MaxIt
    
    for i=1:nPop        
        % Update Velocity
        particle(i).Velocity = w*particle(i).Velocity ...
            +c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
            +c2*rand(VarSize).*(GlobalBest.Position-particle(i).Position);
        
        % Apply Velocity Limits
        particle(i).Velocity = max(particle(i).Velocity,VelMin);
        particle(i).Velocity = min(particle(i).Velocity,VelMax);
        
        % Update Position
        particle(i).Position = particle(i).Position + particle(i).Velocity;
        
        % Velocity Mirror Effect
        IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);
        particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);
        
        % Apply Position Limits
        particle(i).Position = max(particle(i).Position,VarMin);
        particle(i).Position = min(particle(i).Position,VarMax);
        
        % Evaluation
        particle(i).Cost = CostFunction(particle(i).Position);
        
        % Update Personal Best
        if particle(i).Cost<particle(i).Best.Cost
            
            particle(i).Best.Position=particle(i).Position;
            particle(i).Best.Cost=particle(i).Cost;
            
            % Update Global Best
            if particle(i).Best.Cost<GlobalBest.Cost
                
                GlobalBest=particle(i).Best;
                
            end
            
        end
        
    end
    
    BestCost(it)=GlobalBest.Cost;
    deltak=abs(particle(i).Cost-BestCost(it));
    ak(it)=sum(deltak)/nPop ;
%      disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
    if it==1
    w=w*wdamp;
    else 
        w=exp(-ak(it)/ak(it-1));
    end
       plot(BestCost(1:it));
    xlabel('迭代次数');
    ylabel('适应度');
    drawnow 
end
%% 输出
bestPosition = GlobalBest.Position;
fitValue = GlobalBest.Cost;
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
display(['改进粒子群算法获得的最优变量为 : ', num2str(bestPosition)]);
display([' 获得的最优目标函数: ', num2str(fitValue)]);
best=BestCost';

%% 传统粒子群
[ bestPosition, fitValue,BestCost1 ] = PSOFUN( @fun_objective,nVar,VarMin,VarMax,MaxIt,nPop );
best1=BestCost1';
%% 迭代曲线对比
figure
 plot(best(1:it));
 hold on
  plot(best1(1:it));
xlabel('迭代次数');
ylabel('适应度');
legend('Ipso','pso')


2)子函数

function fun = fun_objective(x)
s1 = 0; 
        s2 = 0;
        for i = 1:5 
            s1 = s1+i*cos((i+1)*x(1)+i);
            s2 = s2+i*cos((i+1)*x(2)+i);
        end
        fun = s1*s2;

end


function [ bestPosition, fitValue ,BestCost] = ...
PSOFUN( CostFun,nVar,VarMin,VarMax,MaxIt,nPop )
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPEA102
% Project Title: Implementation of Particle Swarm Optimization in MATLAB
% Publisher: Yarpiz (www.yarpiz.com)
% 
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
% 
% Contact Info: [email protected], [email protected]
%
%% PSO Parameters 
CostFunction=@(x) CostFun(x);        % Cost Function
w=1;            % Inertia Weight
wdamp=0.99;     % Inertia Weight Damping Ratio
c1=1.5;         % Personal Learning Coefficient
c2=2.0;         % Global Learning Coefficient
VarSize=[1 nVar];   % Size of Decision Variables Matrix
% Velocity Limits
VelMax=0.1*(VarMax-VarMin);
VelMin=-VelMax;

%% Initialization

empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Velocity=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];

particle=repmat(empty_particle,nPop,1);

GlobalBest.Cost=inf;

for i=1:nPop
    
    % Initialize Position
    particle(i).Position=unifrnd(VarMin,VarMax,VarSize);
    
    % Initialize Velocity
    particle(i).Velocity=zeros(VarSize);
    
    % Evaluation
    particle(i).Cost=CostFunction(particle(i).Position);
    
    % Update Personal Best
    particle(i).Best.Position=particle(i).Position;
    particle(i).Best.Cost=particle(i).Cost;
    
    % Update Global Best
    if particle(i).Best.Cost<GlobalBest.Cost
        
        GlobalBest=particle(i).Best;
        
    end
    
end

BestCost=zeros(MaxIt,1);

%% PSO Main Loop

for it=1:MaxIt
    
    for i=1:nPop
        
        % Update Velocity
        particle(i).Velocity = w*particle(i).Velocity ...
            +c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
            +c2*rand(VarSize).*(GlobalBest.Position-particle(i).Position);
        
        % Apply Velocity Limits
        particle(i).Velocity = max(particle(i).Velocity,VelMin);
        particle(i).Velocity = min(particle(i).Velocity,VelMax);
        
        % Update Position
        particle(i).Position = particle(i).Position + particle(i).Velocity;
        
        % Velocity Mirror Effect
        IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);
        particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);
        
        % Apply Position Limits
        particle(i).Position = max(particle(i).Position,VarMin);
        particle(i).Position = min(particle(i).Position,VarMax);
        
        % Evaluation
        particle(i).Cost = CostFunction(particle(i).Position);
        
        % Update Personal Best
        if particle(i).Cost<particle(i).Best.Cost
            
            particle(i).Best.Position=particle(i).Position;
            particle(i).Best.Cost=particle(i).Cost;
            
            % Update Global Best
            if particle(i).Best.Cost<GlobalBest.Cost
                
                GlobalBest=particle(i).Best;
                
            end
            
        end
        
    end
    
    BestCost(it)=GlobalBest.Cost;
    
%     disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
    w=w*wdamp;
           plot(BestCost(1:it));
    xlabel('迭代次数');
    ylabel('适应度');
    drawnow 
end

bestPosition = GlobalBest.Position;
fitValue = GlobalBest.Cost;
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);


end


猜你喜欢

转载自blog.csdn.net/weixin_47365903/article/details/130624385