📄 nnmod.cpp
字号:
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 + -