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

📄 bpnetdlg.cpp

📁 有届面的BP算法软件.操作简单
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                    flaghand3=TRUE;
                    Invalidate();


			  	for(int m=0;m<N;m++)
					{
	                       	for(int i=0;i<IN1;i++)
							{
		                      	GetWorkData>>Work_Data[m].input[i];  //取得输入数据
							}
	                       	for(int j=0;j<ON;j++)
							{
		                      	GetWorkData>>Work_Data[m].teach[j];  //取得输出数据
							}
					}
				GetWorkData.close();

		  }
                 else 
				 {        AfxMessageBox("请载入泛化样本!!!");
                        
                           buttonflag5=FALSE;
                             return;
				 }
				 
                      
					
					
					for(int ii=0;ii<IN1;ii++)
					{
						fanhuainputmax[ii]=Work_Data[0].input[ii];
						fanhuainputmin[ii]=Work_Data[0].input[ii];
					
					}
		              for(int jj=0;jj<ON;jj++)
					  {
			              fanhuateachmax[jj]=Work_Data[0].teach[jj];  
						  fanhuateachmin[jj]=Work_Data[0].teach[jj];
					  }


////////以下是找到泛化样本的最大最小值
					for(int m=0;m<N;m++)
					   {

						   for(int ii=0;ii<IN1;ii++)
						   {
							   if(Work_Data[m].input[ii]>=fanhuainputmax[ii])
								   fanhuainputmax[ii]=Work_Data[m].input[ii];

                               if(Work_Data[m].input[ii]<=fanhuainputmin[ii])
								   fanhuainputmax[ii]=Work_Data[m].input[ii];
						   }

				         for(int jj=0;jj<ON;jj++)
						 {
							 if(Work_Data[m].teach[jj]>=fanhuateachmax[jj])
								 fanhuateachmax[jj]=Work_Data[m].teach[jj];

							  if(Work_Data[m].teach[jj]<=fanhuateachmin[jj])
								 fanhuateachmin[jj]=Work_Data[m].teach[jj];

						 }
						   
						   
						   
					   }
////////以上是找到泛化样本的最大最小值



//////以下找到两个样本中的最大最小值

					for(int i=0;i<IN1;i++)
					{
						if(traininputmax[i]<fanhuainputmax[i])
							traininputmax[i]=fanhuainputmax[i];

						if(traininputmin[i]>fanhuainputmin[i])
							traininputmin[i]=fanhuainputmin[i];
					}


						for(i=0;i<ON;i++)
					{
						if(trainteachmax[i]<fanhuateachmax[i])
							trainteachmax[i]=fanhuateachmax[i];

						if(trainteachmin[i]>fanhuateachmin[i])
							trainteachmin[i]=fanhuateachmin[i];
					}

//////以上找到两个样本中的最大最小值






///////开始调整数据

				for(m=0;m<N;m++)
				{
	                       	for(i=0;i<IN1;i++)
							{

							  Study_Data[m].input[i]=(Study_Data[m].input[i]-traininputmin[i])/(traininputmax[i]-traininputmin[i]);

		                      Work_Data[m].input[i]=(Work_Data[m].input[i]-traininputmin[i])/(traininputmax[i]-traininputmin[i]);  //取得输入数据
							}
	                       	for(int j=0;j<ON;j++)
							{
								
								
								{
									 Study_Data[m].teach[j]=(Study_Data[m].teach[j]-trainteachmin[j])/(trainteachmax[j]-trainteachmin[j]);
								}
							
								
								{
									Work_Data[m].teach[j]=(Work_Data[m].teach[j]-trainteachmin[j])/(trainteachmax[j]-trainteachmin[j]);
								}


		                    
								  //取得输出数据
							}


				}

		  }
 
	
    flaghand3=TRUE;
   flaghand2=FALSE;
   Invalidate();



}

