基本粒子群算法

粒子群算法.docx

基本粒子群算法(点击上方下载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
如果可以,希望您在分享的时候直接分享本网址,整理不易,谢谢配合!
THE END
分享
二维码
< <上一篇
下一篇>>