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

📄 spsonn.cpp

📁 应用随机微粒群算法学习一个神经网络的权值.网络训练和测试数据采自一实际非线性系统.
💻 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

//This is a program which uses stochastic particle swarm optimization to learn a 4-6-1 neural network offline.
//macro defination
#define POPSIZE 15
#define DIMENSION 37
#define POP 16

//input data of a neural network
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}};
//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};
//test I-O 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}};
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 defination of PSO
float W=0.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,PBESTcs;

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);
void generate(int number);

void generate(int num)
{
   int j;
   for(j=0;j<DIMENSION;j++)
	  individual[num].number[j]=rdft()*(XMAX-XMIN)+XMIN;
   calculation(num,Pc,Tc);
   individual[num].bestfitness=individual[num].fitness;
   for(j=0;j<DIMENSION;j++)
	  individual[num].best[j]=individual[num].number[j];
}

//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,flag=-1,fflag; int ys=0;
	srand(time(NULL));
    clock_t start, finish; 
	double duration;          //test time duration of spso461
	float EE[31],EEcs[31];

	for(j=0;j<50;j++)
	{
		initiate();
		start = clock();
		for(i=0;i<10000;i++)
		{
		   flag=-1;
		   for(k=0;k<POPSIZE;k++)
		   {
			  if((individual[k].fitness==individual[k].bestfitness)&&(individual[k].fitness==PBEST))
			  {
				 flag=k;
				 break;
			  }
		   }
		   if(flag!=-1)
			  generate(flag);
		   for(k=0;k<POPSIZE;k++)
		   if(k!=flag)
		   {
			  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);
		   for(m=0;m<DIMENSION;m++)
			  individual[POPSIZE].number[m]=P[m];
		   calculation(POPSIZE,P1,T1);
		   PBESTcs=individual[POPSIZE].fitness;
		   if(i%344==0)
		   {
			 EE[ys]=PBEST;  EEcs[ys]=PBESTcs;
			 ys++;
		   }
		printf("%d,%f\t",i,PBEST);
		}

		EE[30]=PBEST; EEcs[30]=PBESTcs;
		finish = clock();
		duration = (double)(finish-start)/CLOCKS_PER_SEC;

//		for(j=0;j<31;j++)
		   printf("%f\t",EE[30]);
//		for(j=0;j<31;j++)
		  printf("%f\t",EEcs[30]);
		printf( "The time of one experiment is %f seconds\n", duration);
	}

}

⌨️ 快捷键说明

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