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

📄 pso461nn.cpp

📁 应用标准粒子群算法来建立一个实际非线性对象的神经网络辩识模型,神经网络形式为4-6-1
💻 CPP
字号:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "math.h"

//rand number defination
#define rdint(i)(rand()%(int)(i))       //rand integer
#define rdft()(float)((double)rdint(16384)/(16383.0)) //rand floating-point number
#define rnd(a,b)(rdint((int)(b)-(int(a)+1)+(int)(a))  //rand integer between a and b

//macro defination
#define POPSIZE 20
#define DIMENSION 37
#define POP 21

//This is a program which uses particle swarm optimization to learn a 4-6-1 neural network offline.
//test I/O data of a neural network(4-6-1)
//test input data
float P1[4][80]={{0.255,0.256,0.258,0.261,0.265,0.270,0.287,0.305,0.322,0.34,
                  0.356,0.374,0.391,0.408,0.425,0.441,0.458,0.474,0.491,0.506,
				  0.522,0.537,0.552,0.566,0.581,0.594,0.608,0.62, 0.633,0.645,
				  0.657,0.669,0.68, 0.691,0.701,0.710,0.719,0.728,0.736,0.744,        
                  0.752,0.759,0.766,0.773,0.779,0.785,0.791,0.797,0.803,0.808,            
                  0.813,0.817,0.821,0.824,0.827,0.830,0.832,0.833,0.8335,0.833,           
                  0.832,0.831,0.830,0.828,0.826,0.824,0.821,0.818,0.814,0.810,           
				  0.805,0.80, 0.795,0.791,0.787,0.784,0.781,0.779,0.777,0.776},
				 {0.254,0.255,0.256,0.258,0.261,0.265,0.270,0.287,0.305,0.322,0.34,
                  0.356,0.374,0.391,0.408,0.425,0.441,0.458,0.474,0.491,0.506,
				  0.522,0.537,0.552,0.566,0.581,0.594,0.608,0.62, 0.633,0.645,
				  0.657,0.669,0.68, 0.691,0.701,0.710,0.719,0.728,0.736,0.744,        
                  0.752,0.759,0.766,0.773,0.779,0.785,0.791,0.797,0.803,0.808,            
                  0.813,0.817,0.821,0.824,0.827,0.830,0.832,0.833,0.8335,0.833,           
                  0.832,0.831,0.830,0.828,0.826,0.824,0.821,0.818,0.814,0.810,           
				  0.805,0.80, 0.795,0.791,0.787,0.784,0.781,0.779,0.777},
{1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
 1.0, 0.85,0.82,0.81,0.8, 0.77,0.75,0.72,0.68,0.65,
 0.62,0.53,0.43,0.32,0.21,0.15,0.0, 0.0, 0.0, -0.1,
-0.2,-0.32,-0.43,-0.51,-0.6,-0.52,-0.45,-0.36,-0.29,-0.22,
-0.2,-0.17,-0.16,-0.12,-0.05,0.0,0.0,0.0,0.0,0.1,
 0.2,0.25,0.32,0.4,0.32,0.21,0.1,0.0,0.0,0.0},
 {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
 1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,
 1.0, 0.85,0.82,0.81,0.8, 0.77,0.75,0.72,0.68,0.65,
 0.62,0.53,0.43,0.32,0.21,0.15,0.0, 0.0, 0.0, -0.1,
-0.2,-0.32,-0.43,-0.51,-0.6,-0.52,-0.45,-0.36,-0.29,-0.22,
-0.2,-0.17,-0.16,-0.12,-0.05,0.0,0.0,0.0,0.0,0.1,
 0.2,0.25,0.32,0.4,0.32,0.21,0.1,0.0,0.0}};
