📄 pso.cpp
字号:
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <ctime>
#include <math.h>
using namespace std;
#define DIM 2 //维数
#define C1 2 //c1
#define C2 2 //c2
#define PNUM 200 //粒子数目
#define TIMES 600 //迭代次数
#define VMAX 200 //最大速度
#define UP 100 //X上界
#define DOWN -100 //X下界
struct PARTICLE
{
double *X; //目前坐标
double *BestX; //粒子历史最优坐标
double fitness; //当前适应度
double Bestfitness;//粒子历史最优坐标
PARTICLE(){
X = new double[DIM];
BestX = new double[DIM];
fitness = 0;
Bestfitness = 0;
}
~PARTICLE(){
delete[] X;
delete[] BestX;
}
};
int GBestPos = 0;//记录全局最优解
PARTICLE particle[PNUM];//粒子数目
long int counts;
double GetFitness(double *X){ //返回适应度
//double result = 0;
//schaffer f6函数
double f6;
f6 = 1+0.001*(X[0]*X[0]+X[1]*X[1]);
f6 *= f6;
f6 = 0.5-(sin(sqrt(X[0]*X[0]+X[1]*X[1]))*
sin(sqrt(X[0]*X[0]+X[1]*X[1]))-0.5)/f6;
return f6;
}
void Initialize(){
srand((unsigned)time(NULL));
for (int i = 0;i < PNUM; i++)
{
for (int j = 0;j < DIM;j++)
{
//particle[i].X[j] = ((rand()%(UP-DOWN))/(double)(UP-DOWN)) *(double)(UP-DOWN) + DOWN; //随机初始化
particle[i].X[j] = rand()/(double)RAND_MAX * C1 * (UP- DOWN) + DOWN;
particle[i].BestX[j] = particle[i].X[j];
}
particle[i].fitness = GetFitness(particle[i].X);
particle[i].Bestfitness = particle[i].fitness;
if (particle[i].fitness > particle[GBestPos].fitness&& i != GBestPos)//记录全局最优
{
GBestPos = i; //修改全局最优位置
}
}
return;
}
void ParticleFly(){
double v; //速度
//GBestPos = 0;
for (int i = 0;i < PNUM; i++)
{
if (i == GBestPos)
{
continue;
}
for (int j = 0; j < DIM; j++)
{
v = (rand() / (double)RAND_MAX) * C1* (particle[i].BestX[j] - particle[i].X[j]) //计算速度
+ (rand() / (double)RAND_MAX) * C2 * (particle[GBestPos].BestX[j] - particle[i].X[j]);
if ( v > VMAX)//修正速度
{
v = VMAX;
}else if (v < - VMAX)
{
v = - VMAX;
}
particle[i].X[j] = particle[i].X[j] + v;//更新坐标
if (particle[i].X[j] > UP) //修正坐标
{
particle[i].X[j] = UP;
}else if (particle[i].X[j] < DOWN)
{
particle[i].X[j] = DOWN;
}
}
//更新函数值
particle[i].fitness = GetFitness(particle[i].X);
//记录历史最优
if (particle[i].fitness > particle[i].Bestfitness)
{
particle[i].Bestfitness = particle[i].fitness;
for (int i = 0;i < DIM;i++)
{
particle[i].BestX[i] = particle[i].X[i];
}
}
//更新最优解
if (particle[i].fitness > particle[GBestPos].fitness)
{
GBestPos = i;
}
}
return;
}
int main (){
while (1)
{
counts = 0;
Initialize();
for (int i = 0;i < TIMES;i++)
{
counts++;
ParticleFly();
}
cout << "采用粒子群算法求解连续空间优化问题"<<endl;
cout << "求解函数为 schaffer F6 "<<endl;
cout << "迭代次数:" <<TIMES << " " <<"粒子群数目:" << PNUM <<endl;
cout << "最大速度:"<< VMAX <<endl;
cout << "最优解坐标为:" << particle[GBestPos].X[0]<< " " <<particle[GBestPos].X[1] <<endl;
cout << "最优解为:" << particle[GBestPos].fitness<<endl;
cout << "输入0结束,输入其它继续"<<endl;
int n;
cin >> n;
if (n == 0)
{
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -