本节依据 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 小结
本案例为粒子群求解无约束非线性规划问题,对于简单有约束规划问题,可以采用罚函数法或是拉格朗日乘子法将问题转化为无约束的规划问题,对于复杂的问题则需要根据实际问题进行定制化的求解。
网友评论