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

📄 forecastdlg.cpp

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