pso_qzn.m
来自「自己写的关于粒子群算法求函数最小值的例程」· M 代码 · 共 81 行
M
81 行
clear all
n = 20;%n维变量
m = 50;%粒子群的数量
c1 = 2;
c2 = 2;
w = 1;
vmax = 0.01;
%随即产生m个粒子
x = -1+2*rand(m,n);%对每个粒子的每一个变量产生相应的初始位置和速度
v = 0.5*rand(m,n);
%计算适应值
for i = 1:m
f(i)=obf_pso(x(i,:),n);%每一个粒子的适应度,即为目标函数值。
end
clear i;
%找出个体极值和全局极值
pbx = x;%初值即为个体极值
pbf = f;
[gbf i] = min(pbf);%全局最小值
gbx = pbx(i,:);%
for i =1:m
v(i,:)=w*v(i,:)+c1*rand*(pbx(i,:)-x(i,:))+c2*rand*(gbx-x(i,:));
for j=1:n
if v(i,j)>vmax
v(i,j)=vmax;
elseif v(i,j)<vmax
v(i,j)=-vmax;
end
end
x(i,:) = x(i,:)+v(i,:);
end
%%begin loop
k = 0;
while abs(gbf)>0.001
%while k<20
for i = 1:m
f(i)=obf_pso(x(i,:),n);
end
%%适应度优于原来的个体则设置当前个体为为最佳个体
for i=1:m
if f(i)<pbf(i)
pbf(i) = f(i);
pbx(i,:)=x(i,:);
end
end
[gbf i]=min(pbf);
gbx = pbx(i,:);%找到迭代后全局最佳个体
for i = 1:m
v(i,:)=w*v(i,:)+c1*rand*(pbx(i,:)-x(i,:))+c2*rand*(gbx-x(i,:)); %更新速度,并限制在设定的范围内。
for j=1:n
if v(i,j)>vmax
v(i,j)=vmax;
elseif v(i,j)<vmax
v(i,j)=-vmax;
end
end
x(i,:)=x(i,:)+v(i,:);%更新位置
end
k = k+1;
trace(k) = gbf;
tracea(k,1) = gbx(1);
tracea(k,2) = gbx(2);
subplot(1,2,1);
hold on;
plot(tracea(k,1),tracea(k,2),'r.','markersize',20);axis([-2,2,-2,2]);
subplot(1,2,2);
hold on
plot(k,trace(k),'r.')
end
gbx
gbf
k
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?