c语言实现粒子群算法
时间: 2023-11-10 10:07:25 浏览: 123
C语言粒子群算法求二次函数
粒子群算法是一种优化算法,可以用于求解函数的最小值。下面是C语言实现粒子群算法的步骤:
1. 定义粒子结构体,包括位置、速度、历史最优位置和历史最优值等信息。
2. 初始化粒子群,包括生成随机位置和速度等信息。
3. 迭代更新粒子位置和速度,根据粒子的历史最优位置和全局最优位置来更新速度,再根据速度更新位置。
4. 计算每个粒子的函数值,并更新历史最优位置和全局最优位置。
5. 判断是否达到停止条件,如果没有则返回第3步,否则输出全局最优位置和值。
下面是一个简单的C语言实现粒子群算法的代码示例:
```
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 50 // 粒子数
#define D 2 // 维度
#define MAX_ITER 100 // 最大迭代次数
#define w 0.8 // 惯性权重
#define c1 2 // 自我认知因子
#define c2 2 // 社会认知因子
typedef struct {
double x[D]; // 位置
double v[D]; // 速度
double p[D]; // 历史最优位置
double fp; // 历史最优值
} Particle;
double f(double x[], int d) {
// 待优化的函数
double sum = 0;
for (int i = 0; i < d; i++) {
sum += x[i] * x[i];
}
return sum;
}
void init(Particle particles[]) {
// 初始化粒子群
for (int i = 0; i < N; i++) {
for (int j = 0; j < D; j++) {
particles[i].x[j] = (double)rand() / RAND_MAX * 10 - 5; // 位置随机生成在[-5, 5]之间
particles[i].v[j] = (double)rand() / RAND_MAX * 2 - 1; // 速度随机生成在[-1, 1]之间
particles[i].p[j] = particles[i].x[j]; // 初始历史最优位置为当前位置
}
particles[i].fp = f(particles[i].p, D); // 计算历史最优值
}
}
void update(Particle particles[], double gbest[]) {
// 更新粒子位置和速度
for (int i = 0; i < N; i++) {
for (int j = 0; j < D; j++) {
double r1 = (double)rand() / RAND_MAX;
double r2 = (double)rand() / RAND_MAX;
particles[i].v[j] = w * particles[i].v[j] + c1 * r1 * (particles[i].p[j] - particles[i].x[j]) + c2 * r2 * (gbest[j] - particles[i].x[j]); // 更新速度
particles[i].x[j] += particles[i].v[j]; // 更新位置
}
double fp = f(particles[i].x, D); // 计算当前位置的函数值
if (fp < particles[i].fp) { // 更新历史最优位置和值
particles[i].fp = fp;
for (int j = 0; j < D; j++) {
particles[i].p[j] = particles[i].x[j];
}
}
}
}
void pso() {
Particle particles[N];
double gbest[D]; // 全局最优位置
double fgbest = INFINITY; // 全局最优值
init(particles); // 初始化粒子群
for (int t = 0; t < MAX_ITER; t++) { // 迭代更新
for (int i = 0; i < N; i++) {
if (particles[i].fp < fgbest) { // 更新全局最优位置和值
fgbest = particles[i].fp;
for (int j = 0; j < D; j++) {
gbest[j] = particles[i].p[j];
}
}
}
update(particles, gbest); // 更新粒子位置和速度
}
printf("Global best position: (%f, %f)\n", gbest[0], gbest[1]);
printf("Global best value: %f\n", fgbest);
}
int main() {
srand(0);
pso();
return 0;
}
```
阅读全文