//test output data
float T1[80] =   {0.256,0.258,0.261,0.265,0.270,0.287,0.305,0.322,0.34,0.356,
                  0.374,0.391,0.408,0.425,0.441,0.458,0.474,0.491,0.506,0.522,
				  0.537,0.552,0.566,0.581,0.594,0.608,0.62, 0.633,0.645,0.657,
				  0.669,0.68,0.691,0.701,0.710,0.719,0.728,0.736,0.744,         
                  0.752,0.759,0.766,0.773,0.779,0.785,0.791,0.797,0.803,0.808,           
                  0.813,0.817,0.821,0.824,0.827,0.830,0.832,0.833,0.8335,0.833,           
                  0.832,0.831,0.830,0.828,0.826,0.824,0.821,0.818,0.814,0.810,          
                  0.805,0.80,0.795,0.791,0.787,0.784,0.781,0.779,0.777,0.776,0.775};

// I-O data of a neural network(4-6-1)
//input data
float Pc[4][80]={{0.2555,0.2570,0.2595,0.2630,0.2675,0.2785,0.2960,0.3135,0.3310,0.3480,
                  0.3650,0.3825,0.3995,0.4165,0.4330,0.4495,0.4660,0.4825,0.4985,0.5140,
                  0.5295,0.5445,0.5590,0.5735,0.5875,0.6010,0.6140,0.6265,0.6390,0.6510,
                  0.6630,0.6745,0.6855,0.6960,0.7055,0.7145,0.7235,0.7320,0.7400,0.7480,
                  0.7555,0.7625,0.7695,0.7760,0.7820,0.7880,0.7940,0.8000,0.8055,0.8105,
                  0.8150,0.8190,0.8225,0.8255,0.8285,0.8310,0.8325,0.8333,0.8333,0.8325,
                  0.8315,0.8305,0.8290,0.8270,0.8250,0.8225,0.8195,0.8160,0.8120,0.8075,
				  0.8025,0.7975,0.7930,0.7890,0.7855,0.7825,0.7800,0.7780,0.7765,0.7760},
				 {0.2545,0.2555,0.2570,0.2595,0.2630,0.2675,0.2785,0.2960,0.3135,0.3310,0.3480,
                  0.3650,0.3825,0.3995,0.4165,0.4330,0.4495,0.4660,0.4825,0.4985,0.5140,
                  0.5295,0.5445,0.5590,0.5735,0.5875,0.6010,0.6140,0.6265,0.6390,0.6510,
                  0.6630,0.6745,0.6855,0.6960,0.7055,0.7145,0.7235,0.7320,0.7400,0.7480,
                  0.7555,0.7625,0.7695,0.7760,0.7820,0.7880,0.7940,0.8000,0.8055,0.8105,
                  0.8150,0.8190,0.8225,0.8255,0.8285,0.8310,0.8325,0.8333,0.8333,0.8325,
                  0.8315,0.8305,0.8290,0.8270,0.8250,0.8225,0.8195,0.8160,0.8120,0.8075,
				  0.8025,0.7975,0.7930,0.7890,0.7855,0.7825,0.7800,0.7780,0.7765},
  { 1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,
	1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,
	1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,
	0.9250,0.8350,0.8150,0.8050,0.7850,0.7600,0.7350,0.7000,0.6650,0.6350,
	0.5750,0.4800,0.3750,0.2650,0.1800,0.0750,0.0, 0.0, -0.0500,-0.1500,
   -0.2600,-0.3750,-0.4700,-0.5550,-0.5600,-0.4850,-0.4050,-0.3250,-0.2550,-0.2100,
   -0.1850,-0.1650,-0.1400,-0.0850,-0.0250,0.0,0.0,0.0,0.0500,0.1500,
   0.2250,0.2850,0.3600,0.3600,0.2650,0.1550,0.0500,0.0,0.0,0.0},
   {1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,
	1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,
	1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,1.0000,
	0.9250,0.8350,0.8150,0.8050,0.7850,0.7600,0.7350,0.7000,0.6650,0.6350,
	0.5750,0.4800,0.3750,0.2650,0.1800,0.0750,0.0, 0.0, -0.0500,-0.1500,
   -0.2600,-0.3750,-0.4700,-0.5550,-0.5600,-0.4850,-0.4050,-0.3250,-0.2550,-0.2100,
   -0.1850,-0.1650,-0.1400,-0.0850,-0.0250,0.0,0.0,0.0,0.0500,0.1500,
   0.2250,0.2850,0.3600,0.3600,0.2650,0.1550,0.0500,0.0,0.0}};
