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

📄 nnmod.cpp

📁 vc编程实现bp神经网络
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	return 0;

}

void CNNMod::OnShowWindow(BOOL bShow, UINT nStatus) 
{
	CFormView::OnShowWindow(bShow, nStatus);
	
	// TODO: Add your message handler code here
	UpdateData(false);
    GetDlgItem(IDC_INPUT_LAYER_NUMBER)->SetWindowText("");
	GetDlgItem(IDC_HIDE_LAYER_NUMBER)->SetWindowText("");
	GetDlgItem(IDC_OUTPUT_LAYER_NUMBER)->SetWindowText("");

	(CNNMod *)GetDlgItem(IDC_SIMU_NETWORK_FOLD)->EnableWindow(FALSE);

	(CNNMod *)GetDlgItem(IDC_SIMU_NETWORK_FOLD_BROWSER)->EnableWindow(FALSE);

	(CNNMod *)GetDlgItem(IDC_SIMU_DATA_INPUT)->EnableWindow(FALSE);

	(CNNMod *)GetDlgItem(IDC_SIMU_DATA_INPUT_BROWSER)->EnableWindow(FALSE);

	(CNNMod *)GetDlgItem(IDC_SIMU_RESULT)->EnableWindow(FALSE);

	(CNNMod *)GetDlgItem(IDC_SIMU_RESULT_BROWSER)->EnableWindow(FALSE);

	/////////////////////////////////////////////////////////////////////
	// Enabled the following controls
	/////////////////////////////////////////////////////////////////////
	(CNNMod *)GetDlgItem(IDC_SYSTEM_LEVEL)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_MAX_TRAIN_TIMES)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_STEP)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_INPUT_LAYER_NUMBER)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_HIDE_LAYER_NUMBER)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_OUTPUT_LAYER_NUMBER)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_COMBO_ARITHMETIC)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_COMBO_FUNC)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_NETWORK_BROWSER)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT)->EnableWindow(TRUE);

	(CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT_BROWSER)->EnableWindow(TRUE);	

	//
	// End of initializing the state of the controls on the CNNMod
	/////////////////////////////////////////////////////////////////////////

}

void CNNMod::OnForecast() 
{
	// TODO: Add your control notification handler code here
	m_ForecastDlg.DoModal();
}

void CNNMod::OnModVarDefine() 
{
	// TODO: Add your control notification handler code here
	CUserDataDlg UsDataDlg;
	UsDataDlg.DoModal();
}

void CNNMod::OnModeling() //开始从数据库读取数据建模

