粒子羣優化算法(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)
需要說明的是 disturbanceRate 與 maxDisturbanceSpeed 參數。爲了提高算法局部搜索能力,避免加速度因子的選擇要求過於嚴苛,本文實現的pso算法中,粒子運動過程中有一定概率獲得一個隨機速度。 disturbanceRate 描述了粒子獲得隨機速度的概率,當其爲0,算法退化爲最基本的pso算法。而 maxDisturbanceSpeed 則限定了隨機速度的最大值。
PSO算法的運行過程如下所示。其中紅點代表當前粒子羣搜索得到的全局最優解。黑色箭頭代表了粒子位置及其運動速度。待優化函數爲:
運行效果:
以下附上與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代碼可能不盡如人意,僅用於記錄、學習與分享。