//output data
float Tc[80] = {0.2570,0.2595,0.2630,0.2675,0.2785,0.2960,0.3135,0.3310,0.3480,0.3650,
                0.3825,0.3995,0.4165,0.4330,0.4495,0.4660,0.4825,0.4985,0.5140,0.5295,
                0.5445,0.5590,0.5735,0.5875,0.6010,0.6140,0.6265,0.6390,0.6510,0.6630,
                0.6745,0.6855,0.6960,0.7055,0.7145,0.7235,0.7320,0.7400,0.7480,0.7555,
                0.7625,0.7695,0.7760,0.7820,0.7880,0.7940,0.8000,0.8055,0.8105,0.8150,
                0.8190,0.8225,0.8255,0.8285,0.8310,0.8325,0.8333,0.8333,0.8325,0.8315,
                0.8305,0.8290,0.8270,0.8250,0.8225,0.8195,0.8160,0.8120,0.8075,0.8025,
                0.7975,0.7930,0.7890,0.7855,0.7825,0.7800,0.7780,0.7765,0.7760,0.7755};

//global vector define 
float W=1.0;
float C1=1.8;
float C2=1.8;
float VMAX=2.0;
float XMIN=-2.0;
float XMAX=2.0;
float P[DIMENSION];
float PBEST;

struct indi                   //define individual structure
{
	float number[DIMENSION];
	float best[DIMENSION];
	float bestfitness;
	float fitness;
	float speed[DIMENSION];
}individual[POP];

void initiate(void);
void calculation(int number,float PP[][80],float TT[80]);
void globalbest(int number);
void localbest(int number);

//initialize 
void initiate()
{
	int i,j;
	srand((int)time(0)); 

	for(i=0;i<POPSIZE;i++)
		for(j=0;j<DIMENSION;j++)
			individual[i].number[j]=rdft()*(XMAX-XMIN)+XMIN; //rand value of individual position
	for(i=0;i<POPSIZE;i++)
		for(j=0;j<DIMENSION;j++)
			individual[i].speed[j]=VMAX*rdft();   //rand value of individual speed 
	for(i=0;i<POPSIZE;i++)
		for(j=0;j<DIMENSION;j++)
			individual[i].best[j]=individual[i].number[j]; //the best individual position 
	for(i=0;i<POPSIZE;i++)
		calculation(i,Pc,Tc);
    for(i=0;i<POPSIZE;i++)
		individual[i].bestfitness=individual[i].fitness; //bestfitness of individual position
	globalbest(0);
}

//history optimal position modification of particle
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;
}

//history optimal position modification of swarm
void globalbest(int number)
{
	int i,j;
	float s=0;
	int flag=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;
			}
	}
}

