📄 mainapp.cpp
字号:
test();
cout<<"识别个数为"<<count<<endl
<<"识别率为"<<(count/TEST_SETS)*100<<"%"
<<"最后误差为"<<wucha<<endl;
FILE *fp2;//保存权值
fp2=fopen("bp结果\\权值.txt","w");
if (fp2==NULL)
{
exit(0);
}
for (int layer=1;layer<=2;layer++)
{
for (int j=0;j<N[layer];j++)
{
for(int i=0;i<N[layer-1];i++)
fprintf(fp2,"w[%d][%d][%d]=%f\n",layer,j,i,w[layer][j][i]);
}
}
fclose(fp2);
//BP算法部分
}
void trainRBF()
{
int layer = 0;
//rbf训练
//////////计算读一行字符所需要的时间///////
FILE * fp_test=fopen("study.txt","r");
if (fp_test==NULL)
{
cout<<"cannot open file"<<endl;
exit(0);
}
clock_t t_test1=clock();
while(!(feof(fp_test))&&(fgetc(fp_test)!='\n'));
clock_t t_test2=clock();
if (t_test2==clock_t(-1))
{
cerr<<"sorry ,no clock\n";
exit(1);
}
double file_time_each=double(t_test2-t_test1)
/CLOCKS_PER_SEC/EACH_LINE_OFFSET*100000000 ;
fclose(fp_test);
wucha=1;
k_k=-1;
fpwucha = fopen("rbf结果\\误差.txt","w");
// 开始时钟
clock_t t11=clock();
//K-均值 聚类无导师学习算法,确定w[1][..]和高斯因子
//为隐含层的计算做好准备
k_means();
fp=fopen("study.txt","r");
if (fp==NULL)
{
cout<<"cannot open file"<<endl;
exit(0);
}
while(wucha>EP)
{
if (feof(fp)) rewind(fp);
for(int i=1;i<N_BUF;i++)
fscanf(fp,"%f",input+i);
for(i=0;i<O_BUF;i++)
fscanf(fp,"%d",output+i);
compute_u1(); //不断输入新样本,计算隐含层的输出
lms(); //用有导师学习的方式训练输出层
wucha=0.0;
wucha = erro();
k_k=(++k_k)%150;
if(!k_k)
cout<<"训练误差"<<wucha << endl;
/*
if(!k_k) fprintf(fpwucha,"\n");
fprintf(fpwucha,"%16f",wucha);
*/
rbf_test_time++;
}
//结束时钟
clock_t t22=clock();
if (t22==clock_t(-1))
{
cerr<<"sorry ,no clock\n";
exit(1);
}
fclose(fpwucha);
cout<<"\r"<<" 训练结束! "<<endl;
cout<<"训练时间为"<<" "
<<double(t22-t11)/CLOCKS_PER_SEC-file_time*file_time_each
<<"seconds"<<"(这个时间包括了读写文件时间,可以精确)"<<endl;
cout<<"训练轮数为 "<<rbf_test_time<<endl;
fclose(fp);
//rbf测试
rbf_test();
cout<<count<<" "<<endl;
FILE *fp2_rbf;//保存权值
fp2_rbf=fopen("rbf结果\\权值.txt","w");
if (fp2_rbf==NULL)
{
exit(0);
}
for ( layer=1;layer<=2;layer++)
{
for (int j=0;j<N[layer];j++)
{
for(int i=0;i<N[layer-1];i++)
fprintf(fp2_rbf,"w[%d][%d][%d]=%f\n",layer,j,i,w[layer][j][i]);
}
}
fclose(fp2_rbf);
}
double PSONetValBp(int iAgent, FILE *fp)
{
double rtnWuCha = 0.0;
int sit = 0;
//把xx位置值转化给wx
for (int layer=1; layer<=2; layer++)
{
for (int i2 = 0;i2 < N[layer]; i2++)
{
for(int i=0;i<N[layer-1];i++)
{
if(layer == 1)
{
sit = i2 * N[layer-1] + i;
w[layer][i2][i] = xx[iAgent][sit];
}
if(layer == 2)
{
sit = i2 * N[layer-1] + i + N[layer-2] * N[layer-1];
w[layer][i2][i] = xx[iAgent][sit];
}
}
}
}
for(int j = 0; j < 10; j++)
{
//读样本个体
if (feof(fp)) rewind(fp);
for(int i=1;i<N_BUF;i++)
fscanf(fp,"%f",input+i);
for(i=0;i<O_BUF;i++)
fscanf(fp,"%d",output+i);
for (int m=0;m<N_BUF;m++)
u[0][m] = input[m];
//计算神经网络输出值
feed_forward();
//计算适应度输出
rtnWuCha += erro();
}
return rtnWuCha;
}
void pashan(int iAgent)
{
int sit = 0;
for (int layer=1; layer<=2; layer++)
{
for (int i2 = 0;i2 < N[layer]; i2++)
{
for(int i=0;i<N[layer-1];i++)
{
if(layer == 1)
{
sit = i2 * N[layer-1] + i;
w[layer][i2][i] = xx[iAgent][sit];
}
if(layer == 2)
{
sit = i2 * N[layer-1] + i + N[layer-2] * N[layer-1];
w[layer][i2][i] = xx[iAgent][sit];
}
}
}
}
//对最优个体进行再处理
compute_gradient();
update_weights();
for (layer=1; layer<=2; layer++)
{
for (int i2 = 0;i2 < N[layer]; i2++)
{
for(int i=0;i<N[layer-1];i++)
{
if(layer == 1)
{
sit = i2 * N[layer-1] + i;
xx[iAgent][sit] = w[layer][i2][i];
}
if(layer == 2)
{
sit = i2 * N[layer-1] + i + N[layer-2] * N[layer-1];
xx[iAgent][sit] = w[layer][i2][i];
}
}
}
}
}
//PSO
void trainPSOBP()
{
FILE * fp=fopen("study.txt","r");
if (fp == NULL)
{
cout<<"cannot open file"<<endl;
exit(0);
}
for (int i = 0; i<NUMBER_OF_AGENTS; i++)
{
//对权值初始化为-0.1~0.1之间的随机数
for (int i0 = 0; i0 < DIM; i0++)
{
xx[i][i0] = randnumber();
pbstxx[i][i0] = xx[i][i0];
vx[i][i0] = MAXV*(rand()/(RAND_MAX * 1.0));
if ((rand()/RAND_MAX) > 0.5)
vx[i][i0] = -1 * vx[i][i0];
}
}
int iter = 0;
int firsttime = 1;
float weight_up = 0.0f, weight = 0.9f;
int gbest = 0;
bool finish = 0;
double tx[NUMBER_OF_AGENTS][DIM];
long traintimes = 0;
do
{
traintimes++;
double avrfitval = 0;
iter++;
if (iter >32760) iter=0; /* so it doesnt crash the data type */
//update inertia weight, linear from weight to 0.4
weight_up = (weight-0.4) * (MAXITER - iter) /MAXITER +0.4;
for (i = 0; i < NUMBER_OF_AGENTS; i++)
{
//计算每个个体的适应度值
double minval = PSONetValBp(i,fp);
if (firsttime==1)
pbest[i] = minval;
if (minval < pbest[i])
{
pbest[i] = minval;
for (int i0=0; i0<DIM; i0++)
pbstxx[i][i0]=xx[i][i0]; //记录下个体最优位置
if (pbest[i] < pbest[gbest])
{
gbest = i; //记录下全局最优位置
}
}
avrfitval += minval;
}
//pashan(gbest);
avrfitval = avrfitval / NUMBER_OF_AGENTS;
if((k_k=(++k_k)%10)== 0)
{
cout<<"avrfitval ="<<avrfitval << " gbest ="<<gbest
<<"bestfitval ="<<pbest[gbest]<<" times = "<<traintimes <<endl;
}
for (i = 0; i < NUMBER_OF_AGENTS; i++)
{
for (int i0 = 0; i0 < DIM; i0++)
{
vx[i][i0] = weight_up*vx[i][i0] + 2*(rand()/(RAND_MAX * 1.0))*(pbstxx[i][i0]-xx[i][i0]) +
2*(rand()/(RAND_MAX * 1.0))*(pbstxx[gbest][i0]-xx[i][i0]);
if (vx[i][i0] > MAXV)
vx[i][i0] = MAXV;
else if (vx[i][i0] < -1 * MAXV)
vx[i][i0] = -1 * MAXV;
}
for (i0 = 0; i0 < DIM; i0++)
{
tx[i][i0] = xx[i][i0] + vx[i][i0];
/*
if(tx[i][i0] >= MAXXX)
tx[i][i0] = MAXXX;
else if(tx[i][i0] <= -MAXXX)
tx[i][i0] = -MAXXX;
*/
}
}
for (i = 0;i < NUMBER_OF_AGENTS;i++)
{
for (int i0 = 0;i0 < DIM; i0++)
{
xx[i][i0] =tx[i][i0];
}
}
if (firsttime!=1)
{
if (iter==32766) iter=0;
}
if ((pbest[gbest] <= EP) || (iter >= MAXITER))
{
finish=1;
}
firsttime = 0;
/*
fprintf(fp,"%f\n",pbest[gbest]);
for(b = 0; b < DIMENSION; b++)
{
TRACE(" %2.2f",xx[b][gbest]);
}
*/
}while (! finish);
test();
}
double PSONetValRBF(int iAgent, FILE *fp)
{
double rtnWuCha = 0.0;
int sit = 0;
//把xx位置值转化给wx
int layer = 2;
for (int i2 = 0;i2 < N[layer]; i2++)
{
for(int i=0;i<N[layer-1];i++)
{
sit = i2 * N[layer-1] + i;
w[layer][i2][i] = xx[iAgent][sit];
}
}
for(int j = 0; j < 5; j++)
{
//读样本个体
if (feof(fp)) rewind(fp);
for(int i=1;i<N_BUF;i++)
fscanf(fp,"%f",input+i);
for(i=0;i<O_BUF;i++)
fscanf(fp,"%d",output+i);
for (int m=0;m<N_BUF;m++)
u[0][m] = input[m];
//计算神经网络输出值
//不断输入新样本,计算隐含层的输出
compute_u1();
lms();
//计算适应度输出
double temp = erro();
//cout<<"iAgent ="<<iAgent<<"::erro = " <<temp<<endl;
rtnWuCha += temp;
}
/*
for (i2 = 0;i2 < N[layer]; i2++)
{
for(int i=0;i<N[layer-1];i++)
{
sit = i2 * N[layer-1] + i;
xx[iAgent][sit] = w[layer][i2][i] ;
}
}
*/
return rtnWuCha;
}
//PSO
void trainPSORBF()
{
//K-均值 聚类无导师学习算法,确定w[1][..]和高斯因子
//为隐含层的计算做好准备
k_means();
FILE * fp=fopen("study.txt","r");
if (fp == NULL)
{
cout<<"cannot open file"<<endl;
exit(0);
}
for (int i = 0; i<NUMBER_OF_AGENTS; i++)
{
//对权值初始化为-0.1~0.1之间的随机数
for (int i0 = 0; i0 < DIMRBF; i0++)
{
xx[i][i0] = randnumber();
pbstxx[i][i0] = xx[i][i0];
vx[i][i0] = MAXV*(rand()/(RAND_MAX * 1.0));
if ((rand()/RAND_MAX) > 0.5)
vx[i][i0] = -1 * vx[i][i0];
}
}
int iter = 0;
int firsttime = 1;
float weight_up = 0.0f, weight = 0.9f;
int gbest = 0;
bool finish = 0;
double tx[NUMBER_OF_AGENTS][DIM];
long traintimes = 0;
do
{
traintimes++;
double avrfitval = 0;
iter++;
if (iter >32760) iter=0; /* so it doesnt crash the data type */
//update inertia weight, linear from weight to 0.4
weight_up = (weight-0.4) * (MAXITER - iter) /MAXITER +0.4;
for (i = 0; i < NUMBER_OF_AGENTS; i++)
{
//计算每个个体的适应度值
double minval = PSONetValRBF(i,fp);
if (firsttime==1)
pbest[i] = minval;
if (minval < pbest[i])
{
pbest[i] = minval;
for (int i0=0; i0<DIMRBF; i0++)
pbstxx[i][i0]=xx[i][i0]; //记录下个体最优位置
if (pbest[i] < pbest[gbest])
{
gbest = i; //记录下全局最优位置
}
}
avrfitval += minval;
}
avrfitval = avrfitval / NUMBER_OF_AGENTS;
if((k_k=(++k_k)%10)== 0)
{
cout<<"avrfitval ="<<avrfitval << " gbest ="<<gbest<<endl;
cout<<"bestfitval ="<<pbest[gbest]<<" times = "<<traintimes <<endl;
}
for (i = 0; i < NUMBER_OF_AGENTS; i++)
{
for (int i0 = 0; i0 < DIMRBF; i0++)
{
vx[i][i0] = weight_up*vx[i][i0] + 2*(rand()/(RAND_MAX * 1.0))*(pbstxx[i][i0]-xx[i][i0]) +
2*(rand()/(RAND_MAX * 1.0))*(pbstxx[gbest][i0]-xx[i][i0]);
if (vx[i][i0] > MAXV)
vx[i][i0] = MAXV;
else if (vx[i][i0] < -1 * MAXV)
vx[i][i0] = -1 * MAXV;
}
for (i0 = 0; i0 < DIMRBF; i0++)
{
tx[i][i0] = xx[i][i0] + vx[i][i0];
/*
if(tx[i][i0] >= 1.0)
tx[i][i0] = 1.0;
else if(tx[i][i0] <= -1.0)
tx[i][i0] = -1.0;
*/
}
}
for (i = 0;i < NUMBER_OF_AGENTS;i++)
{
for (int i0 = 0;i0 < DIMRBF; i0++)
{
xx[i][i0] =tx[i][i0];
}
}
if (firsttime!=1)
{
if (iter==32766) iter=0;
}
if ((pbest[gbest] <= EP) || (iter >= MAXITER))
{
finish=1;
}
firsttime = 0;
/*
fprintf(fp,"%f\n",pbest[gbest]);
for(b = 0; b < DIMENSION; b++)
{
TRACE(" %2.2f",xx[b][gbest]);
}
*/
}while (! finish);
}
////////////////////////主函数入口//////////////////////////
int main()
{
//BP 神经网络部分
//trainBp();
//RBF神经网络
//trainRBF();
//PSO 神经网络
//trainPSOBP();
//PSO 神经网络
//trainPSORBF();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -