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

📄 nnbpdlg.cpp

📁 专家系统-神经网络代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		::SetWindowText (hWnd, m_strDemoSaveResult);

	}
	else
	{
		return;
	}

}

void CNNBPDlg::OnSimuNetworkFoldBrowser() 
{
	// TODO: Add your control notification handler code here

	static char BASED_CODE szFilter[] = TEXT("文本文件(*.txt)|*.txt|All Files (*.*)|*.*||");
	static char BASED_CODE lpszDefExt[] = TEXT("txt");


	//Create the dialog to select the network data file
	CFileDialog dlg(TRUE,
		            lpszDefExt,
					NULL,
					OFN_READONLY		| 
					OFN_FILEMUSTEXIST   |
					OFN_PATHMUSTEXIST,
					szFilter,
					this);

	if(dlg.DoModal ()==IDOK)
	{
		m_strSimuNetworkFold = dlg.GetPathName ();

		HWND hWnd = ::GetDlgItem (this->m_hWnd ,IDC_SIMU_NETWORK_FOLD);
		::SetWindowText (hWnd, m_strSimuNetworkFold);
		
	}
	else
	{
		return;
	}
	
}

void CNNBPDlg::OnSimuDataInputBrowser() 
{
	// TODO: Add your control notification handler code here

	static char BASED_CODE szFilter[] = TEXT("文本文件(*.txt)|*.txt|All Files (*.*)|*.*||");
	static char BASED_CODE lpszDefExt[] = TEXT("txt");

	//Create the dialog to select the simulate data file
	CFileDialog dlg(TRUE,
		            lpszDefExt,
					NULL,
					OFN_READONLY		| 
					OFN_FILEMUSTEXIST   |
					OFN_PATHMUSTEXIST,
					szFilter,
					this);

	if(dlg.DoModal ()==IDOK)
	{
		m_strSimuDataInput = dlg.GetPathName ();

		HWND hWnd = ::GetDlgItem (this->m_hWnd ,IDC_SIMU_DATA_INPUT);
		::SetWindowText (hWnd,m_strSimuDataInput);
		
	}
	else
	{
		return;
	}
	
}

void CNNBPDlg::OnSimuResultBrowser() 
{
	// TODO: Add your control notification handler code here

	static char BASED_CODE szFilter[] = TEXT("文本文件(*.txt)|*.txt|All Files (*.*)|*.*||");
	static char BASED_CODE lpszDefExt[] = TEXT("txt");

	//Create the dialog to select the demo data file
	CFileDialog dlg(FALSE,
		            lpszDefExt,
					NULL,
					OFN_HIDEREADONLY    | 
					OFN_CREATEPROMPT	|
					OFN_OVERWRITEPROMPT,
					szFilter,
					this);

	if(dlg.DoModal ()==IDOK)
	{
		m_strSimuResult = dlg.GetPathName ();

		HWND hWnd = ::GetDlgItem (this->m_hWnd ,IDC_SIMU_RESULT);
		::SetWindowText (hWnd,m_strSimuResult);
		
	}
	else
	{
		return;
	}
	
}

void CNNBPDlg::OnBeginTrain() 
{
	// TODO: Add your control notification handler code here
	
	UpdateData(TRUE);

	STHREADDATA* pData = new STHREADDATA;
	
	pData->pDlg = this;

	DWORD dwExitCode = 0;
	::GetExitCodeThread (m_hThread, &dwExitCode);
	
	if(dwExitCode == STILL_ACTIVE)
	{
		::MessageBox (this->m_hWnd, _T("程序中的训练线程仍然在运行中!"), _T("警告:"), MB_ICONWARNING | MB_OK);
		return;
	}

	ULONG	ulThreadID;

	m_hThread =	::CreateThread (NULL,
								0,
								WorkThreadProc,
								pData,
								CREATE_SUSPENDED,
								&ulThreadID
								);

	ResumeThread (m_hThread);

	
}

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here

	// "使用说明"按钮的资源的装入
	m_btnHelpDocument.SubclassDlgItem (IDI_HELP,this);
	m_btnHelpDocument.SetIcon ( IDI_HELP);
	m_btnHelpDocument.SetActiveBgColor (RGB(160,180,220));
	m_btnHelpDocument.SetInactiveBgColor (RGB(160,180,220));
	m_btnHelpDocument.AddToolTip (TEXT("使用说明"));
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


