|
今天今天来讲一下粒子群算法的程序实现部分及相关的例题操作。 % c& [1 _( ]: }/ c
我们已经知道,粒子群算法和遗传算法的用途大致是一样的,都是要要求全局最优,只是过程不同,遗传算法主要是通过“爬山”式来找,其最优解好坏取决于爬山速度(收敛速度,没必要太懂这些,不重要),而粒子群算法则取决于它飞的速度。
" A5 u% D) Q# F0 y# Q 铺垫完这些原理内容,来看例题:
! p& o/ K) p# Q0 r9 N, B
3 M6 W4 u" `: G2 L
step1:我们参数的初始化 1. 粒子数:实验表明(谁做的实验我也不知道),对于多数问题,30个粒子就够用了,对于特殊的难题需要100-200个粒子,数量越多,搜索范围越大,算法运行的时间也越长。 2. 惯性因子w(我们取0.6) w值越大,粒子飞的也就越快,从而错失了局部寻优的能力,而全局搜索能力越强,反之则局部强全局弱。我们一般将w视为随迭代次数而变的量,随迭代次数增加而w减小。这样这样做的意义就是:先在较大范围找,逐渐收缩到较好区域后开始精细的搜索。 W值为 [0,1] 之间的随机数。如果是定值w(不随迭代变),那么建议取0.6~0.75区间区间的合理值。如果是变的那么考虑0.9附近 3. 加速常数C1.、C2的选取(我么都取2) 对于简单的问题,我们选 C1=C2=2。目前对于两个值的选取学术界分歧较大,下面给出大家一些参考值:
1 a$ W4 H! k+ d) m% o0 X
5 K1 o r& n0 M5 I% q 加速常数其实就是调整运动中的收敛速度和搜索范围。举个例子,当C1=0 ,粒子没有自身经验,只有社会经验,收敛速度贼快,但可能就会取到局部最优不是全局的,搜索范围太小了;如果C2=0 ,那就是只有自身经验,在函数上到处转,不知道怎么找最优。但两个值也不能都特别大,不然就是飞的贼快,会错过一些局部最优。 4. 最大飞翔速度V(我们取0.8) 每个粒子的每一次迭代时,粒子的速度改变是有概率性的,而且需要设置一个速度最大值,防止粒子速度一直涨下去。有时候我们会遇到比较特殊的函数,他最优值在很高的一堵墙后面,这时候就需要较大的步长来跳过墙,而在越过墙后,就需要较小的步长(步长就是每次速度的变化范围)。 step2. 粒子的位置和速度更新: 用下面命令实现,就是定义了一下初始位置 x=-5+10*rand(粒子数,变量个数(X1,X2…)); %位置 v=2*rand(粒子数,变量个数(X1,X2…)); %速度 新速度是在原速度的基础上乘了惯性因子然后利用2个常数得到新速度,新位置就是新速度加上原来位置,相当于: 8 I6 ^3 H8 E* {. ^4 l" \% J& i, p
X(新) = X(原)+V(新)*t, 我们默认每过1秒变一次,所以t=1。
: F* M( G" R! B( V% n) n6 e5 Y% Hstep3. 比较当前每个粒子的适应值是否比历史局部最优值好,如果好,则将当前粒子适应值作为粒子的局部最优值,其对应的位置作为每个粒子的局部最优值所在的位置。 代码部分为:
% t$ Y$ i; Y( D2 V
4 p7 C. t) o6 E* \3 i3 R4 i这便是第一次初始下的局部最优值(每次运行的初始局部最优不会一样,因为初值随机给的):
' J8 ^! l+ H( C3 `1 \# b* C7 c4 c: N7 ^* ^+ {/ ?
' R( [' R$ ?8 r0 [
step4. 接下来的部分便是迭代了,只需要一个小小的循环语句就可以,加上最后的作图plot代码,这就是一个简单的粒子群算法咯。运行结果的图像是这样的,最优值为五角星标识处。) p1 Z% R) `0 R! J; I5 h' Y
# W: a! O( H% m
/ f8 C- Z6 _: d1 |7 i
讲了这些大家觉得可能粒子群算法也没啥大不了,算法本身原理就比较简单,而且代码也少,运行速度一个是迭代次数的影响,另一个就是定义的适应度函数(或者说你要求的目标函数)放在函数里面还是单独存。单独存的话运行快一点。
5 q. N% O, z9 C3 v0 y) T 还有一点就是,大家不要因为我写的这个小例题觉得粒子群算法名头大实际雨点小。其实粒子群算法在学术界很受重视的,就好比无比简洁的牛顿第二定律。希望大家明白,不要歧视它的简单。
" C. m, z) a d
@9 ?5 S# |# y# ~4 O2 T+ [+ u2 c1 a3 C( |
其实粒子群算法和神经网络结合起来就好比倚天屠龙合体,是真的强,不是简单地说名头更响了。所以下期,就讲一下神经网络的一些原理和简单例题,然后再讲神经网络和粒子群算法结合起来求解复杂问题的过程。
# W$ a/ l N! J+ v' Y/ l' a. B) F: z% _2 z
我这几次的附件都是傻瓜代码,你只要套你的目标函数,然后修改自变量个数那一句代码。就可以用粒子群算法来算你的函数了,也不需要你懂算法的深度原理,只需要懂基本原理和作用...下载啊,筒子们0 {. o2 t" ?6 _1 k* C7 H
r8 P3 ~: }' j9 \: K- Z8 w4 x4 r
/ p2 c* q( Z; y9 V2 i7 ?! t9 ?! b. T6 W! ]* h
|