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

📄 mainapp.cpp

📁 应用PSO训练神经网络Visual C++ 训练结果优于BP,该方法用于模式识别、知识挖掘等
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -