粒子羣優化算法(PSO)-MATLAB代碼

粒子羣優化算法(PSO)-MATLAB代碼

關於粒子羣優化算法(PSO)的介紹與一種C++實現可以參考鏈接: PSO介紹及其一種C++實現 ,這裏不再贅述。

本片博文目的在於提供並簡要介紹一種粒子羣優化算法(PSO)的MATLAB代碼實現。

本文提供的MATLAB代碼中,PSO算法本身被封裝成一個函數,優化目標函數的句柄作爲PSO的輸入參數,從而成爲了一個較高獨立性的函數模塊。

以下爲pso算法對應的函數輸入輸出說明。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函數名:zpso
%函數描述:粒子羣優化算法函數
%輸入參數:
%   objfunction:最大化目標函數句柄,目標函數是向量到實數的一個多元函數(定義域爲超立方)
%   option:規定了pso算法的控制參數,利用ZPSO_parameters函數生成
%   evolutiontimes:粒子羣進化代數限制
%輸出參數:
%   bestPosition:搜索得到的目標函數最大值點
%   bestFitness:搜索得到的目標函數最大值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [bestPosition,bestFitness] = zpso(objfunction,option,evolutiontimes)

zpso函數的輸入輸入在註釋中已經表述得較清楚,不再贅述,需要注意的是objfunction是一個以列向量爲輸入,標量爲輸出的目標函數。
以下介紹pso算法控制參數結構體——option 的生成。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函數名:zpso_parameters
%函數描述:生成PSO算法所需要的參數結構體
%輸入參數:
%   dimension:候選解維度
%   minVal:候選解下界,列向量形式
%   maxVal:候選解上界,列向量形式
%   particalCount:粒子數量
%   maxSpeed:粒子最大運動速度
%   globalGuideCoe:全局最優引導加速度因子
%   localGuideCoe:個體最優引導加速度因子
%   disturbanceRate:粒子速度擾動概率
%   maxDisturbanceSpeed:最大擾動速度
%輸出參數:
%   op:PSO算法所需參數結構體
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function op = zpso_parameters(dimension,minVal,maxVal,particalCount,maxSpeed,...
                                                              globalGuideCoe,localGuideCoe,...
                                                              disturbanceRate,maxDisturbanceSpeed)

需要說明的是 disturbanceRatemaxDisturbanceSpeed 參數。爲了提高算法局部搜索能力,避免加速度因子的選擇要求過於嚴苛,本文實現的pso算法中,粒子運動過程中有一定概率獲得一個隨機速度。 disturbanceRate 描述了粒子獲得隨機速度的概率,當其爲0,算法退化爲最基本的pso算法。而 maxDisturbanceSpeed 則限定了隨機速度的最大值。

PSO算法的運行過程如下所示。其中紅點代表當前粒子羣搜索得到的全局最優解。黑色箭頭代表了粒子位置及其運動速度。待優化函數爲:
z=sin(x2+y2)/x2+y2 z = sin(\sqrt{x^2+y^2})/\sqrt{x^2+y^2}
運行效果:
在這裏插入圖片描述以下附上與PSO算法相關的MATLAB代碼。
<main.m> ——用於測試pso算法:

pso_op = zpso_parameters(2,[-10;-10],[10;10],200,4,1,1,0.1,2);
[bestPosition,bestFitness] = zpso(@objfunction,pso_op,100);

<objfunction.m>——用於定義優化目標函數

function y = objfunction(x)
    x = x - [0.8;-0.4];
    y = sin(sqrt(x'*x))/(sqrt(x'*x)+eps);
end

<zpso_parameters.m>——用於生成pso算法控制參數結構體

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函數名:zpso_parameters
%函數描述:生成PSO算法所需要的參數結構體
%輸入參數:
%   dimension:候選解維度
%   minVal:候選解下界,列向量形式
%   maxVal:候選解上界,列向量形式
%   particalCount:粒子數量
%   maxSpeed:粒子最大運動速度
%   globalGuideCoe:全局最優引導加速度因子
%   localGuideCoe:個體最優引導加速度因子
%   disturbanceRate:粒子速度擾動概率
%   maxDisturbanceSpeed:最大擾動速度
%輸出參數:
%   op:PSO算法所需參數結構體
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function op = zpso_parameters(dimension,minVal,maxVal,particalCount,maxSpeed,...
                                                              globalGuideCoe,localGuideCoe,...
                                                              disturbanceRate,maxDisturbanceSpeed)
    %粒子羣維度
    op.dimension = dimension;
    %粒子位置下界
    op.minVal = minVal;
    %粒子位置上界
    op.maxVal = maxVal;
    %粒子個數
    op.particalCount = particalCount;
    %粒子最大速度
    op.maxSpeed = maxSpeed;
    %全局最優加速度因子
    op.globalGuideCoe = globalGuideCoe;
    %個體最優加速度因子
    op.localGuideCoe = localGuideCoe;
    %粒子速度擾動概率
    op.disturbanceRate = disturbanceRate;
    %粒子最大擾動速度
    op.maxDisturbanceSpeed = maxDisturbanceSpeed;
