记得某次数学建模的老教授介绍优化的时候提过这个算法,说这个算法可以找到全局最优,今天我们从这个全局最优和并行计算的角度出发,聊聊PSO算法。
粒子群算法:
简介:
初始化一群粒子,每个粒子具有自己的速度和位置,每个粒子在群体最优解符合要求之前都在不停的运动,且,下一点的位置和速度受自身位置和速度的影响之外,还受粒子本身找到的个体最优解(已经过的最贴近最优解的点)和群体最优解的影响。
注:粒子的初始化的位置是随机的,初始化的速度也是随机的。
推导公式:(来源于老师分享的一篇国外的论文)
速度更新公式:
w:惯性因子,代表上一个点的速度对下一个点的影响,范围是大于等于0.4,小于0.9。(原因见下图的公式推导)
c1 ,c2:学习因子(局部效应和全局效应),代表下一点的速度受个体最优值和群体最优值的影响,除了学习因子,还有随机性的影响,取值在0-1之间的r1,r2为随机性而存在。
C++实现:
规划一下思路:
铺垫工作告一段落,开始上主角—>代码;
首先贴上打辅助的Better类,Ifunction类,MyFunction类。(为不显得冗余,此处仅仅贴上.cpp的内容)
Better:
Better::Better(bool isMax)
{
this->isMax = isMax;
}
bool Better::isBetterThan(double d1, double d2)
{
if (isMax)
{
return d1 > d2;
}
else
{
return d1 < d2;
}
}
Better::~Better()
{
}
Ifunction:没有具体实现方法,供子类继承实现具体函数,这里就不赘述了
MyFuntion:具体函数f=x*x+y*y+z*z;并且在main函数中,将每个变量设置在-10到10的区间
double MyFunction::operator()(const vector<double>& pos)//实现父类中的方法
{
double x = pos[0];
double y = pos[1];
double z = pos[2];
return x*x + y*y + z*z;
}
Solution:
Solution::Solution(int dim, IFuntion *fun)
{
srand(time(NULL));