最近要写篇与粒子群算法有关的文章,因此不得不实现粒子群算法的局部版本。粒子群算法局部版本的实现思想已经在粒子群算法(3)----标准的粒子群算法(局部版本)中已经讲述。主要分为3个函数。第一个函数为粒子群初始化函数LocalInitSwarm(SwarmSize......AdaptFunc)其主要作用是初始化粒子群的粒子,并设定粒子的速度、位置在一定的范围内。本函数所采用的数据结构如下所示:
表ParSwarm记录的是粒子的位置、速度与当前的适应度值,我们用W来表示位置,用V来代表速度,用F来代表当前的适应度值。在这里我们假设粒子个数为N,每个粒子的维数为D。
W1,1 | W1,2 | ... | W1,D | V1,1 | V1,2 | ... | V1,D-1 | V1,D | F1 | 第1个粒子 |
W2,1 | W2,2 | ... | W2,D | V2,1 | V2,2 | ... | V2,D-1 | V2,D | F2 | 第2个粒子 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ....... |
WN-1,1 | WN-1,2 | ... | WN-1,D-1 | VN-1,1 | VN-1,2 | ... | VN-1,D-1 | VN-1,D | FN-1 | 第N-1个粒子 |
WN,1 | WN,2 | ... | WN,D | VN,1 | VN,2 | ... | VN,D-1 | VN,D | FN | 第N个粒子 |
表OptSwarm不但要记录自身历史最优解,还需要记录每个粒子邻域(采用环形邻域)的最优解,以及全部粒子搜索到的全局最优解。因此应该有2*N+1行,前SwarmSize行记录粒子自己历史最优解,后SwarmSize行记录邻域最优解。用Wg代表全局最优解,W.,1代表每个粒子的历史最优解。粒子群初始化阶段表OptSwarm的前N行与表ParSwarm中
的相同,而Wg的值为表ParSwarm中适应度值的最大值对应的行。
W1,1 | Wj,2 | ... | Wj,D-1 | Wj,D | 第1个粒子的历史最优解 |
W2,1 | Wk,2 | ... | Wk,D-1 | Wk,D | 第2个粒子的历史最优解 |
... | ... | ... | ... | ... | ... |
W(N-1),1 | Wl,2 | ... | Wl,D-1 | Wl,D | 第N-1个粒子的历史最优解 |
W(N),1 | Wm,2 | ... | Wm,D-1 | Wm,D | 第N个粒子的历史最优解 |
Wl,1 | ... | ... | ... | Wl,D | 第一个粒子的邻域最优解 |
Wl,2 | ... | ... | ... | Wl,D | 第二个粒子的邻域最优解 |
... | ... | ... | ... | ..... | .... |
Wl,N | ... | ... | ... | ... | 第N个粒子的邻域最优解 |
Wg,1 | Wg,2 | ... | Wg,D-1 | Wg,D | 全局粒子的历史最优解 |
根据这样的思想MATLAB代码如下:
下面的函数LocalPsoProcessByCircle实现了局部版粒子群算法的单步更新位置速度的功能,其中把速度的范围限制在每维范围的0.5倍。这个跟以前的版本有些区别,经过试验效果还可以。
这两个函数给出以后,需要一个函数来把这两个函数组装起来,以此实现一个完整的粒子群算法,这个函数就是LocalPsoProcessByCircle
这里给出一个使用的例子代码,并分别解释各参数的含义:
在上面的代码中函数LocalPsoProcessByCircle中的qun代表粒子群的规模为20个,lizi代表每个粒子的维数为10,Scope是粒子的每一维的范围,同时也是速度的范围的二倍,@localinitswarm是初始化函数的句柄,@localsteppsobycircle是单步更新的函数句柄,@Rastrigin是适应度评价函数的句柄,1000代表真个算法循环1000次终止,其他参数参见说明文档。