基于线性递减的惯性权重的粒子群优化算法C++代码实现
时间: 2024-03-21 07:44:24 浏览: 65
论文研究-基于高斯函数递减惯性权重的粒子群优化算法.pdf
以下是基于线性递减惯性权重的粒子群优化算法的C++代码实现,希望能对您有所帮助:
```cpp
#include <iostream>
#include <cmath>
#include <ctime>
#include <cstdlib>
using namespace std;
// 定义常量
const int N = 50; // 粒子个数
const int T = 100; // 迭代次数
const double w = 0.9; // 惯性权重
const double c1 = 2.0; // 学习因子1
const double c2 = 2.0; // 学习因子2
const double Vmax = 0.5; // 粒子速度最大值
const double eps = 1e-6; // 误差阈值
// 定义函数
double f(double x);
// 定义结构体
struct Particle {
double x; // 粒子位置
double v; // 粒子速度
double pbest; // 个体历史最优位置
};
// 粒子群优化算法
void PSO() {
srand((unsigned)time(NULL)); // 随机数种子初始化
Particle p[N]; // 粒子数组
double gbest; // 全局历史最优位置
double fitness[N]; // 适应度值数组
double V[N]; // 粒子速度数组
// 初始化粒子
for (int i = 0; i < N; i++) {
p[i].x = (double)(rand() % 100) / 100; // 随机生成位置
p[i].v = (double)(rand() % 100) / 100; // 随机生成速度
p[i].pbest = p[i].x; // 初始化个体历史最优位置
fitness[i] = f(p[i].x); // 计算适应度值
V[i] = p[i].v; // 初始化粒子速度
}
// 初始化全局历史最优位置
gbest = p[0].x;
for (int i = 1; i < N; i++) {
if (f(p[i].x) > f(gbest)) {
gbest = p[i].x;
}
}
// 迭代优化
for (int t = 0; t < T; t++) {
for (int i = 0; i < N; i++) {
// 更新粒子速度
V[i] = w * V[i] + c1 * (p[i].pbest - p[i].x) * (double)(rand() % 100) / 100 + c2 * (gbest - p[i].x) * (double)(rand() % 100) / 100;
if (V[i] > Vmax) {
V[i] = Vmax;
}
if (V[i] < -Vmax) {
V[i] = -Vmax;
}
// 更新粒子位置
p[i].x = p[i].x + V[i];
if (p[i].x > 1.0) {
p[i].x = 1.0;
}
if (p[i].x < 0.0) {
p[i].x = 0.0;
}
// 更新个体历史最优位置
if (f(p[i].x) > f(p[i].pbest)) {
p[i].pbest = p[i].x;
}
// 更新全局历史最优位置
if (f(p[i].x) > f(gbest)) {
gbest = p[i].x;
}
}
// 判断是否满足误差阈值
if (f(gbest) < eps) {
break;
}
}
// 输出结果
cout << "最优解:" << gbest << endl;
cout << "最优解对应的函数值:" << f(gbest) << endl;
}
int main() {
PSO();
return 0;
}
double f(double x) {
return -x * sin(sqrt(fabs(x)));
}
```
注意,这里只是一个简单的实现示例,实际应用中需要根据具体问题进行调整和优化。
阅读全文