end

<zpso.m>——用於實現pso算法

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函數名:zpso
%函數描述:粒子羣優化算法函數
%輸入參數:
%   objfunction:最大化目標函數句柄,目標函數是向量到實數的一個多元函數(定義域爲超立方)
%   option:pso算法參數,利用ZPSO_parameters函數生成
%   evolutiontimes:粒子羣進化代數限制
%輸出參數:
%   bestPosition:搜索得到的目標函數最大值點
%   bestFitness:搜索得到的目標函數最大值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [bestPosition,bestFitness] = zpso(objfunction,option,evolutiontimes)

%% 獲取pso算法參數
    dimension = option.dimension;
    minVal = option.minVal;
    maxVal = option.maxVal;
    particalCount = option.particalCount;
    globalGuideCoe = option.globalGuideCoe;
    localGuideCoe = option.localGuideCoe;
    maxSpeed = option.maxSpeed;
    disturbanceRate = option.disturbanceRate;
    maxDisturbanceSpeed = option.maxDisturbanceSpeed;

%% 初始化粒子羣
    %初始化粒子位置,在[minVal,maxVal]超立方空間內
    pso_position = minVal*ones(1,particalCount);
    pso_position = pso_position+rand(dimension,particalCount).*((maxVal-minVal)*ones(1,particalCount));
    %初始化粒子速度
    pso_velocity = rand(dimension,particalCount); %生成隨機速度
    temp = ones(dimension,1) * sqrt(diag(pso_velocity' * pso_velocity))'; %求取隨機速度模長
    pso_velocity = pso_velocity./temp; %隨機速度模長歸一化
    velocityMod = maxSpeed*ones(dimension,1)*rand(1,particalCount); %初始化速度大小隨機
    pso_velocity = velocityMod.*pso_velocity;
    %初始化粒子適應度、最佳適應度與個體最優解位置
    pso_fitness = zeros(1,particalCount);
    for j = 1:particalCount
        pso_fitness(j) = objfunction(pso_position(:,j));
    end
    pso_bestposition = pso_position;
    pso_bestfitness = pso_fitness;
    %更新全局最優適應度與最優解位置
    [pso_globalbestfitness,temp] = max(pso_bestfitness);
    pso_globalbestposition = pso_position(:,temp);
    %% 粒子羣進化
    for generationCount = 1:evolutiontimes
        %全局最優引導
        pso_velocity = pso_velocity+globalGuideCoe*ones(dimension,1)*rand(1,particalCount)...
                                    .*(pso_globalbestposition*ones(1,particalCount) - pso_position);
        %局部最優引導
        pso_velocity = pso_velocity+localGuideCoe*ones(dimension,1)*rand(1,particalCount)...
                                    .*(pso_bestposition - pso_position);
        %速度擾動
        disturbanceVelocity = rand(dimension,particalCount);
        temp = ones(dimension,1)*sqrt(diag(disturbanceVelocity'*disturbanceVelocity))';
        disturbanceVelocity = disturbanceVelocity./temp;
        temp = maxDisturbanceSpeed*ones(dimension,1)*rand(1,particalCount);
        temp = temp .* (ones(dimension,1)*(rand(1,particalCount)<disturbanceRate));
        disturbanceVelocity = temp.*disturbanceVelocity;
        pso_velocity = pso_velocity+disturbanceVelocity;
        %速度受限
        temp = ones(dimension,1)*sqrt(diag(pso_velocity'*pso_velocity))';
        pso_velocity = pso_velocity./temp;
        temp = min(temp,maxSpeed);
        pso_velocity = temp.*pso_velocity;
        %位置更新
        pso_position = pso_position + pso_velocity;
        %位置受限
        pso_position = max(pso_position,minVal*ones(1,particalCount));
        pso_position = min(pso_position,maxVal*ones(1,particalCount));
        %適應度更新
        for j = 1:particalCount
            pso_fitness(j) = objfunction(pso_position(:,j));
        end
        %最佳適度更新
        index = pso_fitness>pso_bestfitness;
        pso_bestfitness = max(pso_fitness,pso_bestfitness);
        pso_bestposition(:,index) = pso_position(:,index);
        %全局最優更新
        [bestfitness,index] = max(pso_bestfitness);
        index = index(1);
        if(bestfitness > pso_globalbestfitness)
            pso_globalbestfitness = bestfitness;
            pso_globalbestposition = pso_bestposition(:,index);
        end
    end
    %% 輸出搜索結果
    bestPosition = pso_globalbestposition;
    bestFitness = pso_globalbestfitness;
end

受作者水平所限,matlab代碼可能不盡如人意,僅用於記錄、學習與分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章