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

📄 1.cpp

📁 自己编写的粒子群优化算法
💻 CPP
字号:
#include<iostream>
#include<ctime>
#include<vector>
#include<cmath>
using namespace std;


const int particle_num = 20;          // 粒子群的数目
const double c1 = 2;                // 学习因子1
const double c2 = 2;               // 学习因子2
int iteration = 2000;         // 迭代次数
double w1 = 1.0;              // 惯性系数
double Xup[] = {100,100};           // 坐标上限
double Xdown[]={-100,-100};         // 坐标下限
const int dim = 2;                      // 定义维数
double speedup[] = {40,40};          // 速度上限
double speeddown[]={-40,-40};        // 速度下限


typedef struct particle        // 定义粒子
{
	double fitness;          // 粒子的适应度
	double x[dim];            // 粒子的坐标数组
	double v[dim];           // 粒子的速度数组
}particle;

particle bird[particle_num];       // 定义种群
particle pbest[particle_num];      // 局部最优极值数组
int  globle_best;              // 保存全局最优的序号



// 计算适应度
void countfitness()
{
	double x,y,z,k,t;
	for(int i = 0; i < particle_num; i++)
	{
		 x = bird[i].x[0];
		 y = bird[i].x[1];
		 z = x*x+y*y;
		 t = sin(sqrt(z));
		 k = 1+0.001*z;
		 bird[i].fitness = (t*t-0.5)/(k*k);
	}
}

 // 寻找全局最优解,保存其序号
int globlebest()        
{
	double best = pbest[0].fitness;
	int index = 0;
	for(int i = 1; i < particle_num; i++)
	{
		if(pbest[i].fitness < best)
		{
			best = pbest[i].fitness;
			index = i;
		}
	}
	return index;
}

// 产生0-1之间的随即数
inline double randnum()          
{
	return 1.0*rand()/RAND_MAX;
}




void initparticle()             // 初始化种群
{	
	int i,j;
	for(i = 0; i < particle_num; i++)  // 初始化粒子坐标
	{
		for(j = 0; j < dim; j++)
			bird[i].x[j] = Xdown[j]+(Xup[j]-Xdown[j])*randnum();
	}
	
	for(i = 0; i < particle_num; i++) // 初始化粒子速度
	{
		for(j = 0; j < dim; j++)
			bird[i].v[j] = (randnum()*speedup[j])-speedup[j]/2;
	}

	countfitness();  // 计算适应度

	for(i = 0; i < particle_num; i++)  // 初始化局部最优
	{
		pbest[i].fitness = bird[i].fitness;
		for(j = 0; j < dim; j++)
		{
			pbest[i].x[j] = bird[i].x[j];
			pbest[i].v[j] = bird[i].v[j];
		}
	}
	globle_best = globlebest();  // 初始化全局最优
}


int main()
{
	srand((unsigned)time(NULL));
	initparticle();
	int i,j,k;
	for(i = 0; i < particle_num; i++)
		cout<<bird[i].fitness<<" "<<bird[i].x[0]<<" "<<bird[i].x[1]<<endl;
	cout<<"*************************"<<endl;
	while(iteration--)
	{
		for(i = 0; i < particle_num; i++)
		{
			for(j = 0; j < dim; j++)
			{
				if(iteration < 1500) // 加上这一句确实带来改观,能够进一步避免其陷入局部最优值
					w1 = 1.0;
				else
					w1 = 0.8;
				bird[i].v[j] = w1*(bird[i].v[j])+
					c1*randnum()*(pbest[i].x[j]-bird[i].x[j])+
					c2*randnum()*(pbest[globle_best].x[j]-bird[i].x[j]);
				
			}
			for(j = 0; j < dim; j++)
			{
				if(bird[i].v[j] > speedup[j]) bird[i].v[j] = speedup[j];
				if(bird[i].v[j] < speeddown[j]) bird[i].v[j] = speeddown[j]; 
			}
			for(j = 0; j < dim; j++)
			{
				bird[i].x[j] += bird[i].v[j];
				if(bird[i].x[j] > Xup[j]) bird[i].x[j] = Xup[j];
				if(bird[i].x[j] < Xdown[j]) bird[i].x[j] = Xdown[j];
			}

		}
		countfitness();
		// 更新局部极值
		for(j = 0; j < particle_num; j++)
		{
			if(bird[j].fitness < pbest[j].fitness)
			{
				pbest[j].fitness = bird[j].fitness;
				for(k = 0; k < dim; k++)
				{
					pbest[j].x[k] = bird[j].x[k];
					pbest[j].v[k] = bird[j].v[k];
				}
			}  
		}
		// 更新全局最优值
		globle_best = globlebest();
	}
	cout<<pbest[globle_best].fitness<<" "<<pbest[globle_best].x[0]<<" "
		<<pbest[globle_best].x[1]<<endl;
	return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -