粒子群优化算法(C++实现)
时间: 2023-10-20 17:07:45 浏览: 71
以下是一个基本的C语言实现粒子群优化算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define POP_SIZE 20 // 种群大小
#define MAX_ITER 100 // 最大迭代次数
#define C1 2 // 加速常数1
#define C2 2 // 加速常数2
#define W 0.7 // 惯性权重
typedef struct {
double x; // 粒子的位置
double v; // 粒子的速度
double pbest; // 粒子的历史最优位置
double fit; // 粒子的适应度值
} Particle;
double func(double x) { // 优化目标函数
return pow(x, 2) - 2 * x + 1;
}
double rand_double(double min, double max) { // 生成随机实数
return min + (max - min) * rand() / (double)RAND_MAX;
}
void init_particles(Particle *particles) { // 初始化粒子群
int i;
for (i = 0; i < POP_SIZE; i++) {
particles[i].x = rand_double(-5.0, 5.0);
particles[i].v = rand_double(-1.0, 1.0);
particles[i].pbest = particles[i].x;
particles[i].fit = func(particles[i].x);
}
}
void update_particle(Particle *particle, double gbest) { // 更新粒子
double r1 = rand_double(0.0, 1.0);
double r2 = rand_double(0.0, 1.0);
double v = W * particle->v + C1 * r1 * (particle->pbest - particle->x) + C2 * r2 * (gbest - particle->x);
double x = particle->x + v;
double fit = func(x);
if (fit < particle->fit) {
particle->x = x;
particle->v = v;
particle->pbest = x;
particle->fit = fit;
}
}
void update_particles(Particle *particles, double *gbest) { // 更新粒子群
int i;
for (i = 0; i < POP_SIZE; i++) {
if (particles[i].fit < *gbest) {
*gbest = particles[i].fit;
}
update_particle(&particles[i], *gbest);
}
}
int main() {
srand(0);
Particle particles[POP_SIZE];
double gbest = INFINITY;
init_particles(particles);
int iter;
for (iter = 0; iter < MAX_ITER; iter++) {
update_particles(particles, &gbest);
printf("iter = %d, gbest = %f\n", iter, gbest);
}
return 0;
}
```
在该代码中,我们使用了结构体表示粒子的信息,包括粒子的位置、速度、历史最优位置和适应度值。在初始化粒子群时,我们随机生成粒子的位置和速度,并计算粒子的适应度值。在更新粒子时,我们使用了惯性权重、加速常数和随机因子来计算粒子的速度和位置,并根据新位置的适应度值更新粒子的历史最优位置和适应度值。在更新粒子群时,我们遍历所有粒子,更新全局最优位置,并更新每个粒子的信息。最后,我们使用循环迭代多次,每次都更新粒子群,直到达到最大迭代次数为止。在每次迭代中,我们都输出当前迭代次数和全局最优位置的值。
阅读全文