void CBPnetDlg::OnInitial() 
{
	 flaghand3=FALSE;

	
	//隐层权、阈值初始化//	

    if(buttonflag2==FALSE)
	{
		 AfxMessageBox("请先载入数据!");
		 return;
	}
	 else
	 {
		flaghand4=TRUE;

		SetTimer(1,500,NULL);
	srand( (unsigned)time( NULL ) );

	for(int i=0;i<HN;i++)
	{
		for(int j=0;j<IN1;j++)
			
		{	W[i][j]= (double)((rand()/32767.0)*2-1); //初始化输入层到隐层的权值,随机模拟0 和 1 -1	
            Winitial[i][j]=W[i][j];
			old_W[i][j]=W[i][j];
		
		}	

	}

	for(int ii=0;ii<ON;ii++)
	{
		for(int jj=0;jj<HN;jj++)
		{	V[ii][jj]= (double)((rand()/32767.0)*2-1); //初始化隐层到输出层的权值,随机模拟0 和 1 -1
            Vinitial[ii][jj]=V[ii][jj];
		    old_V[ii][jj]=V[ii][jj];
		  
	
		}

	}
	for(int k=0;k<HN;k++)
	{
			 YU_HN[k] = (double)((rand()/32888.0)*2-1);//隐层阈值初始化 ,-0.01 ~ 0.01 之间
             YU_HNinitial[k]=YU_HN[k];	   
	}

	for(int kk=0;kk<ON;kk++)
	{
		YU_ON[kk] = (double)((rand()/32888.0)*2-1); //输出层阈值初始化 ,-0.01 ~ 0.01 之间
     	YU_ONinitial[kk]=YU_ON[kk];
	}
    	Flagpicture=1;

		Invalidate();
		buttonflag3=TRUE;


	 }
}

void CBPnetDlg::OnTrain() 
{  
  
	   for(int i=0;i<100;i++)
	   {
		    err[i]=0;
			errwork[i]=0;
	   }
	       flagerrpicture=TRUE;
         	flagdynamic=TRUE;
	     if(buttonflag3==FALSE)
		 {
	         	AfxMessageBox("请先初使化网络!");
	         	return;
		 }
	      else
			  {
			 


             	buttonflag4=TRUE;
             	Flagpicture=0;//  标志位,使初使化数据消失
	
             	KillTimer(1);// 使初使化闪烁效果消失

				 clear1();
				 clear2();
				  clear3();
				  clear4();
 
 
 
                         do
						 {

	                         ++study;


                                for (int m=0;m<N;m++) 
								{
                                  intput_P(m); //输入第m个学习样本 (2)

                                    intput_T(m);//输入第m个样本的教师信号 (3)

									input_Pwork(m);
									input_Twork(m);
                                   

                                  

                                      H_I_O(); //第m个学习样本隐层各单元输入、输出值 (4)
                                      O_I_O(); //第m个学习样本输出层各单元输入、输出值 (5)
									  H_I_Owork();
                                      O_I_Owork();

                                  
                                  
                                     Err_O_H(m); //第m个学习样本输出层至隐层一般化误差 (6) 
                                     Err_O_Hwork(m);

                                      Err_H_I(); //第m个学习样本隐层至输入层一般化误差 (7)


                                        Delta_O_H(m,study); //第m个学习样本输出层至隐层权阈值调整、修改 (8)



                                        Delta_H_I(m,study); //第m个学习样本隐层至输入层权阈值调整、修改 (9)




                                      c+=err[m];
									  cwork+=errwork[m];
                                  
                                      saveWV();

	
								}



						 //全部样本训练完毕
                  cwork=cwork/Nfanhua;
                   c=c/N;  


                  cerror[study]=c;
                  cerrorwork[study]=cwork;


                 errworkpicture();
                   errpicture();
       if(f2==0)
	   {
	         	if(c<=wucha)
				{
	                 break;
				}

	   }

       if(f2==1)
	   {
	          if(study>=times)
			  {
	         break;
			  }
	   }




         if(f2==2)
		 {

                if(c<=wucha)
				{
	          break;
				}
  

              if(study>=times)
			  {
	         break;
			  }
		 }

c=0;
cwork=0; 

						 } while (1); 
  

                         

	flaghand6=TRUE;
	flaghand4=FALSE;

    Invalidate();

		  }
	
}


