粒子群优化算法(Particle Swarm Optimization, PSO)是进化计算的一个分支,是一种模拟自然界的生物活动的演化算法。
PSO模拟了自然界鸟群捕食的过程,通过群体之间的协作来找到问题的全局最优解。
PSO的主要流程如下:
这里有一个动态图模拟粒子群优化算法的演化过程:
来自WIKIPEDIA
具体代码如下:
1、定义参数
#define PI 3.14159265358979323846
#define POPSIZE 20 //粒子个数
#define MAXINTERATION 2000 //最大迭代次数
#define NVARS 10 //参数个数
#define WMAX 0.9 //惯量权重最大值
#define WMIN 0.4 //惯量权重最小值
struct particle { //单个粒子
double pBest[NVARS];
double v[NVARS];
double x[NVARS];
double upper[NVARS];
double lower[NVARS];
};
double w; //惯量权重
double c1 = 2.0; //加速因子1
double c2 = 2.0; //加速因子2
double absbound; //上下界绝对值
double vmax; //最大速度
double gBest[NVARS]; //全局最优解
particle particles[POPSIZE]; //粒子群
2、函数定义
double evalfunc(double[], int); //评估函数
double avg(double[], int); //求平均数
double stddev(double[], int); //求标准差
void initialize(int); //初始化函数
double randval(double, double); //求范围(lower,upper)之间的随机数
void evaluate(int); //评估粒子适应值
void update(int, int); //利用更新公式更新每个粒子的速度和位置以及历史最优位置
void fit(void); //更新群体历史最优位置
3、评估函数
double evalfunc(double parameter[], int FUNC = 1) {
/* 10个评估函数 */
/* 通过参数FUNC来选择想要的评估函数 */
if (FUNC == 1) {
double val = 0;
for (int i = 0; i < NVARS; i++) {
val += parameter[i] * parameter[i];
}
return val;
}
if (FUNC == 2) {
double val1 = 0;