📄 spsonn.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 + -