标题POS基本算法详细解析
粒子xi(t)与群相互交流,保存更新自己的最优点Pi(t),并且与群交流后得知全局(群)的最优点g(t),由原来的方向Vi(t)变到Vi(t+1)。
首先看懂上面两张图!再看程序
function[xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
% c1,c2:学习因子
% w:惯性权重
% M:最大迭代次数
% D:搜索空间维数,也就是表示目标点需要几个参数,比如是三维的点,就需要三个维数,简单来说就是空间向量要三个参数确定xyz
% N:初始化群体个体数目
% 初始化种群的个体(可以在这里限定位置和速度的范围)
format long;%针对数据的显示形式进行控制,显示15位双精度,7位单精度
for i = 1:N
for j=1:D
x(i,j) = randn; % 随机初始化位置
v(i,j) = randn; % 随即初始化速度,共NxD个
end
end
% 先计算各个粒子的适应度(就是要计算的目标函数),并初始化pi和pg
for i=1:N
p(i) = fitness(x(i,:));%赋予随机初值
y(i,:) = x(i,:);%赋予粒子随机初值,状态方程用y(i,:)代替了
end
pg = x(N,:); % pg为全局最优,先定义随机选了x第N行的值为初值
for i=1:(N-1)%这里没搞懂N-1,不是N次循环吗?希望读者可以交流一下
if(fitness(x(i,:))<fitness(pg))%比较适应度(目标函数)全局Pg各个维度上最优和x第i行单个粒子最优,然后把N行中的D个维度综合最大的一行所有数据赋值给pg
pg = x(i,:);
end
end
% 进入主要循环,按照公式依次迭代,直到满足精度要求
for t=1:M
for i=1:N % 更新N个粒子速度、位移
v(i,:)=wv(i,:)+c1rand*(y(i,:)-x(i,:))+c2rand(pg-x(i,:));%这个地方y(i,:)不太懂,为啥不是p(i),多交流,后来想清楚了,没错
x(i,:)=x(i,:)+v(i,:);
if fitness(x(i,:)) < p(i)%比较当前值和本身历史最优,若当前值最优
p(i)=fitness(x(i,:));%替换本身历史最优
y(i,:)=x(i,:);%更新当前位置
end
if p(i) < fitness(pg)%进一步比较当前值和全局历史最优,若当前值最优
pg=y(i,:);%替换全局历史最优,第一次迭代下来就得到了N粒子中最优的全局值了,第M次迭代就得到了M次迭代下最优的值了
end
end
Pbest(t)=fitness(pg);
end
% 输出结果
disp(‘目标函数取最小值时的自变量:’)
xm=pg’;
disp(‘目标函数的最小值为:’)
fv=fitness(pg);
目标函数自己编写一个M文件,
主界面运行程序
x = zeros(1,D);
[xm1,fv1] = PSO(@fitness,N,c1,c2,w,M,D)
————————————————
原文链接:https://blog.csdn.net/zhaohaibo_/article/details/82465789