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

📄 nnmod.cpp

📁 vc编程实现bp神经网络
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		(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);

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


	}

	
}

void CNNMod::OnStopTrain() 
{
	// TODO: Add your control notification handler code here
	DWORD dwExitCode = 0;
	::GetExitCodeThread (m_hThread, &dwExitCode);
	
	if(dwExitCode == STILL_ACTIVE)
	{
		::TerminateThread (m_hThread, (DWORD)0);

		CloseHandle (m_hThread);
		m_hThread = NULL;

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

		hWnd = ::GetDlgItem (this->m_hWnd, IDC_TRAIN_TIMES);
		::SetWindowText (hWnd, _T("0"));
	}
//zdh
        (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);

		(CNNMod *)GetDlgItem(IDC_STOP_TRAIN)->EnableWindow(TRUE);
       
		(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(TRUE);//使得状态这个按钮可操作
//zdh


}




void CNNMod::ForwardCalculateInit()
{
	LMForwardCalculateInit( m_nInputLayerNumber,
							m_nHideLayerNumber,
							m_nOutputLayerNumber,
							m_matrixDemoDataInput,
							m_matrixInputLayerValue,
							m_matrixInputToHideWeightValue,
							m_matrixHideLayerValveValue,
							m_matrixHideToOutputWeightValue,
							m_matrixOutputLayerValveValue
							);	
	
}

bool CNNMod::DemoDataTrainRepeat()
{
	bool	bReturn = false;

	switch( m_nComboArithmetic)
	{
	case 0: // LM Arithmetic Selected
		bReturn = LMDemoDataTrainRepeat (	m_nInputLayerNumber,
											m_nHideLayerNumber,
											m_nOutputLayerNumber,
											m_bSimulateDataFlag,
											m_nComboFunc,
											m_SystemErrorOld,
											m_SystemErrorNew,
											m_nSystemErrorLevel,
											m_nSystemError,
											m_nStep,
											m_nMaxTrainTimes,
											m_nTrainTimes,
											IDC_SYSTEM_ERROR,
											IDC_TRAIN_TIMES,
											this->m_hWnd,
											m_matrixDemoDataInput,
											m_matrixInputLayerValue,
											m_matrixInputToHideWeightValue,
											m_matrixHideLayerValveValue,
											m_matrixHideLayerOutput,
											m_matrixHideToOutputWeightValue,
											m_matrixOutputLayerOutput,
											m_matrixOutputLayerValveValue
										);

		break;


	case 1: // BP Arithmetic Selected
		bReturn = BPDemoDataTrainRepeat (	m_nInputLayerNumber,
											m_nHideLayerNumber,
											m_nOutputLayerNumber,
											m_bSimulateDataFlag,
											m_nComboFunc,
											m_SystemErrorOld,
											m_SystemErrorNew,
											m_nSystemErrorLevel,
											m_nSystemError,
											m_nStep,
											m_nMaxTrainTimes,
											m_nTrainTimes,
											IDC_SYSTEM_ERROR,
											IDC_TRAIN_TIMES,
											this->m_hWnd,
											m_matrixDemoDataInput,
											m_matrixInputLayerValue,
											m_matrixInputToHideWeightValue,
											m_matrixHideLayerValveValue,
											m_matrixHideLayerOutput,
											m_matrixHideToOutputWeightValue,
											m_matrixOutputLayerOutput,
											m_matrixOutputLayerValveValue
										 );

		break;

	default: // No Arithmetic Selected
		return bReturn;

	}

	return bReturn;

}

bool CNNMod::SaveConstantStringToFile(CString& strFileName,CString& strConstantData)
{

	// Convert CString to LPCTSTR 
	LPCTSTR	lpszFileName = "";
			
	strFileName.TrimLeft ();
	strFileName.TrimRight ();
	lpszFileName = (LPCTSTR)strFileName;

	CStdioFile dataFile;

	if(!dataFile.Open (lpszFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::typeText))
	{
		::MessageBox(this->m_hWnd, _T("不能创建存储网络参数的文件!"), _T("错误!"), MB_OK | MB_ICONERROR);
		dataFile.Close ();
		return FALSE;
	}

	dataFile.SeekToEnd ();

	// Write data into the file
	char *pBuffer = new char[strConstantData.GetLength ()];

	memcpy(pBuffer,strConstantData,strConstantData.GetLength ());

	dataFile.Write (pBuffer,strConstantData.GetLength ());

	dataFile.Close ();
	return TRUE;

}

bool CNNMod::SimulateData()
{
	(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(FALSE);

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

	if(m_strSimuNetworkFold.IsEmpty ())
	{
		::MessageBox (this->m_hWnd, _T("你还没选取提供网络参数的文件的装载路径!"), _T(":("),MB_OK | MB_ICONWARNING);

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

	if(m_strSimuDataInput.IsEmpty ())
	{
		::MessageBox (this->m_hWnd, _T("你还没选取用来仿真的数据文件的装载路径!"), _T(":("),MB_OK | MB_ICONWARNING);

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

	if(m_strSimuResult.IsEmpty ())
	{
		::MessageBox (this->m_hWnd, _T("你还没选取最终仿真结果的数据文件的存放路径!"), _T(":("),MB_OK | MB_ICONWARNING);

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

	// 装载网络参数文件
	m_matrixSimuNetwork.LoadDataFromFileSpecial(m_strSimuNetworkFold,//路径
												m_matrixInputToHideWeightValue,
												m_matrixHideLayerValveValue,
												m_matrixHideToOutputWeightValue,
												m_matrixOutputLayerValveValue,
												m_nInputLayerNumber,
												m_nHideLayerNumber,
												m_nOutputLayerNumber,
												m_nComboArithmetic,
												m_nComboFunc);
	


	// 装载仿真数据文件
	m_matrixDemoDataInput.LoadDataFromFile (m_strSimuDataInput);


	if( m_matrixDemoDataInput.GetMatrixColNumber () != m_nInputLayerNumber )
	{
		::MessageBox (this->m_hWnd, _T("待仿真数据文件的输入层数目与网络中的输入层数目不相等!!!"), _T("错误!"), MB_OK | MB_ICONERROR);

		// 释放全局变量所占的内存
		m_matrixSimuNetwork.InitializeZero ();

		m_matrixInputToHideWeightValue.InitializeZero ();
		m_matrixHideLayerValveValue.InitializeZero ();
		m_matrixHideToOutputWeightValue.InitializeZero ();
		m_matrixOutputLayerValveValue.InitializeZero ();

		m_matrixDemoDataInput.InitializeZero ();

		m_strSimuNetworkFold = TEXT("");
		m_strSimuDataInput = TEXT("");
		m_strSimuResult = TEXT("");
		

		m_nInputLayerNumber	= 0;
		m_nHideLayerNumber = 0;
		m_nOutputLayerNumber = 0;

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

		//*******************************************************************
		// Update the UI
		//
		HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_NETWORK_FOLD);
		::SetWindowText (hWnd, _T(""));

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

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

		return false;

	}
	else // Successful!!!
	{
		// 前向计算
		switch(m_nComboArithmetic)
		{
		case 0: // LM Arithmetic Selected
			LMForwardCalculate( m_nInputLayerNumber,
								m_nHideLayerNumber,
								m_nOutputLayerNumber,
								m_bSimulateDataFlag,
								m_nComboFunc,
								m_matrixDemoDataInput,
								m_matrixInputLayerValue,
								m_matrixInputToHideWeightValue,
								m_matrixHideLayerValveValue,
								m_matrixHideLayerOutput,
								m_matrixHideToOutputWeightValue,
								m_matrixOutputLayerOutput,
								m_matrixOutputLayerValveValue
							 );

			break;

		case 1: // BP Arithmetic Selected
			BPForwardCalculate2(m_nInputLayerNumber,
								m_nHideLayerNumber,
								m_nOutputLayerNumber,
								m_bSimulateDataFlag,
								m_nComboFunc,
								m_matrixDemoDataInput,
								m_matrixInputLayerValue,
								m_matrixInputToHideWeightValue,
								m_matrixHideLayerValveValue,
								m_matrixHideLayerOutput,
								m_matrixHideToOutputWeightValue,
								m_matrixOutputLayerOutput,
								m_matrixOutputLayerValveValue
							 );

			break;

		default: // No Arithmetic Selected
			return false;

		}



		// 存储模拟结果
		(m_matrixOutputLayerOutput.Transpose()).SaveDataToFile(m_strSimuResult);


		// 释放全局变量所占的内存
		m_matrixSimuNetwork.InitializeZero ();

		m_matrixInputToHideWeightValue.InitializeZero ();
		m_matrixHideLayerValveValue.InitializeZero ();
		m_matrixHideToOutputWeightValue.InitializeZero ();
		m_matrixOutputLayerValveValue.InitializeZero ();

		m_matrixDemoDataInput.InitializeZero ();

		m_matrixHideLayerOutput.InitializeZero ();
		m_matrixOutputLayerOutput.InitializeZero ();

		m_strSimuNetworkFold = _T("");
		m_strSimuDataInput = _T("");
		m_strSimuResult = _T("");
		
		m_nComboFunc = -1;

		m_nInputLayerNumber	= 0;
		m_nHideLayerNumber = 0;
		m_nOutputLayerNumber = 0;
		
		::MessageBox (this->m_hWnd, _T("数据仿真结果保存成功!"), _T("恭喜!"), MB_OK);

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

		//*******************************************************************
		// Update the UI
		//
		HWND hWnd = ::GetDlgItem (this->m_hWnd, IDC_SIMU_NETWORK_FOLD);
		::SetWindowText (hWnd, _T(""));

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

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

	}


	return true;

}
bool CNNMod::TrainingDemo()//bool CNNMod::Trainingzdh()
{
	
	(CNNMod *)GetDlgItem(IDC_STATE)->EnableWindow(FALSE);

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

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

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

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

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

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

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

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

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

⌨️ 快捷键说明

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