HBRUSH CBPnetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	if(pWnd->GetDlgCtrlID()==IDC_1)
	{pDC->SetTextColor(RGB(255,255,255));
	pDC->SetBkMode(TRANSPARENT);

		return m_brush;

	}

	if(pWnd->GetDlgCtrlID()==IDC_2)
	{pDC->SetTextColor(RGB(255,255,255));
	pDC->SetBkMode(TRANSPARENT);

		return m_brush;

	}

	if(pWnd->GetDlgCtrlID()==IDC_3)
	{pDC->SetTextColor(RGB(255,255,255));
	pDC->SetBkMode(TRANSPARENT);

		return m_brush;

	}
	if(pWnd->GetDlgCtrlID()==IDC_EDIT1)
	{
	pDC->SetBkMode(TRANSPARENT);
	return m_brush2;
	}


  
		if(pWnd->GetDlgCtrlID()==IDC_EDIT3)
	{
	pDC->SetBkMode(TRANSPARENT);
	return m_brush2;
	}



		if(pWnd->GetDlgCtrlID()==IDC_EDIT2)
	{
	pDC->SetBkMode(TRANSPARENT);
	return m_brush2;
	}
		
		if(pWnd->GetDlgCtrlID()==IDC_EDIT4)
	{
	pDC->SetBkMode(TRANSPARENT);
	return m_brush2;
	}

		if(pWnd->GetDlgCtrlID()==IDC_EDIT5)
	{
	pDC->SetBkMode(TRANSPARENT);
	return m_brush2;
	}
		if(pWnd->GetDlgCtrlID()==IDC_EDIT6)
	{
	pDC->SetBkMode(TRANSPARENT);
	return m_brush2;
	}
	



	return m_brush;
}





void CBPnetDlg::OnSet() 
{

	  N=50;
      Nfanhua=50;
      CSetDlg dlg;
     dlg.m_a=a1;
     dlg.m_b=b1;
     dlg.m_alp=alpha;
     dlg.m_in=aa;
     dlg.m_on=cc;
     dlg.m_hn=bb;


    if(dlg.DoModal()==IDOK)

	{
		    flaghand2=TRUE;
		    flaghand1=FALSE;
	    	buttonflag1=TRUE;
	        HN=dlg.m_hn;
            ON=dlg.m_on;
	        IN1=dlg.m_in;
	        a1=dlg.m_a;
	        b1=dlg.m_b;
	        alpha=dlg.m_alp;
	        Pre_error=dlg.Pre_error;

 
	}	
        	Flagpicture=0;
        	Invalidate();
	 
}







void CBPnetDlg::picture1()
{  
	      CPaintDC dc(this);
          pWnd = GetDlgItem(IDC_EDIT2);
	
          pDC = pWnd->GetDC();
          pWnd->Invalidate();
	      pWnd->UpdateWindow();


		  pDC->TextOut(0,45,"输入层神经元个数:");
          pDC->TextOut(0,70,"隐层神经元个数:");
          pDC->TextOut(0,95,"输出层神经元个数:");
		  pDC->TextOut(0,165,"输出层至隐层的学习效率:");
		  pDC->TextOut(0,190,"输出层至隐层的学习效率:");
		  pDC->TextOut(0,220,"动量因子:");

    
		  CString str1,str2,str3,str4,str5,str6;
		  str1.Format("%d",aa);
		  str2.Format("%d",bb);
		  str3.Format("%d",cc);
		  str4.Format("%.1f",a1);
		  str5.Format("%.1f",b1);
		  str6.Format("%.1f",alpha);

		  pDC->TextOut(150,45,str1);
		  pDC->TextOut(150,70,str2);
		  pDC->TextOut(150,95,str3);
		  pDC->TextOut(200,165,str4);
		  pDC->TextOut(200,190,str5);
		  pDC->TextOut(200,220,str6);
		  CFont font;
          font.CreatePointFont(200,"黑体",NULL);
          pDC->SelectObject(&font);
          pDC->SetTextColor(RGB(255,0,0));
 
	      pDC->TextOut(25,0,"神经元网络结构");

          pDC->TextOut(25,120,"神经元网络参数"); 
}






void CBPnetDlg::picture2()

{

        pWnd = GetDlgItem(IDC_EDIT3);
	
        pDC = pWnd->GetDC();
        pWnd->Invalidate();
    	pWnd->UpdateWindow();
		pDC->SetTextColor(RGB(250,0,0));
    	pDC->TextOut(0,0,"输入层至隐层权值:");
	

	   CString   str[10][10];
	   for(int i=0;i<HN;i++)
	   {
	     	for(int j=0;j<IN1;j++)
			
			{	str[i][j].Format("%.2f",Winitial[i][j]);
     
                 pDC->TextOut(i*40,20+20*j,str[i][j]);
			}			

	   }

	
}

void CBPnetDlg::picture3()
{
    pWnd = GetDlgItem(IDC_EDIT4);

    pDC = pWnd->GetDC();
    pWnd->Invalidate();
	pWnd->UpdateWindow();
	pDC->SetTextColor(RGB(250,0,0));
	pDC->TextOut(0,0,"隐层至输出层权值:");
	
	CString   str[10][10];
	for(int i=0;i<ON;i++)
	{
		for(int j=0;j<HN;j++)
		{
			str[i][j].Format("%.2f",Vinitial[i][j]);
			pDC->TextOut(i*40,20+20*j,str[i][j]);
		}
	}

}

void CBPnetDlg::picture4()
{
   	    pWnd = GetDlgItem(IDC_EDIT5);

        pDC = pWnd->GetDC();
        pWnd->Invalidate();
    	pWnd->UpdateWindow();
		pDC->SetTextColor(RGB(250,0,0));
    	pDC->TextOut(0,0,"隐层阈值:");
	    CString str[10];
	    for(int k=0;k<HN;k++)
		{
		str[k].Format("%.2f",YU_HNinitial[k]);
		pDC->TextOut(0,20+20*k,str[k]);
	
		
		
		}

}

void CBPnetDlg::picture5()
{
      pWnd = GetDlgItem(IDC_EDIT6);

      pDC = pWnd->GetDC();
      pWnd->Invalidate();
	  pWnd->UpdateWindow();
	  pDC->SetTextColor(RGB(250,0,0));
   	  pDC->TextOut(0,0,"输出层阈值:");
	  CString str[10];
	 for(int k=0;k<ON;k++)
	 {
		str[k].Format("%.2f",YU_ONinitial[k]);
		pDC->TextOut(0,20+20*k,str[k]);

	 }


}



void CBPnetDlg::introducepicture()
{

	
    pWnd = GetDlgItem(IDC_INTRODUCE);

    pDC = pWnd->GetDC();
    pWnd->Invalidate();
	pWnd->UpdateWindow();
	CRect rect;
	pWnd-> GetClientRect(rect);
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(RGB(120,192,255));
	pDC->SelectObject(&font3);
	pDC->TextOut(0,0,"作者:张学进    信研0501");
	pDC->TextOut(0,20,"关于神经元网络的BP算法");

}








void CBPnetDlg::OnTimer(UINT nIDEvent) 
{


if(nIDEvent==1)	
{


	
	static int a=0;
a++;


if(a==4)
{
	a=1;
}
	if(Flagpicture==1)
	{
		 pWnd = GetDlgItem(IDC_EDIT3);
	
	     pDC = pWnd->GetDC();
   if(a%2==0)
   {
    pDC->SetTextColor(RGB(250,0,0));
   }
   else
   {pDC->SetTextColor(RGB(250,255,255));
   }
	pDC->TextOut(160,120,"初使化...");
   

	}


	if(Flagpicture==1)
	{
	 pWnd = GetDlgItem(IDC_EDIT4);
	
	 pDC = pWnd->GetDC();
   if(a%2==0)
   {
    pDC->SetTextColor(RGB(250,0,0));
   }
   else
   {pDC->SetTextColor(RGB(250,255,255));
   }
	pDC->TextOut(160,120,"初使化...");

   

	}

	if(Flagpicture==1)
	{
		 pWnd = GetDlgItem(IDC_EDIT5);
	
	     pDC = pWnd->GetDC();
   if(a%2==0)
   {
    pDC->SetTextColor(RGB(250,0,0));
   }
   else
   {pDC->SetTextColor(RGB(250,255,255));
   }
	pDC->TextOut(160,120,"初使化...");
   

	}

	if(Flagpicture==1)
	{
	 pWnd = GetDlgItem(IDC_EDIT6);
	
     pDC = pWnd->GetDC();
   if(a%2==0)
   {
    pDC->SetTextColor(RGB(250,0,0));
   }
   else
   {pDC->SetTextColor(RGB(250,255,255));
   }
	pDC->TextOut(160,120,"初使化...");
   

	}
}
   else
   {
 




		CRect dlgRect;
	GetWindowRect(dlgRect);  //当前对话框窗口大小
	if (flagsuofang==0)
	{   if(dlgRect.Width() < (dlgWidth - dlgDx)) 
		MoveWindow
		(
			( -dlgDx+DesktopRect.Width() - dlgRect.Width() )/2,
			( -dlgDy+DesktopRect.Height() - dlgRect.Height() )/2,
			+dlgDx+dlgRect.Width(),
			+dlgDy+dlgRect.Height()
		);
	    else
			MoveWindow
		(
			( -dlgDx+DesktopRect.Width() - dlgRect.Width() )/2,
			( -dlgDy+DesktopRect.Height() - dlgRect.Height() )/2,
			1200,
			+dlgDy+dlgRect.Height()
		);
	 
     //if (( dlgRect.Width() >= (dlgWidth - dlgDx) )|| ( dlgRect.Height() >= (dlgHeight - dlgDy)))
		if ( ( dlgRect.Height() >= (dlgHeight - dlgDy)))
		{   
		 ::KillTimer(this->m_hWnd, 0);
		}
    }

	
 



   }








	CDialog::OnTimer(nIDEvent);
}







void CBPnetDlg::picture()
{
		CPaintDC dc(this);
	    pWnd = GetDlgItem(IDC_EDIT1);
	    pDC = pWnd->GetDC();
        pWnd->Invalidate();
	    pWnd->UpdateWindow();

	   CRect  rectClient;
	   pWnd->GetClientRect(rectClient);
	   pDC->SetMapMode(MM_ISOTROPIC);
	   pDC->SetWindowExt(12500,1000);
       int orgh=rectClient.Width()/9;
	   int orgz=4*rectClient.Height()/5;
       pDC->SetViewportExt(rectClient.right,-rectClient.bottom);
	   pDC->SetViewportOrg(orgh,orgz);
	   
	  CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
	  CPen* oldpen=pDC->SelectObject(&pen1);
	  pDC->SelectObject(&pBrush);

	 CRect rect;
	 pWnd-> GetClientRect(rect);
	 pDC->Rectangle(CRect(0,4000,10000,0));
     pDC->SelectObject(&pen3);
	

    for(int i=0;i<9;i++)

	{ 
		pDC->MoveTo(1000+i*1000,4000);
		pDC->LineTo(1000+i*1000,0);

⌨️ 快捷键说明

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