void CNNBPDlg::OnState() 
{
	// TODO: Add your control notification handler code here

	/////////////////////////////////////////////////////////////////////////
	// Change the button flag
	m_bSimulateDataFlag = !m_bSimulateDataFlag;

	if(m_bSimulateDataFlag)
	{
		// 程序处在数据仿真状态
		m_btnState.SetIcon (IDI_SIMULATOR);
		m_btnState.AddToolTip (TEXT("数据仿真状态"));

		// the BeginTrain Button State
		m_btnBeginTrain.AddToolTip(TEXT("开始仿真"));

		/////////////////////////////////////////////////////////////////////
		// Disabled the following controls
		/////////////////////////////////////////////////////////////////////
		(CNNBPDlg *)GetDlgItem(IDC_SYSTEM_LEVEL)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_MAX_TRAIN_TIMES)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_STEP)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_INPUT_LAYER_NUMBER)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_HIDE_LAYER_NUMBER)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_OUTPUT_LAYER_NUMBER)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_COMBO_TRAIN)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_COMBO_FUNC)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_DEMO_DATA_INPUT)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_DEMO_DATA_INPUT_BROWSER)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_DEMO_SAVE_NETWORK)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_DEMO_SAVE_NETWORK_BROWSER)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_DEMO_SAVE_RESULT)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_DEMO_SAVE_RESULT_BROWSER)->EnableWindow(FALSE);

		(CNNBPDlg *)GetDlgItem(IDC_STOP_TRAIN)->EnableWindow(FALSE);

		
		/////////////////////////////////////////////////////////////////////
		// Enabled the following controls
		/////////////////////////////////////////////////////////////////////
		(CNNBPDlg *)GetDlgItem(IDC_SIMU_NETWORK_FOLD)->EnableWindow(TRUE);

		(CNNBPDlg *)GetDlgItem(IDC_SIMU_NETWORK_FOLD_BROWSER)->EnableWindow(TRUE);

		(CNNBPDlg *)GetDlgItem(IDC_SIMU_DATA_INPUT)->EnableWindow(TRUE);

		(CNNBPDlg *)GetDlgItem(IDC_SIMU_DATA_INPUT_BROWSER)->EnableWindow(TRUE);

		(CNNBPDlg *)GetDlgItem(IDC_SIMU_RESULT)->EnableWindow(TRUE);

		(CNNBPDlg *)GetDlgItem(IDC_SIMU_RESULT_BROWSER)->EnableWindow(TRUE);

	}
	else
	{
		// 程序处在样本训练状态
		m_btnState.SetIcon (IDI_TRAINING);
		m_btnState.AddToolTip (TEXT("样本训练状态"));

		// the BeginTrain Button State 
		m_btnBeginTrain.AddToolTip(TEXT("开始训练"));

		/////////////////////////////////////////////////////////////////////
		// Disabled the following controls
		/////////////////////////////////////////////////////////////////////
		(CNNBPDlg *)GetDlgItem(IDC_SIMU_NETWORK_FOLD)->EnableWindow(FALSE);

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

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

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

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

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

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

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

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

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

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

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

		(CNNBPDlg *)GetDlgItem(IDC_COMBO_TRAIN)->EnableWindow(TRUE);

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

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

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

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

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

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

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

		(CNNBPDlg *)GetDlgItem(IDC_STOP_TRAIN)->EnableWindow(TRUE);


	}

	
}

bool CNNBPDlg::TrainingDemo()
{
	(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(FALSE);

	if(m_bSimulateDataFlag)
	{
		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;
	}

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

		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;
	}

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

		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;
	}

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

		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;
	}

	if(m_nComboArithmetic == -1)
	{
		::MessageBox (this->m_hWnd, _T("你还没有选取用来训练的算法!"), _T(":("), MB_OK | MB_ICONINFORMATION);
		
		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;
	}

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

		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;
	}

	if(m_strDemoDataInput.IsEmpty ())
	{
		::MessageBox (this->m_hWnd, _T("你还没选取用来训练的样本数据文件的装载路径!"), _T(":("), MB_OK | MB_ICONINFORMATION);

		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;
	}

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

		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;

	}

	if(m_strDemoSaveResult.IsEmpty ())
	{
		::MessageBox (this->m_hWnd, _T("你还没选取最终模拟输出结果的文件的存放路径!"), _T(":("), MB_OK | MB_ICONINFORMATION);
		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);
		return false;

	}

	// 装载资源
	m_matrixDemoDataInput.LoadDataFromFile (m_strDemoDataInput);


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

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

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

	if(bSuccess) // Successful!
	{
		
		//////////////////////////////////////////////////////////////////////////////
		//						定义存储矩阵格式									//
		//////////////////////////////////////////////////////////////////////////////

		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_strDemoDataInput = TEXT("");
		m_strDemoSaveNetwork = TEXT("");
		m_strDemoSaveResult = TEXT("");


		::MessageBox (this->m_hWnd, _T("任务完成了!"), _T("恭喜!"), MB_OK);

		(CNNBPDlg *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);

		//*******************************************************************
		// handle the UI
		//
		CString strSystemErrorLevel;
		strSystemErrorLevel.Format ("%lf", m_nSystemErrorLevel);
		HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SYSTEM_LEVEL);
		::SetWindowText (hWnd, (LPCTSTR)strSystemErrorLevel);

		CString strMaxTrainTimes;
		strMaxTrainTimes.Format ("%u", m_nMaxTrainTimes);
		hWnd = ::GetDlgItem (this->m_hWnd, IDC_MAX_TRAIN_TIMES);
		::SetWindowText (hWnd, (LPCTSTR)strMaxTrainTimes);

		hWnd = ::GetDlgItem (this->m_hWnd, IDC_INPUT_LAYER_NUMBER);
		::SetWindowText (hWnd, _T("0"));

		hWnd = ::GetDlgItem (this->m_hWnd, IDC_HIDE_LAYER_NUMBER);
		::SetWindowText (hWnd, _T("0"));

		hWnd = ::GetDlgItem (this->m_hWnd, IDC_OUTPUT_LAYER_NUMBER);
		::SetWindowText (hWnd, _T("0"));

⌨️ 快捷键说明

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