用C++用粒子群优化算法求f(x,y)=3 cos(xy)+x+y^2,x∈[-4,4],y∈[-4,4]的最小值
时间: 2023-07-16 21:15:06 浏览: 142
粒子群优化算法是一种基于群体智能的优化算法,可以用于求解多元函数的最小值。下面是用C++实现的粒子群优化算法求解f(x,y)的最小值的代码:
```cpp
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
const int N = 20; // 粒子数
const int MAX_ITER = 100; // 最大迭代次数
const double w = 0.6; // 惯性因子
const double c1 = 1.8; // 加速常数1
const double c2 = 1.8; // 加速常数2
const double vmin = -8.0; // 粒子速度的最小值
const double vmax = 8.0; // 粒子速度的最大值
// 适应度函数
double fitness(double x, double y) {
return 3 * cos(x * y) + x + y * y;
}
int main() {
// 初始化粒子
double x[N], y[N];
double vx[N], vy[N];
double pbestx[N], pbesty[N]; // 个体最优解
double gbestx, gbesty, gbest; // 全局最优解
srand(time(NULL));
for (int i = 0; i < N; i++) {
x[i] = (double)rand() / RAND_MAX * 8 - 4;
y[i] = (double)rand() / RAND_MAX * 8 - 4;
vx[i] = (double)rand() / RAND_MAX * (vmax - vmin) + vmin;
vy[i] = (double)rand() / RAND_MAX * (vmax - vmin) + vmin;
pbestx[i] = x[i];
pbesty[i] = y[i];
}
// 迭代
for (int iter = 0; iter < MAX_ITER; iter++) {
// 更新粒子速度和位置
for (int i = 0; i < N; i++) {
vx[i] = w * vx[i] + c1 * (pbestx[i] - x[i]) + c2 * (gbestx - x[i]);
vy[i] = w * vy[i] + c1 * (pbesty[i] - y[i]) + c2 * (gbesty - y[i]);
// 限制粒子速度的范围
if (vx[i] < vmin) vx[i] = vmin;
if (vx[i] > vmax) vx[i] = vmax;
if (vy[i] < vmin) vy[i] = vmin;
if (vy[i] > vmax) vy[i] = vmax;
x[i] += vx[i];
y[i] += vy[i];
// 限制粒子位置的范围
if (x[i] < -4) x[i] = -4;
if (x[i] > 4) x[i] = 4;
if (y[i] < -4) y[i] = -4;
if (y[i] > 4) y[i] = 4;
}
// 更新个体最优解和全局最优解
for (int i = 0; i < N; i++) {
double f = fitness(x[i], y[i]);
if (f < fitness(pbestx[i], pbesty[i])) {
pbestx[i] = x[i];
pbesty[i] = y[i];
}
if (f < gbest) {
gbestx = x[i];
gbesty = y[i];
gbest = f;
}
}
// 输出当前迭代次数和全局最优解
cout << "iter = " << iter << ", gbest = " << gbest << endl;
}
// 输出最终结果
cout << "x = " << gbestx << ", y = " << gbesty << endl;
return 0;
}
```
在上面的代码中,fitness函数计算给定x和y的函数值;初始化粒子时,每个粒子的位置和速度是随机生成的;迭代过程中,对于每个粒子,更新其速度和位置,并记录其个体最优解,同时更新全局最优解;最终输出全局最优解的位置。
需要注意的是,粒子群优化算法的结果可能会受到随机因素的影响,因此每次运行的结果可能会有所不同。
阅读全文