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

📄 bpanndlg.cpp

📁 基于Visual C++6.0的BP神经网络程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
			outQuanFile<<Wp[io1*Innodes+jo1]<<","; 
		}
		outQuanFile<<"\n";
	}//取得输入层至第一隐层权值Wp
    outQuanFile.close();
	//~输出文本文件
	//=====================================

	//状态显示
	m_state.Format("权值初始化完成!%2.4f,%2.4f\r\n",Yout[0],Yout[1]);
	UpdateData(false);
	//按钮允许
	GetDlgItem(IDC_BPANNSAVE)->EnableWindow(true);
}
//=========================~Train============================================

void CBpAnnDlg::OnBpannsave() 
{
	// TODO: Add your control notification handler code here


	//状态显示
	m_state.Format("保存当前已经训练好的神经网络.\r\n");
	UpdateData(false);
}

void CBpAnnDlg::InitDataTrans(int in_nodes, int hide_layer, int hide_nodes, int out_nodes, double learn_ratio)
{
	Innodes=in_nodes;
	Hidelayer=hide_layer;
	Hidenodes=hide_nodes;
	Outnodes=out_nodes;
	Learnratio=learn_ratio;
}

void CBpAnnDlg::InitWeights(double *pWp, double *pVp)
{
	int test=0;
	//初始化输入层权值
	for(int iw=0;iw<Hidenodes;iw++)
	{
		for(int jw=0;jw<Innodes;jw++)
		{			
			pWp[iw*Innodes+jw] = double(rand()%100); //产生0~100
			pWp[iw*Innodes+jw] = pWp[iw*Innodes+jw]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pWp[iw*Innodes+jw] = -pWp[iw*Innodes+jw];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化输出层权值
	for(int iv=0;iv<Outnodes;iv++)
	{
		for(int jv=0;jv<Hidenodes;jv++)
		{			
			pVp[iv*Hidenodes+jv] = double(rand()%100); //产生0~100
			pVp[iv*Hidenodes+jv] = pVp[iv*Hidenodes+jv]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pVp[iv*Hidenodes+jv] = -pVp[iv*Hidenodes+jv];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
}

void CBpAnnDlg::InitWeights(double *pWp, double *pVp, double *pYp1)
{
	int test=0;
	//初始化输入层权值
	for(int iw=0;iw<Hidenodes;iw++)
	{
		for(int jw=0;jw<Innodes;jw++)
		{			
			pWp[iw*Innodes+jw] = double(rand()%100); //产生0~100
			pWp[iw*Innodes+jw] = pWp[iw*Innodes+jw]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pWp[iw*Innodes+jw] = -pWp[iw*Innodes+jw];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化输出层权值
	for(int iv=0;iv<Outnodes;iv++)
	{
		for(int jv=0;jv<Hidenodes;jv++)
		{			
			pVp[iv*Hidenodes+jv] = double(rand()%100); //产生0~100
			pVp[iv*Hidenodes+jv] = pVp[iv*Hidenodes+jv]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pVp[iv*Hidenodes+jv] = -pVp[iv*Hidenodes+jv];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层1权值
	for(int ih1=0;ih1<Hidenodes;ih1++)
	{
		for(int jh1=0;jh1<Hidenodes;jh1++)
		{			
			pYp1[ih1*Hidenodes+jh1] = double(rand()%100); //产生0~100
			pYp1[ih1*Hidenodes+jh1] = pYp1[ih1*Hidenodes+jh1]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp1[ih1*Hidenodes+jh1] = -pYp1[ih1*Hidenodes+jh1];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
}

void CBpAnnDlg::InitWeights(double *pWp, double *pVp, double *pYp1, double *pYp2)
{
	int test=0;
	//初始化输入层权值
	for(int iw=0;iw<Hidenodes;iw++)
	{
		for(int jw=0;jw<Innodes;jw++)
		{			
			pWp[iw*Innodes+jw] = double(rand()%100); //产生0~100
			pWp[iw*Innodes+jw] = pWp[iw*Innodes+jw]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pWp[iw*Innodes+jw] = -pWp[iw*Innodes+jw];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化输出层权值
	for(int iv=0;iv<Outnodes;iv++)
	{
		for(int jv=0;jv<Hidenodes;jv++)
		{			
			pVp[iv*Hidenodes+jv] = double(rand()%100); //产生0~100
			pVp[iv*Hidenodes+jv] = pVp[iv*Hidenodes+jv]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pVp[iv*Hidenodes+jv] = -pVp[iv*Hidenodes+jv];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层1权值
	for(int ih1=0;ih1<Hidenodes;ih1++)
	{
		for(int jh1=0;jh1<Hidenodes;jh1++)
		{			
			pYp1[ih1*Hidenodes+jh1] = double(rand()%100); //产生0~100
			pYp1[ih1*Hidenodes+jh1] = pYp1[ih1*Hidenodes+jh1]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp1[ih1*Hidenodes+jh1] = -pYp1[ih1*Hidenodes+jh1];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层2权值
	for(int ih2=0;ih2<Hidenodes;ih2++)
	{
		for(int jh2=0;jh2<Hidenodes;jh2++)
		{			
			pYp2[ih2*Hidenodes+jh2] = double(rand()%100); //产生0~100
			pYp2[ih2*Hidenodes+jh2] = pYp2[ih2*Hidenodes+jh2]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp2[ih2*Hidenodes+jh2] = -pYp2[ih2*Hidenodes+jh2];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
}

void CBpAnnDlg::InitWeights(double *pWp, double *pVp, double *pYp1, double *pYp2, double *pYp3)
{
	int test=0;
	//初始化输入层权值
	for(int iw=0;iw<Hidenodes;iw++)
	{
		for(int jw=0;jw<Innodes;jw++)
		{			
			pWp[iw*Innodes+jw] = double(rand()%100); //产生0~100
			pWp[iw*Innodes+jw] = pWp[iw*Innodes+jw]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pWp[iw*Innodes+jw] = -pWp[iw*Innodes+jw];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化输出层权值
	for(int iv=0;iv<Outnodes;iv++)
	{
		for(int jv=0;jv<Hidenodes;jv++)
		{			
			pVp[iv*Hidenodes+jv] = double(rand()%100); //产生0~100
			pVp[iv*Hidenodes+jv] = pVp[iv*Hidenodes+jv]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pVp[iv*Hidenodes+jv] = -pVp[iv*Hidenodes+jv];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层1权值
	for(int ih1=0;ih1<Hidenodes;ih1++)
	{
		for(int jh1=0;jh1<Hidenodes;jh1++)
		{			
			pYp1[ih1*Hidenodes+jh1] = double(rand()%100); //产生0~100
			pYp1[ih1*Hidenodes+jh1] = pYp1[ih1*Hidenodes+jh1]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp1[ih1*Hidenodes+jh1] = -pYp1[ih1*Hidenodes+jh1];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层2权值
	for(int ih2=0;ih2<Hidenodes;ih2++)
	{
		for(int jh2=0;jh2<Hidenodes;jh2++)
		{			
			pYp2[ih2*Hidenodes+jh2] = double(rand()%100); //产生0~100
			pYp2[ih2*Hidenodes+jh2] = pYp2[ih2*Hidenodes+jh2]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp2[ih2*Hidenodes+jh2] = -pYp2[ih2*Hidenodes+jh2];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层3权值
	for(int ih3=0;ih3<Hidenodes;ih3++)
	{
		for(int jh3=0;jh3<Hidenodes;jh3++)
		{			
			pYp3[ih3*Hidenodes+jh3] = double(rand()%100); //产生0~100
			pYp3[ih3*Hidenodes+jh3] = pYp3[ih3*Hidenodes+jh3]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp3[ih3*Hidenodes+jh3] = -pYp3[ih3*Hidenodes+jh3];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
}

void CBpAnnDlg::InitWeights(double *pWp, double *pVp, double *pYp1, double *pYp2, double *pYp3, double *pYp4)
{
	int test=0;
	//初始化输入层权值
	for(int iw=0;iw<Hidenodes;iw++)
	{
		for(int jw=0;jw<Innodes;jw++)
		{			
			pWp[iw*Innodes+jw] = double(rand()%100); //产生0~100
			pWp[iw*Innodes+jw] = pWp[iw*Innodes+jw]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pWp[iw*Innodes+jw] = -pWp[iw*Innodes+jw];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化输出层权值
	for(int iv=0;iv<Outnodes;iv++)
	{
		for(int jv=0;jv<Hidenodes;jv++)
		{			
			pVp[iv*Hidenodes+jv] = double(rand()%100); //产生0~100
			pVp[iv*Hidenodes+jv] = pVp[iv*Hidenodes+jv]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pVp[iv*Hidenodes+jv] = -pVp[iv*Hidenodes+jv];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层1权值
	for(int ih1=0;ih1<Hidenodes;ih1++)
	{
		for(int jh1=0;jh1<Hidenodes;jh1++)
		{			
			pYp1[ih1*Hidenodes+jh1] = double(rand()%100); //产生0~100
			pYp1[ih1*Hidenodes+jh1] = pYp1[ih1*Hidenodes+jh1]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp1[ih1*Hidenodes+jh1] = -pYp1[ih1*Hidenodes+jh1];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层2权值
	for(int ih2=0;ih2<Hidenodes;ih2++)
	{
		for(int jh2=0;jh2<Hidenodes;jh2++)
		{			
			pYp2[ih2*Hidenodes+jh2] = double(rand()%100); //产生0~100
			pYp2[ih2*Hidenodes+jh2] = pYp2[ih2*Hidenodes+jh2]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp2[ih2*Hidenodes+jh2] = -pYp2[ih2*Hidenodes+jh2];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层3权值
	for(int ih3=0;ih3<Hidenodes;ih3++)
	{
		for(int jh3=0;jh3<Hidenodes;jh3++)
		{			
			pYp3[ih3*Hidenodes+jh3] = double(rand()%100); //产生0~100
			pYp3[ih3*Hidenodes+jh3] = pYp3[ih3*Hidenodes+jh3]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp3[ih3*Hidenodes+jh3] = -pYp3[ih3*Hidenodes+jh3];
				test ++;
			}
			//Wp[i][j]<0?printf("%.3f ",Wp[i][j]):printf(" %.3f ",Wp[i][j]);
		}
		//printf("\n");
	}
	//初始化隐层4权值
	for(int ih4=0;ih4<Hidenodes;ih4++)
	{
		for(int jh4=0;jh4<Hidenodes;jh4++)
		{			
			pYp4[ih4*Hidenodes+jh4] = double(rand()%100); //产生0~100
			pYp4[ih4*Hidenodes+jh4] = pYp4[ih4*Hidenodes+jh4]/1000;     //产生0~0.1
			int flag = rand()%2;
			if(flag == 0)
			{
				pYp4[ih4*Hidenodes+jh4] = -pYp4[ih4*Hidenodes+jh4];
				test ++;
			}
			//Wp[i][j]<0?printf("%.4f ",Wp[i][j]):printf(" %.4f ",Wp[i][j]);
		}
		//printf("\n");
	}
}

void CBpAnnDlg::ForCalcul(double *pIn, double *pW, double *pOut, int nIn, int nOut)
{
	int i,j;
	double net;
	for(j = 0; j < nOut; j++)
	{
		net = 0.0;
		for(i = 0; i < nIn; i++)
		{
			net += pW[j*nIn+i]*pIn[i]; //输入层到隐层各个单元的加权和
		}
		pOut[j] = 1.0/(1.0+exp(-net));  //计算隐层个单元输出
	}
}

⌨️ 快捷键说明

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