📄 forecastdlg.cpp
字号:
m_strModel = dlg.GetPathName ();
LoadTag=LoadDataFromFile(m_strModel);
// HWND hWnd = ::GetDlgItem (this->m_hWnd,IDC_DEMO_DATA_INPUT);
// ::SetWindowText (hWnd,m_strDemoDataInput);
//zdh extern CString modelpath;
//zdh modelpath=m_strModel;
}
return;
}
bool CForecastDlg::LoadDataFromFile(CString &strFileName)
{
CStdioFile dataFile;
LPCTSTR lpszFileName="";
strFileName.TrimLeft ();
strFileName.TrimRight ();
lpszFileName = (LPCTSTR)strFileName;
// CStdioFile dataFile;
CString strData;
ColCnt=0;
int i=0;
TCHAR cFirstCharacter='#';
switch(nModelMethod)
{
case(0): //神经网络
// m_strSimuNetworkFold=strFileName;
strFileName=" "+strFileName;//接受文件路径名,加空格是为了能重复使用****必修加的哦
m_matrixSimuNetwork.LoadDataFromFileSpecial(strFileName,//用这个名字来接收路径
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerValveValue,
m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_nComboArithmetic,
m_nComboFunc);//这个函数已经成功取数
AfxMessageBox("已成功载入神经网络模型!");
return true;
break;
case(1):
if(!dataFile.Open (lpszFileName, CFile::modeRead | CFile::typeText))
{
::MessageBox(this->m_hWnd, _T("不能打开要读取的数据模型文件!"), _T("错误!"), MB_OK | MB_ICONERROR);
dataFile.Close ();
return false;
}
dataFile.SeekToBegin ();
// 存储提取文本文件中一行的数据
while(dataFile.ReadString(strData))
{
strData.TrimLeft();
strData.TrimRight();
if(strData.Find(cFirstCharacter)==0)
continue;
else if(strData.Find(cFirstCharacter)==-1)
{
if(ColCnt==0)
{
//dataFile.ReadString(strData);
//strData.TrimLeft();
//strData.TrimRight();
LPCSTR strCount=(LPCSTR)strData;
ColCnt=atoi(strCount);
}
else
{
LineCo=new double[ColCnt+1];
LPCSTR strDouble=(LPCSTR)strData;
LineCo[i]=atof(strDouble);
i++;
break;
}
}
}
while(i<=ColCnt && dataFile.ReadString(strData))
{
strData.TrimLeft();
strData.TrimRight();
LPCSTR strDouble=(LPCSTR)strData;
LineCo[i]=atof(strDouble);
i++;
}
if(ColCnt==0||dataFile.ReadString(strData))
{
AfxMessageBox("信息不足或是文件保存格式不正确!");
return false;
}
AfxMessageBox("已成功载入线性回归模型!");
return true;
break;
default:
// AfxMessageBox("请选择建模方法!");
return false;
}
}
void CForecastDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(true);
if(m_ColStart>m_ColEnd)
{
AfxMessageBox("数据列范围输入有误!");
return;
}
if(!LoadTag)
{
AfxMessageBox("尚未载入新模型!");
return;
}
m_ForecastList.DeleteAllItems();
CString str;
CDaoTableDef td(&m_Db);
CDaoFieldInfo fi;
COleVariant var;
// double* Result;
// int ItemCnt;
td.Open(tn);
if(m_set.IsOpen())
{
m_set.Close();
}
m_set.Open(&td);
m_set.MoveLast();
ItemCnt=m_set.GetRecordCount();
Result=new double[ItemCnt];
if(m_Check==1)
RealResult=new double[ItemCnt];
m_set.MoveFirst();
int jjj,z,iii;
double ss;
switch(nModelMethod)
{
case(0):
{
if( (m_ColEnd-m_ColStart+1)!= m_nInputLayerNumber )
{
/* m_matrixSimuNetwork.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
*/ AfxMessageBox("待仿真数据文件的输入层数目与网络中的输入层数目不相等!!!");
// return false;
}
else // Successful!!!
{
// 装载神经网络的变量数据每次装载一行
m_matrixDemoDataInput.m_nRow=1;//ItemCnt;//为了我下面能利用行数和列数,我把m_nRow和m_nCol在定义时改为public型了
m_matrixDemoDataInput.m_nCol=m_ColEnd-m_ColStart+1;;
m_matrixDemoDataInput.m_pTMatrix.resize(1);//ItemCnt
m_matrixDemoDataInput.m_pTMatrix[0].resize(m_ColEnd-m_ColStart+1);
m_bSimulateDataFlag=true;//zdh给仿真标志位
for(jjj=0;jjj<ItemCnt;jjj++)
{
for(z=0,iii=m_ColStart;z<(m_ColEnd-m_ColStart+1);z++)
{
m_set.GetFieldValue(iii,var);
m_matrixDemoDataInput.m_pTMatrix[0][z]=var.dblVal;
iii++;//给矩阵赋值
}
switch(m_nComboArithmetic)
{
case 0: // LM Arithmetic Selected
LMForwardCalculate( m_nInputLayerNumber,
m_nHideLayerNumber,
m_nOutputLayerNumber,
m_bSimulateDataFlag,//1, //表示仿真的标志位,置1是处于仿真状态
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,//1,
m_nComboFunc,
m_matrixDemoDataInput,
m_matrixInputLayerValue,
m_matrixInputToHideWeightValue,
m_matrixHideLayerValveValue,
m_matrixHideLayerOutput,
m_matrixHideToOutputWeightValue,
m_matrixOutputLayerOutput,
m_matrixOutputLayerValveValue
);
break;
default:
AfxMessageBox("对不起,这里只有BP和LM算法,没有你模型里的!!!");
break;
}
// 返回模拟结果
ss=m_matrixOutputLayerOutput.m_pTMatrix[0][0];
//显示在屏幕上
m_ForecastList.InsertItem(jjj,"");
str.Format("Output'[%d]",jjj);
m_ForecastList.SetItemText(jjj,0,str);
Result[jjj]=ss;
//str.Format("%f",Result[jj]);
str.Format("%f",ss);
m_ForecastList.SetItemText(jjj,1,str);
if(m_Check==1)
{
m_set.GetFieldValue(m_ResultCol,var);
str.Format("%f",var.dblVal);
RealResult[jjj]=var.dblVal;
m_ForecastList.SetItemText(jjj,2,str);
}
for(int z=0;z<(m_ColEnd-m_ColStart+1);z++)
{
m_matrixDemoDataInput.m_pTMatrix[0][z]=(double) 0;//给矩阵初始化
}
m_matrixOutputLayerOutput.m_pTMatrix[0][0]=(double) 0;//给输出矩阵清零
m_matrixHideLayerOutput.InitializeZero ();
m_set.MoveNext(); //读数据库的下一行数据
}
}
// 释放全局变量所占的内
m_matrixSimuNetwork.InitializeZero ();
m_matrixInputToHideWeightValue.InitializeZero ();
m_matrixHideLayerValveValue.InitializeZero ();
m_matrixHideToOutputWeightValue.InitializeZero ();
m_matrixOutputLayerValveValue.InitializeZero ();
m_nComboFunc = -1;
m_nInputLayerNumber = 0;
m_nHideLayerNumber = 0;
m_nOutputLayerNumber = 0;
}
break;
case(1)://多元线性回归
{
if(ColCnt!=(m_ColEnd-m_ColStart+1))
{
AfxMessageBox("预测数据样本与载入模型不匹配!");
return;
}
/* td.Open(tn);
if(m_set.IsOpen())
m_set.Close();
m_set.Open(&td);*/
if(m_ColEnd>=m_set.GetFieldCount())
{
AfxMessageBox("数据列范围越界!");
return;
}
m_set.MoveFirst();
int i;
int j,k;
double y;
j=0;
// k=0;
while(!m_set.IsEOF() && ItemCnt>0)
{
y=0;
k=0;
for(i=m_ColStart;i<=m_ColEnd;i++)
{
m_set.GetFieldValue(i,var);
y+=(var.dblVal)*(LineCo[k]);
k++;
}
y+=LineCo[k];
Result[j]=y;
m_ForecastList.InsertItem(j,"");
str.Format("Output'[%d]",j);
m_ForecastList.SetItemText(j,0,str);
str.Format("%f",Result[j]);//y
m_ForecastList.SetItemText(j,1,str);
if(m_Check==1)
{
m_set.GetFieldValue(m_ResultCol,var);
RealResult[j]=var.dblVal;
str.Format("%f",var.dblVal);
m_ForecastList.SetItemText(j,2,str);
}
m_set.MoveNext();
j++;
ItemCnt--;
}
UpdateData(false);
delete []LineCo;
}
break;
default:
break;
}
// delete []Result;
LoadTag=false;
ForecastTag=true;
ItemCnt=m_set.GetRecordCount();
// CDialog::OnOK();
}
void CForecastDlg::OnCancel()
{
// TODO: Add extra cleanup here
if(ItemCnt!=0)
delete []Result;
if(m_Check==1 && ItemCnt!=0)
delete []RealResult;
CDialog::OnCancel();
}
BOOL CForecastDlg::OnInitDialog()
{
CDialog::OnInitDialog();
InitChart();
// TODO: Add extra initialization here
CWnd*pWndButn;
pWndButn=GetDlgItem(IDC_RESULTCHECK);
pWndButn->EnableWindow(TRUE);
CButton *pBtn=(CButton*)GetDlgItem(IDC_RESULTCHECK);
pBtn->SetCheck(0);
pWndButn=GetDlgItem(IDC_RESULTCOL);
pWndButn->EnableWindow(FALSE);
m_ForecastList.DeleteAllItems();
m_ForecastList.SetExtendedStyle(LVS_EX_GRIDLINES);//为List添加表格
m_ForecastList.InsertColumn(0,"",LVCFMT_LEFT,100);
m_ForecastList.InsertColumn(1,"预测结果",LVCFMT_LEFT,200);
ItemCnt=0;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CForecastDlg::OnCancelMode()
{
CDialog::OnCancelMode();
// TODO: Add your message handler code here
}
/*
void CForecastDlg::OnCaptureChanged(CWnd *pWnd)
{
// TODO: Add your message handler code here
CDialog::OnCaptureChanged(pWnd);
}*/
void CForecastDlg::OnResultcheck()
{
// TODO: Add your control notification handler code here
UpdateData();
CWnd*pWndButn;
pWndButn=GetDlgItem(IDC_RESULTCHECK);
if(m_Check==1)
{
pWndButn->EnableWindow(TRUE);
pWndButn=GetDlgItem(IDC_RESULTCOL);
pWndButn->EnableWindow(TRUE);
// if(m_ResultCol>0)
m_ForecastList.InsertColumn(2,"实际结果",LVCFMT_LEFT,200);
}
else
{
pWndButn->EnableWindow(FALSE);
pWndButn=GetDlgItem(IDC_RESULTCOL);
pWndButn->EnableWindow(FALSE);
m_ForecastList.DeleteColumn(2);
}
}
void CForecastDlg::OnCurve()
{
// TODO: Add your control notification handler code here
if(!ForecastTag)
{
AfxMessageBox("尚未进行预测!");
return;
}
int i;
double max,min;
max=Result[0];
min=Result[0];
for (i=0;i<ItemCnt;i++)
{
if(Result[i]>max)
max=Result[i];
if(m_Check==1)
if(RealResult[i]>max)
max=RealResult[i];
if(Result[i]<min)
min=Result[i];
if(m_Check==1)
if(RealResult[i]<min)
min=RealResult[i];
}
/* if(min<0)
min=2*min;
else min=min/2;*/
int nLabel;
if(ItemCnt<=10)
nLabel=1;
else
{
if(ItemCnt<=50)
nLabel=5;
else
{
if(ItemCnt<=100)
nLabel=10;
else
{
if(ItemCnt<=500)
nLabel=50;
else nLabel=100;
}
}
}
InitChart();
m_Chart.SetRowCount(ItemCnt);
VARIANT var;
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(max); // Y轴最大刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(min);// Y轴最小刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(10); // Y轴刻度10等分
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线
m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("数值"); // Y轴名称
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetAuto(FALSE); // 不自动标注X轴刻度
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerLabel(nLabel);// 每50刻度一个标注
m_Chart.GetPlot().GetAxis(0,var).GetCategoryScale().SetDivisionsPerTick(nLabel); // 每10刻度一个刻度线
m_Chart.GetPlot().GetAxis(0,var).GetAxisTitle().SetText("样本"); // X轴名称
for(int row = 1; row <= ItemCnt; ++row)
{
m_Chart.SetRow(row);
m_Chart.GetDataGrid().SetData(row, 1, Result[row-1], 0);
if(m_Check==1)
{
m_Chart.GetDataGrid().SetData(row, 2,RealResult[row-1], 0);
}
}
m_Chart.Refresh();
ForecastTag=false;
}
void CForecastDlg::InitChart()
{
// 设置标题
// m_Chart.SetTitleText("拟合结果显示");
// 下面两句改变背景色
m_Chart.GetBackdrop().GetFill().SetStyle(1);
m_Chart.GetBackdrop().GetFill().GetBrush().GetFillColor().Set(255, 255, 255);
// 栈模式
m_Chart.SetStacking(FALSE);
// Y轴设置
/* VARIANT var;
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetAuto(FALSE); // 不自动标注Y轴刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMaximum(1); // Y轴最大刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinimum(-1);// Y轴最小刻度
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMajorDivision(10); // Y轴刻度10等分
m_Chart.GetPlot().GetAxis(1,var).GetValueScale().SetMinorDivision(1); // 每刻度一个刻度线
m_Chart.GetPlot().GetAxis(1,var).GetAxisTitle().SetText("数值"); // Y轴名称
*/
// 1条曲线
if(m_Check==0)
{
m_Chart.SetColumnCount(1);
// 线色
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);
// 线宽(对点线图有效)
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(2);
// 数据点类型显示数据值的模式(对柱柱状图和点线图有效)
// 0: 不显示 1: 显示在柱状图外
// 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(0);
}
else
{
m_Chart.SetColumnCount(2);
// 线色
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().GetVtColor().Set(0, 0, 255);
m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().GetVtColor().Set(255, 0, 0 );
// 线宽(对点线图有效)
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetPen().SetWidth(2);
m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetPen().SetWidth(2);
// 数据点类型显示数据值的模式(对柱柱状图和点线图有效)
// 0: 不显示 1: 显示在柱状图外
// 2: 显示在柱状图内上方 3: 显示在柱状图内中间 4: 显示在柱状图内下方
m_Chart.GetPlot().GetSeriesCollection().GetItem(1).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(0);
m_Chart.GetPlot().GetSeriesCollection().GetItem(2).GetDataPoints().GetItem(-1).GetDataPointLabel().SetLocationType(0);
}
// 显示图例
m_Chart.SetShowLegend(TRUE);
m_Chart.SetColumn(1);
m_Chart.SetColumnLabel((LPCTSTR)"预测结果 ");
if(m_Check==1)
{
m_Chart.SetColumn(2);
m_Chart.SetColumnLabel((LPCTSTR)"实际结果 ");
}
m_Chart.SetChartType(3);
m_Chart.SetRowCount(1);
m_Chart.GetDataGrid().SetData(1, 1, 0, 0);
m_Chart.Refresh();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -