粒子群算法介绍及Matlab实现(函数寻优)

粒子群算法介绍

粒子群优化算法(Particle Swarm Optimization,PSO)又叫微粒群算法,于1995年由Kennedy等学者提出,是一种基于群体行为的随机优化算法。算法模仿了鸟群的觅食行为,将个体行为和群体趋向结合起来,寻找复杂优化问题的最优解。

鸟群行为

粒子群算法最初是为了描述鸟类群体的运动而提出的。鸟群的运动遵循这样的规则:

(1)避免冲突:群体移动,个体运动而不影响其他个体;

(2)速度匹配:个体的运动必须配合群体的运动,即速度需要跟上群体移动速度;

(3)群体中心:个体向群体中心移动,配合群体中心向目标前进。

群体智能

事实上,在更广泛的意义上,粒子群不仅可以代表鸟群,也可以代表其他有群体智能的社会集群,比如蜂群,蚁群,能实现信息共享的无人机集群乃至人类社会——粒子群可以作为一种简化的社会模型。

自1991年蚁群优化算法的提出后,群体智能成为一个研究热点概念,世界上对群体智能的相关研究迅速展开。相关理论很多,在此仅介绍群体智能的如下特点,以供读者对群体智能产生直观印象,在群体智能的层面理解PSO算法:

群体智能的特点

(1)去中心化。群体智能没有中心控制,而是通过分布式的协同工作解决问题。即使去掉部分个体也不影响群体整体的运作。(沉舟侧畔千帆过)

(2)多样化。群体智能的效果与群体中个体的多样性密切相关。(正如一个社会中需要不同知识背景、技能、信念的人才,才能发挥社会作为一个整体的创造力)

(3)自组织。群体智能的运作基于自组织的原则,群体成员之间具有反馈机制且相互作用,根据环境和任务的要求自发调整自身的行为。这让群体更为灵活、适应性更强。(没有信息交互,则无所谓群体)

(4)协同效应。群体的能力大于个体的能力之和,共享信息提升了群体的能力。(众人拾柴火焰高)

粒子群算法原理

在粒子群算法中,我们的目的是解决某优化问题,则将问题的一个解看做一个粒子,多个解看做一个粒子群。初始状态,随机生成一个粒子群(一系列解),粒子遍布在问题的解空间当中,即粒子具有初始位置

继而赋予粒子速度(即在解空间中运动,或者说变动的能力),让粒子在解空间中“飞行”。我们建立适应度,这是一个评价粒子“好坏”(粒子对应的解是否更贴合优化的要求)的标准。适应度越高,粒子越“好”。

不断迭代,让粒子在以自己的速度飞行的同时,依据自己曾经到达的“历史最佳位置”和群体的“历史最佳位置”调整飞行轨迹,不断迭代直至问题趋于最优解。

具体而言粒子群算法的步骤如下(以函数寻优为例):

问题:f(x)是一个n元函数,需要寻找其在R^{n}上的最小值。

①此时迭代轮次k=0。随机生成m个R^{n}中的点{x}_1^0,{x}_2^0,...,{x}_n^0(右上角的角标代表轮次,右下角角标代表粒子序数)作为一个粒子群,它们在R^{n}中的坐标即为初始位置。以f(x)本身为评价粒子“好坏”的指标,f(x)越小则粒子越“好”。

②随机生成n个R^{n}中的点{v}_1^0,{v}_2^0,...,{v}_n^0作为各粒子的初速度。

③首先计算f({x}_1^0),f({x}_2^0),...,f({x}_n^0),目前每个粒子对于自身而言,适应度是历史上最小的,历史上最优位置记为x_{1best}^{0},x_{2best}^{0},...x_{nbest}^{0}={x}_1^0,{x}_2^0,...,{x}_n^0。右上角的角标代表迭代轮次。

f({x}_1^0),f({x}_2^0),...,f({x}_n^0)中最小值对应的粒子所在位置为群体第0轮的最优位置,记为x_{gbest}^0.

④对每个粒子依照如下的迭代公式进行迭代:

v_i^{k+1}=\omega v_i^{k}+c_1r_1(x_{ibest}^k-x_i^k)+c_2r_2(x_{gbest}^k-x_i^k)

x_i^{k+1}=x_i^k+v_i^{k+1}

\omega:惯性因子,一个常数;

c_1c_2:学习因子,常数。

r_1,r_2:[0,1]上的随机数,每轮中随机产生。

⑤更新个体最优位置:x_{i}^{k+1}若函数值比x_{ibest}^{k}小,则替换为个体历史最优值:x_{ibest}^{k+1}=x_{i}^{k+1}否则不替换:x_{ibest}^{k+1}=x_{ibest}^{k}.

更新群体最优位置:x_{gbest}^{k+1}x_{1best}^{k+1},x_{2best}^{k+1},...,x_{nbest}^{k+1}中函数值最小者。

⑥k=k+1,返回④。满足一定条件(达到最大迭代次数或者最优解函数值变化小于某数)终止。

④中第一个公式可以按不同组分理解其意义:\omega v_i^{k}为粒子保留了一部分其固有速度(所以\omega叫做惯性因子);x_{ibest}^k-x_i^k是一个向量(用位移差表征的速度),由粒子目前位置x_i^k指向该粒子史上最优位置x_{ibest}^k,代表粒子有趋向于自己曾达到的最优位置的趋向(往这个方向运动可能是更靠近最优解的),同时c_1,r_1x_{ibest}^k-x_i^k赋了权重。x_{gbest}^k-x_i^k为由粒子当前位置指向群体最优位置,代表粒子有趋向于群体最优位置的趋势。

第一组分代表了粒子自身的运动随机性,因为有随机性所以有可能探索到最优值;

第二组分代表粒子的记忆性,探索过的“好”的位置能作为信息被利用;

第三组分代表粒子与群体间的信息共享,群体探索出的“好”位置能作为信息被利用。

第二个公式即为粒子依照更新后的速度变动位置。

值得注意的是,粒子群算法中提到的“位置”“速度”都是数值向量,性质相同,从这里也可以看出粒子群算法是一种简单易行的算法。

参数意义及选取

\omega ,c_1,c_2选得较大,则粒子容易快速飞行越过目标解;过小则徘徊不前。

\omega大时粒子的惯性强,倾向于以初速度飞行;

c_1大时粒子具有较好的认知能力,能根据过往情况调整自己的状态。若c_1=0则粒子失去了认知能力,在群体中“随波逐流”。这种情况下收敛速度比标准版本快,但对于复杂问题容易陷入局部最优;

c_2大时粒子具有较好的信息共享度,能根据群体信息调整自己的状态。若c_2=0则粒子失去了群体联结,每个微粒在初速度指示的路径上独自运行,相当于效率极低的随机搜索,搜索到最优解的概率极小。

关于参数选择,不同问题应灵活选取不同大小的参数,并无定论。可以这样选择:

粒子数n:简单问题取20-40,复杂问题取100-200.

惯性因子\omega:0.6-0.8,也可以设置其随迭代轮次而变化,初期大后期小。

学习因子c_1,c_2:可以取2。分析问题确定学习因子是很重要的。

还可以设置最大飞行速度来控制搜索范围。

优势

粒子群算法的优势有:

①通用性强。

②原理简单,易编程。

③协同搜索,利用了群体信息的交互。

④全局收敛(有数学证明)。

代码

function [xmin,fmin]=PSO(dim,adp,n,omega,c1,c2,maxiter)
 %PSO
%种群数量n
%惯性因子omega
%学习因子c1
%学习因子c2
%dim为优化函数维数
%1.初始化
p=10*(rand(dim,n)-0.5);%初始种群,每列为一个个体
v=6*(rand(dim,n)-0.5);%初始速度
%2.更新
iter=0;
pibest=p;%个体历史最佳,初态为初始种群
adpv=zeros(1,n);
adpv=adp(p);%初始种群适应度
[~,minindex]=min(adpv);%寻找适应度最优个体
pgbest=p(:,minindex);%群体历史最佳
while(iter<maxiter)
   v=omega*v+c1*rand(dim,n).*(pibest-p)+c2*rand(dim,n).*(pgbest-p);%速度迭代
   p=p+v;%位置迭代
   for i=1:n
    if(adp(p(:,i))<adp(pibest(:,i)))
        pibest(:,i)=p(:,i);%若个体位置更优则更新
    end
   end
    [~,minindex]=min(adp(pibest));
    pgbest=p(:,minindex);%每轮最优个体中最优为历史最优
    iter=iter+1;
end
xmin=pgbest;%最优解
fmin=adp(pgbest);%最优值
end

以上为用Matlab编写的粒子群算法的函数。这个函数是用于求解n元函数优化问题的,默认最小值。

传递的参数包括:问题维数dim,也就是优化函数的维数;优化函数adp,调用函数时要在adp前加@;粒子群规模n;惯性因子omega;学习因子c1,c2;最大迭代轮数maxiter。

输出:最优解xmin,最优值fmin。

测试

选择函数进行测试,将粒子群算法得到的结果与Matlab自带的优化算法得到的结果进行对比,是一致的。优化对其他复杂函数如Ackley函数也奏效。

  • 39
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值