本節依據 PSO 算法原理,在 MATLAB 中編程實現基于 PSO 算法的函數極值尋優算法。
1?參數設置
??設置 PSO 算法的運行參數,程序代碼如下:
% 清空運行環境
clc;
clear;
% 設置參數
c1 = 1.4961;%個體更新速度
c2 = 1.4961;%種群更新速度
w = 0.8;%權重慣量
maxgen = 100;%迭代次數
sizep = 30;%種群規模
% 個體、速度的最值
pmax = 2;
pmin = -2;
vmax = 0.5;
vmin = -0.5;
2?初始化種群
??隨機初始化粒子位置和粒子速度,并計算粒子適應度值。
%適應度函數
fitness = @(x) sin(sqrt(x(1).^2+x(2).^2)./sqrt(x(1).^2+x(2).^2)+exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2));
%初始化種群
for i = 1:sizep
% 隨機生成一個種群
p(i,:) = 1+rands(1,2);
v(i,:) = 0.5*rands(1,2);
% 計算粒子適應度值
f(i) = fitness(p(i,:));
end
3?尋找初始極值
??根據初始粒子適應度值尋找個體極值和群體極值。
%尋找初始極值
[best_f, best_index] = min(f);
ybest = p(best_index,:);%群體極值位置
pbest = p;%個體極值位置
fpbest = f;%個體極值適應度值
fybest = best_f;%群體極值適應度值
4?迭代尋優
??根據公式更新粒子位置和速度,并更新個體極值和群體極值
%迭代尋優
for i = 1:maxgen
%粒子速度、位置與適度值更新
for j = 1:sizep
%速度
v(j,:) = w*v(j,:)+c1*rand*(pbest(j,:)-p(j,:))+c2*rand*(ybest-p(j,:));
v(j,v(j,:)>vmax) = vmax;
v(j,v(j,:)<vmin) = vmin;
%位置
p(j,:) = p(j,:)+0.5*v(j,:);
p(j,p(j,:)>pmax) = pmax;
p(j,p(j,:)<pmin) = pmin;
%適度值
f(j) = fitness(p(j,:));
end
%更新個體、群體極值
for j = 1:sizep
%個體極值
if f(j) < fpbest(j)
pbest(j,:) = p(j,:);
fpbest(j) = f(j);
end
%群體極值
if f(j) < fybest
ybest = p(j,:);
fybest = f(j);
end
end
esp(i) = fybest;
end
5?結果分析
fesp = esp(end)
%可視化
figure;
plot(esp);
title('適應度值變化曲線');
xlabel('進化代數');
ylabel('適應度值');
最終得到最優個體適應度值為 -0.54525
6?小結
??本案例為粒子群求解無約束非線性規劃問題,對于簡單有約束規劃問題,可以采用罰函數法或是拉格朗日乘子法將問題轉化為無約束的規劃問題,對于復雜的問題則需要根據實際問題進行定制化的求解。