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

📄 pso.cpp

📁 标准PSO算法,运用SPHERE测试函数,最终收敛于0
💻 CPP
字号:

#include<iostream.h>
#include"stdlib.h"
#include"time.h"
#include"math.h"


 //随机数定义
#define rdint(i) (rand() % (int)(i))
#define rdft() (float)((double)rdint(16384)/(16383.0))
#define rnd(a,b) (rdint((int)(b)-(int)(a)+1)+(int)(a))

//宏定义
#define POPSIZE 40
#define DIMENSION 10

//全局变量定义
float w=0.9;
float c1=1.8;
float c2=1.8;
float VMAX=100;
float VMIN=-100;
float XMIN=-50;
float XMAX=100;
float P[DIMENSION];
float PBEST;

struct indi
{
	float number[DIMENSION];
	float best[DIMENSION];
	float bestfitness;
	float fitness;
	float speed[DIMENSION];
}individual[POPSIZE];

void initiate(void);
void calculation(int number);
void globalbest(int number);
void localbest(int number);

//程序初始化定义
void initiate()
{
	int i,j;
	for(i=0;i<POPSIZE;i++)
		for(j=0;j<DIMENSION;j++)
			individual[i].number[j]=rdft()*(XMAX-XMIN)+XMIN;
	for(i=0;i<POPSIZE;i++)
		for(j=0;j<DIMENSION;j++)
			individual[i].speed[j]=(VMAX-VMIN)*rdft()+VMIN;
	for(i=0;i<POPSIZE;i++)
		for(j=0;j<DIMENSION;j++)
			individual[i].best[j]=individual[i].number[j];
	for(i=0;i<POPSIZE;i++)
		calculation(i);
	for(i=0;i<POPSIZE;i++)
		individual[i].bestfitness=individual[i].fitness;
	globalbest(0);
}

//微粒历史最优位置修改程序
void localbest(int number)
{
	int i;
	if (individual[number].bestfitness>individual[number].fitness)
		for(i=0;i<DIMENSION;i++)
			individual[number].best[i]=individual[number].number[i];
	individual[number].bestfitness=individual[number].fitness;
}

//种群历史最优位置修改程序
void globalbest(int number)
{
	int i,j,flag;
	float s=0;
	if (number==0)
	{
		s=individual[0].fitness;
		flag=0;
		for(i=1;i<POPSIZE;i++)
			if(individual[i].fitness<s)
			{
				s=individual[i].fitness;
				flag=i;
			}
		for(i=0;i<DIMENSION;i++)
			P[i]=individual[flag].number[i];
		PBEST=individual[flag].fitness;
	}
	else
	{
		for(i=0;i<POPSIZE;i++)
			if(individual[i].bestfitness<PBEST)
			{
				for(j=0;j<DIMENSION;j++)
					P[j]=individual[i].best[j];
			PBEST=individual[i].bestfitness;
			}
	}
}

//适应值函数计算程序
void calculation(int num)
{
	
	double s=0.0;
	for(int i=0;i<DIMENSION;i++)
		s+=pow(individual[num].number[i],2);
	individual[num].fitness=s;
}

//主程序
void main()
{
	
	int i,j,k,t,total=1;
	float sum=0;
    for(j=0;j<50;j++)
	{
		initiate();
		for(i=0;i<1000;i++)
		{
			w=0.9-i*0.5/1000;
			if(0)//((PBEST-3.0)<0.0001)
			{
				total++;
				sum=sum+i;
				break;
			}
			else
			{
				for(k=0;k<POPSIZE;k++)  //改过来了,死循环
				{
					for(t=0;t<DIMENSION;t++)
					{
						individual[k].speed[t]=w*individual[k].speed[t]+c1*rdft()*(individual[k].best[t]-individual[k].number[t])+c2*rdft()*(P[t]-individual[k].number[t]);
						if(individual[k].speed[t]>VMAX)
							individual[k].speed[t]=VMAX;
						if(individual[k].speed[t]<-VMAX)
							individual[k].speed[t]=-VMAX;
						individual[k].number[t]=individual[k].number[t]+individual[k].speed[t];
						if(individual[k].number[t]<-XMAX)
							individual[k].number[t]=-XMAX;
						if(individual[k].number[t]>XMAX)
							individual[k].number[t]=XMAX;
					}
					calculation(k);
					localbest(k);
				}
				globalbest(1);
			}
		}
		cout<<"  "<<PBEST << endl;
		sum+=PBEST;
		total++;
	}
    cout<<"sum is "<<sum << endl;
	cout<<"average is :"<<sum/50 << endl;
	 }
 

⌨️ 快捷键说明

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