//fitness function
void calculation(int num,float PP[][80],float TT[80])
{	
  float X1[37]={individual[num].number[0],individual[num].number[1],individual[num].number[2],individual[num].number[3],
  individual[num].number[4],individual[num].number[5],individual[num].number[6],individual[num].number[7],individual[num].number[8],
  individual[num].number[9],individual[num].number[10],individual[num].number[11],individual[num].number[12],individual[num].number[13],
  individual[num].number[14],individual[num].number[15],individual[num].number[16],individual[num].number[17],individual[num].number[18],
  individual[num].number[19],individual[num].number[20],individual[num].number[21],individual[num].number[22],
  individual[num].number[23],individual[num].number[24],individual[num].number[25],individual[num].number[26],individual[num].number[27],
  individual[num].number[28],individual[num].number[29],individual[num].number[30],individual[num].number[31],individual[num].number[32],
  individual[num].number[33],individual[num].number[34],individual[num].number[35],individual[num].number[36]};

  float Err=0.0,Er=0.0;
  float P2[4][1]={0.0,0.0,};    //the initial value of input data

  //define the weights of NN model
  float W1[6][4]={{X1[0],X1[1],X1[2],X1[3]},{X1[4],X1[5],X1[6],X1[7]},{X1[8],X1[9],X1[10],X1[11]},
	   {X1[12],X1[13],X1[14],X1[15]},{X1[16],X1[17],X1[18],X1[19]},{X1[20],X1[21],X1[22],X1[23]}};
  float B1[6][1]={X1[24],X1[25],X1[26],X1[27],X1[28],X1[29]};
  float W2[1][6]={X1[30],X1[31],X1[32],X1[33],X1[34],X1[35]};
  float B2=X1[36];

  float WPB1[6][1];
  float tansig[6][1];
  float purelin;

  for(int k=0;k<80;k++)
  {
	 P2[0][0]=PP[0][k];
	 P2[1][0]=PP[1][k];
	 P2[2][0]=PP[2][k];
	 P2[3][0]=PP[3][k];

	 for(int i=0;i<6;i++)
		WPB1[i][0]=W1[i][0]*P2[0][0]+W1[i][1]*P2[1][0]+W1[i][2]*P2[2][0]+W1[i][3]*P2[3][0];   //W1*P2

	 for(int j=0;j<6;j++)
		   tansig[j][0]=2.0/(1.0+exp(-2.0*(WPB1[j][0]+B1[j][0])))-1.0;    //tansig(W1*P2,B1)

	 purelin=W2[0][0]*tansig[0][0]+W2[0][1]*tansig[1][0]+W2[0][2]*tansig[2][0]+
		         W2[0][3]*tansig[3][0]+W2[0][4]*tansig[4][0]+W2[0][5]*tansig[5][0]+B2;
                 //purelin(W2*tansig(),B2)

	 Er=TT[k]-purelin;
	 Err+=Er*Er;   //Error Square Sum
  }
  Err=Err*0.5;
  individual[num].fitness=Err;
}

void main()
{
	int i,j,k,t,m,total=0;
	srand((int)time(0));
    clock_t start, finish; 
	double duration;          //test time duration of psow461

	float sum=0;
	for(j=0;j<50;j++)
	{
		initiate();
		start = clock();
		for(i=0;i<1500;i++)
		{
		   W=1.0-i*0.2/1499;

		   if(PBEST<0.0005)
		   {
			  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;
	        individual[k].number[t]=individual[k].number[t]+individual[k].speed[t];
				 if(individual[k].number[t]<XMIN)
					   individual[k].number[t]=XMIN;
				 if(individual[k].number[t]>XMAX)
					   individual[k].number[t]=XMAX;
				 }
				 calculation(k,Pc,Tc);
				 localbest(k);		   
			   }
			   globalbest(1);
		   }
//		   printf("%d,%f\t",i,PBEST);
		}
		finish = clock();
		duration = (double)(finish-start)/CLOCKS_PER_SEC;
		printf("%d,%f\t",i,PBEST);
		for(m=0;m<DIMENSION;m++)
		 individual[POPSIZE].number[m]=P[m];
		calculation(POPSIZE,P1,T1);
		printf("test result is %f\t",individual[POPSIZE].fitness);
		printf( "The time of one experiment is %f seconds\n", duration);
		for(j=0;j<DIMENSION;j++)
		  printf(" %f\t",individual[POPSIZE].number[j]);
	}
    printf("Total number is %d\n",total);
    printf("Sum is %f\n",sum);
	printf("Average is %f\n",sum/total);
}

⌨️ 快捷键说明

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