{
//判断是否初始化
	UpdateData(TRUE);//接受编辑框内容TrainingDemo(); 	return ;
    m_bSimulateDataFlag=0;//是在训练状态
 
	if(m_nInputLayerNumber <= 0)
	{
		::MessageBox (this->m_hWnd, _T("输入层数目必须为大于等于1的正整数!"), _T(":("), MB_OK | MB_ICONWARNING);
		return ;
	}

	if(m_nHideLayerNumber <= 0)
	{
		::MessageBox (this->m_hWnd, _T("隐含层数目必须为大于等于1的正整数!"), _T(":("),MB_OK | MB_ICONWARNING);
		return ;
	}

	if(m_nOutputLayerNumber <= 0)
	{
		::MessageBox (this->m_hWnd, _T("输出层数目必须为大于等于1的正整数!"), _T(":("), MB_OK | MB_ICONWARNING);
		return ;
	}

	if(m_nComboArithmetic == -1)
	{
		::MessageBox (this->m_hWnd, _T("你还没有选取用来训练的算法!"), _T(":("), MB_OK | MB_ICONWARNING);
		return ;
	}

	if(m_nComboFunc == -1)
	{
		::MessageBox (this->m_hWnd, _T("你还没有选取用来训练的激活函数!"), _T(":("), MB_OK | MB_ICONWARNING);
		return ;
	}

	if(m_strDemoSaveNetwork.IsEmpty ())
	{
		::MessageBox (this->m_hWnd, _T("你还没选取最终模拟输出网络参数的文件的存放路径!"), _T(":("), MB_OK | MB_ICONWARNING);
		return ;

	}
	
	if(m_MDescription.IsEmpty ())
	{
		::MessageBox (this->m_hWnd, _T("你还没输入模型描叙!"), _T(":("), MB_OK | MB_ICONWARNING);
		return ;

	}

	if(VariInCnt==0||VariOutCnt==0||tn.IsEmpty())
	{
		AfxMessageBox("请先进行模型变量定义!");
		return;
	}

// TODO: Add your control notification handler code here
	CString strSQL;
	if(m_recordset->IsOpen())
		m_recordset->Close();
	strSQL.Format ("select * from tab_ModelInfo where Us_Name='%s' and Model_Name='%s'\
	and Model_Method='神经网络'",username,ModelName);
    m_recordset->Open (AFX_DAO_USE_DEFAULT_TYPE,strSQL);
    if(!m_recordset->IsEOF())
	{
		AfxMessageBox("此模型已存在!");	
		return;
	}
	m_recordset->Close();

	strSQL.Format ("select * from tab_VariableInfo where Us_Name='%s' and Model_Name='%s'",username,ModelName);
    m_recordset->Open(AFX_DAO_USE_DEFAULT_TYPE,strSQL);

		
	m_recordset->MoveFirst();

	CDaoTableDef td(&m_Db);
	CDaoFieldInfo fi;
	COleVariant var;
	
	td.Open(tn);
	if(m_set.IsOpen())
		m_set.Close();
	m_set.Open(&td);
	int ItemCnt;
	ItemCnt=SampleEnd-SampleStart+1;

    m_matrixDemoDataInput.m_nRow=ItemCnt;//
//	VariInCnt=(int)m_nInputLayerNumber;
//	VariOutCnt=(int)m_nOutputLayerNumber;
	m_matrixDemoDataInput.m_nCol=VariInCnt+VariOutCnt;
    m_matrixDemoDataInput.m_pTMatrix.resize(ItemCnt);//
    m_matrixDemoDataInput.m_pTMatrix[0].resize(VariInCnt+VariOutCnt);

	for( int verify=0;verify<ItemCnt;verify++)//给矩阵定义空间
	  { 
		  for(int verify1=0;verify1<VariInCnt+VariOutCnt;verify1++)
		  {
              m_matrixDemoDataInput.m_pTMatrix[verify].resize(VariInCnt+VariOutCnt);
			  m_matrixDemoDataInput.m_pTMatrix[verify][verify1]=(double)0;
		  }
	  }
 
	
	m_set.MoveFirst();
	if (SampleStart>1)
		m_set.Move(SampleStart-1);



	int i;
	int j=0,k=0,q=ItemCnt;
//	double zhang[5][9];//测试用
	while(!m_recordset->IsEOF())//不是指向tab_VariInfo最后一条记录
	{

		for(i=0;i<m_set.GetFieldCount();i++)//	确定不超过数据列范围
		{
	    	m_set.GetFieldInfo(i,fi);//获取列名信息
			m_recordset->GetFieldValue(5,var);//
	    	if(fi.m_strName==(LPCTSTR)var.bstrVal)//如果找到对应的变量名的话
			{
				while(q>0)//读取一列数据
				
				    {
		        	 m_set.GetFieldValue(i,var);
				  //   zhang[j][k]=var.dblVal;
			   	     m_matrixDemoDataInput.m_pTMatrix[j][k]=(double)var.dblVal;
    	             m_set.MoveNext();
		             j++;
			         q--;
					}
	   			j=0;
				break;
               
			}
				
		}

		m_set.MoveFirst();
		if (SampleStart>1)
			m_set.Move(SampleStart-1);
	        q=ItemCnt;
	        m_recordset->MoveNext();
	    k++;
	}

//代码区
  		
	if((m_nInputLayerNumber + m_nOutputLayerNumber) != VariInCnt+VariOutCnt )//m_matrixDemoDataInput.GetMatrixColNumber ()
	{
		::MessageBox (this->m_hWnd, _T("所输入的输入层和输出层数目之和与被读取文件中的数目不相符!"), _T("错误!"), MB_OK | MB_ICONERROR);
		return ;//FALSE
	}

 
	// 第一次前向计算初始化
	ForwardCalculateInit();

	// 反复反馈运算
	bool	bSuccess = DemoDataTrainRepeat();

  	if(bSuccess) // Successful!
	{    
		// 存取模型信息
		    strSQL.Format("insert into tab_ModelInfo(Us_Name,Model_Name,\
					Model_Method,Model_Function,Model_Description)\
					Values('%s','%s','神经网络','%s','%s')",\
					username,ModelName,m_strDemoSaveNetwork,m_MDescription);
			try
			{
				if(m_database->CanUpdate())
					m_database->Execute(strSQL);
			}
			catch(CDaoException* e)
			{
				e->ReportError();
				e->Delete();
				return;
			}
               m_recordset->Close();//zdh加的
		//////////////////////////////////////////////////////////////////////////////
		//						定义存储矩阵格式									//
		//////////////////////////////////////////////////////////////////////////////

 		if(!(m_strDemoSaveNetwork.IsEmpty ()))//这其实已经在前面判断了
		{
			CString strDemoInputLayerNumber = _T("## 样本的输入层的数目: ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork, strDemoInputLayerNumber);

			CString strInputLayerNumber; 
			strInputLayerNumber.Format ("%u", m_nInputLayerNumber);
			SaveConstantStringToFile(m_strDemoSaveNetwork, strInputLayerNumber);
			
			CString strDemoHideLayerNumber = _T("\n## 样本的隐含层的数目: ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork, strDemoHideLayerNumber);

			CString strHideLayerNumber;
			strHideLayerNumber.Format ("%u", m_nHideLayerNumber);
			SaveConstantStringToFile(m_strDemoSaveNetwork, strHideLayerNumber);

			CString strDemoOutputLayerNumber = _T("\n## 样本的输出层的数目: ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork, strDemoOutputLayerNumber);

			CString strOutputLayerNumber;
			strOutputLayerNumber.Format ("%u", m_nOutputLayerNumber);
			SaveConstantStringToFile(m_strDemoSaveNetwork, strOutputLayerNumber);

			CString strSelectAlgorithm = _T("\n## 训练网络所采用的神经网络算法: ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork, strSelectAlgorithm);

			CString strComboArithmetic;
			strComboArithmetic.Format ("%d", m_nComboArithmetic);
			SaveConstantStringToFile(m_strDemoSaveNetwork, strComboArithmetic);

			CString strSelectFunction = _T("\n## 网络中使用的函数的索引值: ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork, strSelectFunction);

			CString strComboFunc;
			strComboFunc.Format ("%d", m_nComboFunc);
			SaveConstantStringToFile(m_strDemoSaveNetwork, strComboFunc);


			CString strSeparator = _T("\n## 输入层到隐含层的权值矩阵 ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork, strSeparator);
			
			// 存储模拟过的输入到隐含层的权值矩阵
			m_matrixInputToHideWeightValue.SaveDataToFile (m_strDemoSaveNetwork);

			strSeparator = _T("\n## 隐含层的阀值矩阵 ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork,strSeparator);

			// 存储模拟过的隐含层的阀值矩阵
			m_matrixHideLayerValveValue.SaveDataToFile (m_strDemoSaveNetwork);

			strSeparator = _T("\n## 隐含层到输出层的权值矩阵 ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork,strSeparator);

			// 存储模拟过的隐含层到输出层的权值矩阵
			m_matrixHideToOutputWeightValue.SaveDataToFile (m_strDemoSaveNetwork);

			strSeparator = _T("\n## 输出层的阀值矩阵 ##\n");
			SaveConstantStringToFile(m_strDemoSaveNetwork,strSeparator);

			// 存储模拟过的输出层的阀值矩阵
			m_matrixOutputLayerValveValue.SaveDataToFile (m_strDemoSaveNetwork);

		}


/*		//	存储模拟过的输出层的输出值矩阵	
		if(!(m_strDemoSaveResult.IsEmpty ()))
		{
			(m_matrixOutputLayerOutput.Transpose()).SaveDataToFile (m_strDemoSaveResult);
		}
*/
	 // 释放全局变量所占的内存
       m_matrixDemoDataInput.InitializeZero ();
       m_matrixInputLayerValue.InitializeZero ();
       m_matrixInputToHideWeightValue.InitializeZero ();
	   m_matrixHideLayerValveValue.InitializeZero ();
	   m_matrixHideLayerOutput.InitializeZero ();
	   m_matrixHideToOutputWeightValue.InitializeZero ();
       m_matrixOutputLayerValveValue.InitializeZero ();	
	   m_matrixOutputLayerOutput.InitializeZero ();

		// ReInitialize the global value
		m_nInputLayerNumber = 0;
		m_nHideLayerNumber = 0;
		m_nOutputLayerNumber = 0;
		m_nComboFunc = -1;
		m_nComboArithmetic = -1;
		m_nSystemError = 0;
		m_nTrainTimes = 0;
		m_nSystemErrorLevel = SYSTEM_ERROR_LEVEL;
		m_nMaxTrainTimes = LOOP_MAX_TIMES;
		m_SystemErrorNew = MAX_SYSTEM_ERROR;
		m_SystemErrorOld = MAX_SYSTEM_ERROR;
		m_nStep = INIT_STEP;
   		m_strDemoSaveNetwork = TEXT("");
    
		::MessageBox (this->m_hWnd, _T("训练次数到了/模型精度已经满足!"), _T("恭喜!"), MB_OK);


    	

	}
	else	// Fail to accomplish the task
	{		

		// 释放全局变量所占的内存
		m_matrixDemoDataInput.InitializeZero ();
	    m_matrixInputLayerValue.InitializeZero ();
		m_matrixInputToHideWeightValue.InitializeZero ();
		m_matrixHideLayerValveValue.InitializeZero ();
		m_matrixHideLayerOutput.InitializeZero ();
		m_matrixHideToOutputWeightValue.InitializeZero ();
		m_matrixOutputLayerValveValue.InitializeZero ();	
		m_matrixOutputLayerOutput.InitializeZero ();

		// ReInitialize the global value
		m_nInputLayerNumber = 0;
		m_nHideLayerNumber = 0;
		m_nOutputLayerNumber = 0;
		m_nComboFunc = -1;
		m_nComboArithmetic = -1;
		m_nSystemError = 0;
		m_nTrainTimes = 0;
		m_nSystemErrorLevel = SYSTEM_ERROR_LEVEL;
		m_nMaxTrainTimes = LOOP_MAX_TIMES;
		m_SystemErrorNew = MAX_SYSTEM_ERROR;
		m_SystemErrorOld = MAX_SYSTEM_ERROR;
		m_nStep = INIT_STEP;
	   	m_strDemoSaveNetwork = TEXT("");
		::MessageBox (this->m_hWnd, _T("未能完成您交给我的任务,请重新设置各参数后,再试!"), _T("抱歉!"),MB_OK | MB_ICONERROR);
	}
	return;
//代码区    
 }

void CNNMod::OnDocument() 
{
	// TODO: Add your control notification handler code here
	(CNNMod *)GetDlgItem(IDC_EDT_MDESCRIPTION)->EnableWindow(FALSE);
    (CNNMod *)GetDlgItem(IDC_ModVarDefine)->EnableWindow(FALSE);
    (CNNMod *)GetDlgItem(IDC_Modeling)->EnableWindow(FALSE);
    (CNNMod *)GetDlgItem(IDC_FORECAST)->EnableWindow(FALSE);

    (CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT_BROWSER)->EnableWindow(TRUE);
/*  (CNNMod *)GetDlgItem(IDC_SIMU_NETWORK_FOLD)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_SIMU_DATA_INPUT)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_SIMU_DATA_INPUT_BROWSER)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_SIMU_RESULT)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_SIMU_RESULT_BROWSER)->EnableWindow(TRUE);
*/  (CNNMod *)GetDlgItem(IDC_BEGIN_TRAIN)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_STOP_TRAIN)->EnableWindow(TRUE);
    (CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
 
}

void CNNMod::OnDatabase() 
{
	// TODO: Add your control notification handler code here
	 (CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_DEMO_SAVE_RESULT_BROWSER)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_SIMU_NETWORK_FOLD)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_SIMU_DATA_INPUT)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_SIMU_DATA_INPUT_BROWSER)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_SIMU_RESULT)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_SIMU_RESULT_BROWSER)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_BEGIN_TRAIN)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_STOP_TRAIN)->EnableWindow(FALSE);
     (CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(FALSE);

     (CNNMod *)GetDlgItem(IDC_EDT_MDESCRIPTION)->EnableWindow(TRUE);
     (CNNMod *)GetDlgItem(IDC_ModVarDefine)->EnableWindow(TRUE);
     (CNNMod *)GetDlgItem(IDC_Modeling)->EnableWindow(TRUE);
     (CNNMod *)GetDlgItem(IDC_FORECAST)->EnableWindow(TRUE);

}

⌨️ 快捷键说明

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