粒子群算法
- 基本思想
- 更新公式
- 算法流程
- 抽象出的鸟类数据结构
- C语言实现
基本思想
粒子群算法是由鸟类觅食启发而来,鸟类会朝着食物丰盛的地方移动,鸟类移动的指导思想有两点。1是每只鸟自身的移动过程中记下了自己曾遇到过的最好的食物所在的位置。2是整个鸟群中的鸟类在觅食过程中会交流自己所遇到的最好食物所在位置,会通知其他鸟过来。这两点就是鸟类的移动规则。
更新公式
有了基本思想,那鸟类觅食过程中的移动方式也就是优化算法的迭代公式被总结如下:
- v(i+1) = w * v(i) + c1 * rand(0, 1) * (pbest - x(i)) + c2 * rand(0, 1) * (gbest - x(i))
- x(i + 1) = x(i) + v(i + 1)
- w = (wini - wend) * (Gk - g) / Gk + wend
v 代表了鸟个体的移动方向和移动距离,x 代表了鸟个体所处的位置。
【1】 式1中,是鸟速度和方向的更新公式。w 是惯性因子,用式3计算。c1, c2是学习因子,通常都等于2。rand(0, 1) 是 (0, 1) 之间的随机数。pbest 是鸟个体历史移动过程中的最优位置,和x同类型。gbest 是整个鸟群的位置最优值,和 x 同类型。
【2】 式2中,是鸟位置的更新公式。
【3】 式3中,是2惯性因子的更新公式。wini 是初始惯性权值,一般取0.9。wend 是迭代之最大代数时的惯性权值,一般取0.4。Gk 是最大迭代代数。g 是当前迭代代数。
算法流程
算法流程:
抽象出的鸟类数据结构
根据基本思想和移动公式,抽象出鸟类个体数据结构和算法参数结构:
struct particle{
vtype v;
xtype x;
pbest p; /* 个体极值 */
fitness f;/* 个体历史最优适应度 */
};
struct psopara{
wtype w; /* 惯性因子 */
ctype c; /* 学习因子 */
gbest g; /* 全局极值 */
int Gk; /* 最大迭代次数 */
int N; /* 种群大小 */
fitness f;/* 最优适应度 */
};
C语言实现
以计算函数 f(x) = x1 ^ 2 + x2 ^ 2 的最小值为例,设计代码如下:
- 初始化种群
/* func: 初始化种群
* argu: 种群大小
* retu: 种群数组
* date: 2019-11-29
*/
struct particle *particle_init(int n)
{
struct particle *p = (struct particle*)malloc(n * sizeof(struct particle));
for(int i = 0; i < n; ++i){
p[i].v.x1 =