粒子群算法基本原理与编程

第三篇为《粒子群算法基本原理与编程》,粒子群算法,我觉得是最简单又是最富有魅力最具有自然哲学的一个算法。

一、粒子群算法基本原理

粒子群算法(PSO)是进化计算的一个重要分支,它是由Eberhart和Kennedy于1995年提出的一种全局搜索算法,同时它也是一种模拟自然界生物活动以及群体智能的随机搜索算法。

自然界中鸟群、鱼群的觅食等行为实际上属于群体智能行为,这个过程本身就是一个寻找最优化的过程,通过模拟这种群体智能行为才有了粒子群算法的诞生。

之所以我如此喜欢粒子群算法,是因为Eberhart与Kennedy在设计粒子群算法,即PSO的时候,除了考虑模拟生物的群体活动之外,更重要的是融入了个体认知社会影响这些社会心理学的理论。这听上去十分简单,但就是这简单背后充满了智慧,它结合了动物群体的行为特性以及人类社会的认知特性。

在写的过程中又发现了一些优秀的博客,先直接把这些博客放上来吧,如下:

1、[Algorithm] 群体智能优化算法之粒子群优化算法

2、标准粒子群算法(PSO)

3、优化算法——粒子群算法(PSO):https://blog.csdn.net/hnzhangjq/article/details/82711771

有了这么多优秀的博客,加上自己本身也很懒,hhhh,有点不太想接着写了,不过为了复习还是简单的进行捋一捋。

 

二、粒子群算法步骤

粒子群优化算法(PSO)要求每个个体(粒子)在进化的过程中维护两个向量:

(1)速度向量:

(2)位置向量:

其中i表示粒子编号,D是求解问题的维数。粒子的速度决定了其运动的方向和速率,而位置则体现了粒子所代表的解在解空间中的位置,是评估该解质量的基础

粒子群算法同时还要求各个粒子各自维护一个自身历史最优位置向量,可以用 pBest 表示,在粒子进化的过程中如果达到了更优的位置,就会把pBest进行更新。群体还维护一个全局最优向量,记为gBest,代表所有粒子中最优的那一个。这个全局最优向量使得粒子向该全局最优区域收敛。

粒子群算法具体步骤如下:

        Step 1 初始化所有粒子,初始化他们的速度和位置,并且将个体的历史最优 pBest 设为当前位置,而群体中最优的个体作为当前的 gBest;

  Step 2 在每一轮的进化中,计算各个粒子的适应度函数值;

  Step 3 如果该粒子当前的适应度函数值比其历史最优值要好,那么历史最优将会被当前位置所替代;

  Step 4 如果该粒子的个体最优会比全局最优要好,那么全局最优就会被该粒子的最优值所替代

  Step 5 对于每个粒子 i 的第 d 维的速度和位置分别按照如下两个公式进行更新:

       

  Step 6 判断是否达到结束条件,如果没有继续step2,否则输出 gBest并结束。

上述公式中,是惯性权重,一般初始化为0.9,然后随着进化过程线性递减到0.4;c1和c2是加速系数(也称为学习因子)传统上都是取固定值2.0,上式的两个rand是在0,1区间的随机数。

需要注意的是,在更新过程中,PSO要求采用一个Vmax来限制速度的范围,Vmax的每一维Vmax(d)一般可以取相应维的10%~20%。

三、粒子群算法编程

该编程用来求解函数:

在区间[-10,10]上的最大值:

#include
#include
#include
#include

#define N 50	//迭代次数
#define T 10	//粒子群个数	
#define X 2		//纬度
#define W 0.5	//权重	
#define C1 2	//
#define C2 2	//

//粒子群参数
struct pso{
	double v[X];		//速度矢量
	double p[X];		//位置矢量
	double pbest[X];	//粒子最优
	double value;		//适应度
}num[T];

//全局最优
double gbest[X];
//所求函数值
double gvalue;

//随机函数
double randoms()
{
	return (rand()/32767.0);
}

//初始化
void init()
{
	int i,j;
	for(i=0;i num[i].value)
		{
			gvalue = num[i].value;
			for(j=0;j 5)
				num[i].v[j] = 5;
			if(num[i].v[j] < -5)
				num[i].v[j] = -5;
			num[i].p[j] = num[i].p[j] + num[i].v[j];
			if(num[i].p[j]>10)
				num[i].p[j] = 10;
			if(num[i].p[j]<-10)
				num[i].p[j] = 10;
		}
	}
}

//评价
void assement()
{
	int i,j;
	double ptemp,gtemp;
	for(i=0;i num[i].value)
		{
			gtemp = num[i].value;
			for(j=0;j

 

你可能感兴趣的:(智能信息处理)