⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pso.cpp

📁 本程序利用粒子群算法解决连续空间优化问题
💻 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 + -