基本粒子群算法
基本粒子群算法(点击上方下载word版)
算法的流程如下:
① 初始化粒子群,包括群体规模,每个粒子的位置和速度
② 计算每个粒子的适应度值;
③ 对每个粒子,用它的适应度值和个体极值比较,如果 ,则用替换掉;
⑤ 根据公式,更新粒子的速度和位置 ;
其中:和为学习因子,也称加速常数(acceleration constant),和为[0,1]范围内的均匀随机数。式右边由三部分组成,第一部分为“惯性(inertia)”或“动量(momentum)”部分,反映了粒子的运动“习惯(habit)”,代表粒子有维持自己先前速度的趋势;第二部分为“认知(cognition)”部分,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势;第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋势,根据经验,通常。且 。是粒子的速度,,是常数,由用户设定用来限制粒子的速度。和是介于之间的随机数[2][5]。
⑥ 如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回②。
注意:以上是用来求的适应度函数是求最大值!实际生产的能耗,功耗,延迟等均为求最小值!
PSO核心算法
function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
%需要有fitness函数 N群体规模 c1 c2 学习因子 w惯性权重 M迭代次数 D粒子群维数
format long;
%------------------------------初始化种群的个体------------------------------
for i=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%------------------------------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i=1:N
p(i)=fitness(x(i,:)); %计算各个粒子的适应度并赋给p(i)
y(i,:)=x(i,:); %把当前位置赋给y(i,:),y(i,:)为个体最优位置
end
pg = x(N,:); %初始化pg的值为最后一个粒子,pg为全局最优的点的位置
for i=1:(N-1) %对前N-1个粒子进行遍历
if fitness(x(i,:))<fitness(pg)
pg=x(i,:); %如果有适应度比pg小的,则把pg替换成该粒子
end
end
%------------------------------------进入主要循环,按照公式依次迭代------------------------------
for t=1:M %迭代循环M次
for i=1:N %遍历粒子 更新速度
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:); % 更新位置
if fitness(x(i,:))<p(i) % 如果i粒子更新后的适应度小于更新前的适应度
p(i)=fitness(x(i,:)); % 则更新p(i)为较小的值
y(i,:)=x(i,:);
end
if p(i)<fitness(pg) %如果i粒子更新后的适应度反而更大
pg=y(i,:); %则pg回退到原来的位置
end
end
Pbest(t)=fitness(pg); % Pbest(t)为M次迭代后最优解
end
xm = pg'; %xm即为最优位置的n维坐标
fv = fitness(pg); %fv即为所得全局最优解
fitness函数
function result=fitness(x)
sum=0;
for i=1:3 %需要多少维直接改变for循环条件即可
sum=sum+x(i)^2; %此处可更换方程
end
result=sum;
PSO函数调用
[xm,fv] = PSO(@fitness,种群规模,c1,c2,惯性权重,迭代次数,维度)
Ex:
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,3)
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,7)
OOPSO调用
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,7)
PSO与OOPSO对比
迭代200次
低维:7维
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,7)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,7)
中高维:30维
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,30)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,30)
高维:100维
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,100)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,100)
迭代1000次
低维:7维
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,7)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,1000,7)
中高维:30维
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,30)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,1000,30)
高维:100维
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,100)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,1000,100)
画图
figure;
plot(Pbest);
title('收敛过程');
基本粒子群算法
算法的流程如下:
① 初始化粒子群,包括群体规模,每个粒子的位置和速度
② 计算每个粒子的适应度值;
③ 对每个粒子,用它的适应度值和个体极值比较,如果 ,则用替换掉;
⑤ 根据公式,更新粒子的速度和位置 ;
其中:和为学习因子,也称加速常数(acceleration constant),和为[0,1]范围内的均匀随机数。式右边由三部分组成,第一部分为“惯性(inertia)”或“动量(momentum)”部分,反映了粒子的运动“习惯(habit)”,代表粒子有维持自己先前速度的趋势;第二部分为“认知(cognition)”部分,反映了粒子对自身历史经验的记忆(memory)或回忆(remembrance),代表粒子有向自身历史最佳位置逼近的趋势;第三部分为“社会(social)”部分,反映了粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋势,根据经验,通常。且 。是粒子的速度,,是常数,由用户设定用来限制粒子的速度。和是介于之间的随机数[2][5]。
⑥ 如果满足结束条件(误差足够好或到达最大循环次数)退出,否则返回②。
注意:以上是用来求的适应度函数是求最大值!实际生产的能耗,功耗,延迟等均为求最小值!
PSO核心算法
function [xm,fv] = PSO(fitness,N,c1,c2,w,M,D)
%需要有fitness函数 N群体规模 c1 c2 学习因子 w惯性权重 M迭代次数 D粒子群维数
format long;
%------------------------------初始化种群的个体------------------------------
for i=1:N
for j=1:D
x(i,j)=randn; %随机初始化位置
v(i,j)=randn; %随机初始化速度
end
end
%------------------------------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i=1:N
p(i)=fitness(x(i,:)); %计算各个粒子的适应度并赋给p(i)
y(i,:)=x(i,:); %把当前位置赋给y(i,:),y(i,:)为个体最优位置
end
pg = x(N,:); %初始化pg的值为最后一个粒子,pg为全局最优的点的位置
for i=1:(N-1) %对前N-1个粒子进行遍历
if fitness(x(i,:))<fitness(pg)
pg=x(i,:); %如果有适应度比pg小的,则把pg替换成该粒子
end
end
%------------------------------------进入主要循环,按照公式依次迭代------------------------------
for t=1:M %迭代循环M次
for i=1:N %遍历粒子 更新速度
v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
x(i,:)=x(i,:)+v(i,:); % 更新位置
if fitness(x(i,:))<p(i) % 如果i粒子更新后的适应度小于更新前的适应度
p(i)=fitness(x(i,:)); % 则更新p(i)为较小的值
y(i,:)=x(i,:);
end
if p(i)<fitness(pg) %如果i粒子更新后的适应度反而更大
pg=y(i,:); %则pg回退到原来的位置
end
end
Pbest(t)=fitness(pg); % Pbest(t)为M次迭代后最优解
end
xm = pg'; %xm即为最优位置的n维坐标
fv = fitness(pg); %fv即为所得全局最优解
fitness函数
function result=fitness(x)
sum=0;
for i=1:3 %需要多少维直接改变for循环条件即可
sum=sum+x(i)^2; %此处可更换方程
end
result=sum;
PSO函数调用
[xm,fv] = PSO(@fitness,种群规模,c1,c2,惯性权重,迭代次数,维度)
Ex:
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,3)
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,7)
OOPSO调用
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,7)
PSO与OOPSO对比
迭代200次
低维:7维
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,7)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,7)
中高维:30维
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,30)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,30)
高维:100维
[xm,fv] = PSO(@fitness,100,2,2,0.6,200,100)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,200,100)
迭代1000次
低维:7维
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,7)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,1000,7)
中高维:30维
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,30)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,1000,30)
高维:100维
[xm,fv] = PSO(@fitness,100,2,2,0.6,1000,100)
[xm,fv] = OOPSO(@fitness,100,2,2,0.6,1000,100)
画图
figure;
plot(Pbest);
title('收敛过程');

作者:瑞羽云
链接:https://www.ruiyuyun.cn/archives/61.html
来源:瑞羽云
本站部分内容源于互联网,如果侵犯了您的权利,请发邮件告之,邮箱zcrvip@vip.qq.com
如果可以,希望您在分享的时候直接分享本网址,整理不易,谢谢配合!
共有 0 条评论