用c语言写一个粒子群算法
时间: 2023-07-23 20:30:08 浏览: 237
以下是一个简单的C语言实现粒子群算法的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define DIM 2 // 自变量维数
#define POPSIZE 50 // 粒子数
#define MAXITER 100 // 迭代次数
#define C1 2.0 // 学习因子1
#define C2 2.0 // 学习因子2
#define W 0.7 // 惯性因子
typedef struct {
double x[DIM]; // 自变量
double v[DIM]; // 速度
double pbest[DIM]; // 个体最优解
double fitness; // 适应度
} PARTICLE;
double func(double x[]) {
// 目标函数
return pow(x[0], 2) + pow(x[1], 2);
}
void init_particle(PARTICLE *p) {
// 初始化粒子
for (int i = 0; i < DIM; i++) {
p->x[i] = (double)rand() / RAND_MAX * 10.0 - 5.0; // 随机初始化自变量
p->v[i] = (double)rand() / RAND_MAX * 2.0 - 1.0; // 随机初始化速度
p->pbest[i] = p->x[i]; // 个体最优解初始化为当前自变量
}
p->fitness = func(p->x); // 计算适应度
}
void update_particle(PARTICLE *p, double gbest[]) {
// 更新粒子状态
for (int i = 0; i < DIM; i++) {
double r1 = (double)rand() / RAND_MAX;
double r2 = (double)rand() / RAND_MAX;
p->v[i] = W * p->v[i] + C1 * r1 * (p->pbest[i] - p->x[i]) + C2 * r2 * (gbest[i] - p->x[i]); // 计算新速度
p->x[i] += p->v[i]; // 计算新位置
}
p->fitness = func(p->x); // 计算适应度
if (p->fitness < func(p->pbest)) {
for (int i = 0; i < DIM; i++) {
p->pbest[i] = p->x[i]; // 更新个体最优解
}
}
}
void update_gbest(PARTICLE p[], double *gbest) {
// 更新全局最优解
for (int i = 0; i < POPSIZE; i++) {
if (p[i].fitness < func(gbest)) {
for (int j = 0; j < DIM; j++) {
gbest[j] = p[i].x[j]; // 更新全局最优解
}
}
}
}
int main() {
PARTICLE p[POPSIZE]; // 粒子群
double gbest[DIM]; // 全局最优解
double gbest_fitness; // 全局最优解的适应度
srand(0); // 初始化随机种子
gbest_fitness = INFINITY; // 初始化全局最优解的适应度为正无穷
for (int i = 0; i < POPSIZE; i++) {
init_particle(&p[i]); // 初始化粒子
if (p[i].fitness < gbest_fitness) {
for (int j = 0; j < DIM; j++) {
gbest[j] = p[i].x[j]; // 初始化全局最优解
}
gbest_fitness = p[i].fitness; // 更新全局最优解的适应度
}
}
for (int iter = 0; iter < MAXITER; iter++) {
for (int i = 0; i < POPSIZE; i++) {
update_particle(&p[i], gbest); // 更新粒子状态
}
update_gbest(p, gbest); // 更新全局最优解
}
printf("gbest: %f %f\n", gbest[0], gbest[1]); // 输出全局最优解
return 0;
}
```
这是一个基本的粒子群算法实现,包括了初始化粒子、更新粒子状态和更新全局最优解等操作。在主函数中,我们首先初始化粒子群和全局最优解,然后进行一定次数的迭代,每次迭代更新粒子状态和全局最优解。最后输出全局最优解。
请注意,这只是一个简单的示例代码,实际应用中可能需要对算法进行更多调整和优化,以达到更好的性能和效果。
阅读全文