www.pudn.com > bpA.rar > bpA.cpp


#include "stdafx.h" 
#include  
#include "bpA.h" 
#include "stdlib.h" 
 
#include  
using namespace std; 
 
#define MAX_RAND 32767.0 
IMPLEMENT_DYNAMIC(CBpAlgorithm,CObject) 
 
CBpAlgorithm::CBpAlgorithm(CWnd* pPanel,CWnd* pDlg){ 
	//TODO:ADD CODE HERE		 
	m_nLR=0.7; 
	m_nMC=0.9; 
	m_nLayerNum=2; 
	m_nHiddenLayerNum=m_nLayerNum-1; 
	m_CurrentX=1000.0; 
	m_CurrentY=-8000.0; 
	m_nTrainingNum=80000; 
	m_nVectorNum=2; 
	m_nYdimension=1; 
	m_nXdimension=2; 
	m_pPanel=pPanel; 
	m_pDlg=pDlg; 
	m_strText=""; 
	m_nMaxError=0.002; 
	m_nWam=0; 
	m_nNM=1; 
	m_IsStop=FALSE; 
	m_nNodes[0]=m_nXdimension; 
	m_nNodes[1]=3; 
	m_nNodes[m_nLayerNum]=1; 
	m_IsInput=TRUE; 
	TCHAR lpszPath[MAX_PATH]; 
	::GetCurrentDirectory(MAX_PATH,lpszPath); 
	CString strPath(lpszPath); 
	strPath+="\\dlls\\sigmoid.dll"; 
	VERIFY(m_hInstance=::LoadLibrary(strPath)); 
	VERIFY(m_pTransFuncX=(FUNCTION*)::GetProcAddress(m_hInstance,"TransFuncX")); 
	VERIFY(m_pTransFunc=(FUNCTION*)::GetProcAddress(m_hInstance,"TransFunc")); 
	} 
 
 
void CBpAlgorithm::Initialize(BOOL yFromFile) 
{ 
	int i,j,k; 
	srand((unsigned)time(0)); 
	CComboBox* pCB=(CComboBox*)m_pDlg->GetDlgItem(IDC_WEIGHT); 
	CListBox* pLB=(CListBox*)m_pDlg->GetDlgItem(IDC_TRAIN); 
	CListBox* pLB1=(CListBox*)m_pDlg->GetDlgItem(IDC_TEST);	 
	pCB->ResetContent(); 
	pLB->ResetContent(); 
	pLB1->ResetContent(); 
	CString strText; 
	CString subStr; 
	int nWeightNum=0; 
	for(i=0;iInsertString(nWeightNum++,strText); 
			} 
	for(i=0;iInsertString(i,strText); 
	} 
 
/*int end,begin; 
	for(i=0;i1){ 
				m_Y[i][yItem]=cy[yItem]*0.5; 
			} 
			else{ 
				m_Y[i][yItem]=cy[yItem]; 
			} 
			CString str; 
			str.Format("%f",m_Y[i][yItem]); 
			pLB1->InsertString(i,str); 
		} 
		strText.Delete(strText.GetLength()-1); 
		strText=strText+"]"; 
		pLB->InsertString(i,strText); 
		m_strText+=(strText+"\n"); 
	} 
 
*/ 
//	ConstructOutputString(); 
} 
 
void CBpAlgorithm::InitInput(){ 
	int begin,end; 
	int i,j; 
	begin=end=1; 
//	m_strText="0.700000,0.900000,80000,2,21.000000,31.000000,52.000000,22.000000,32.000000,54.000000,0.700000,0.900000,80000,2,21.000000,31.000000,52.000000,22.000000,32.000000,54.000000,"; 
//	AfxMessageBox(m_strText); 
	for(i=0;i<4;++i) 
	{ 
		end=m_strText.Find(',',begin)-1; 
		switch(i) 
		{ 
		case 0: 
			m_nLR=ParseString(begin,end); 
			break; 
		case 1: 
			m_nMC=ParseString(begin,end); 
			break; 
		case 2: 
			m_nTrainingNum=(int)ParseString(begin,end); 
			break; 
		case 3: 
			m_nVectorNum=(int)ParseString(begin,end); 
			break; 
		default: 
			break; 
		} 
		begin=end+2; 
	} 
	end=m_strText.Find(',',begin)-1; 
	for(i=0;icMax[j])cMax[j]=Array[i][j]; 
			if(Array[i][j]GetDlgItem(IDC_TEST);	 
	CString strText; 
	switch(m_nNM) 
	{ 
	case 0: 
		for(i=0;iInsertString(-1,strText); 
			} 
		} 
		break; 
	case 1: 
		for(i=0;iInsertString(-1,strText); 
			} 
		} 
		break; 
	case 2: 
		double cRMax[MAX_DIMENSION]; 
		for(i=0;i(cAvg[i]-cMin[i])) 
				cRMax[i]=cMax[i]-cAvg[i]; 
			else 
				cRMax[i]=cAvg[i]-cMin[i]; 
			if(IsSave) 
			{ 
				m_RMaxX[i]=cRMax[i]; 
			} 
			else  
			{ 
				m_RMaxY[i]=cRMax[i]; 
			} 
		} 
		for(i=0;iInsertString(-1,strText); 
			} 
		} 
		break; 
	default: 
		break; 
	} 
		return; 
} 
 
void CBpAlgorithm::DeNormalizing(double Array[],double ArrayDN[]) 
{ 
	//反归一化仅仅对输出向量有效 
	int i; 
	for(i=0;iGetDlgItem(IDC_ERROR); 
	pLB->ResetContent(); 
	CString strText; 
	Paint(); 
	if(m_nWam==0)//m_nWam权值调整方式 
	{ 
		for(int loop=0;loopInsertString(cTrainingNum,strText); 
				this->Paint(cTrainingNum); 
				AdjustWeight(cVectorNum); 
			} 
		} 
		if(AbsF(m_nError[cTrainingNum-1])>m_nMaxError){ 
			AfxMessageBox("神经网络没有训练好!"); 
		} 
		else 
		{ 
			AfxMessageBox("神经网络已经训练好!"); 
		} 
	} 
	else if(m_nWam==1) 
	{ 
		double cError; 
		for(int cTrainingNum=0;cTrainingNumInsertString(cTrainingNum,strText); 
			//画图 
			this->Paint(cTrainingNum); 
			//调整权值 
			AdjustWeight(cVectorNum); 
		} 
		if(AbsF(m_nError[cTrainingNum-1])>m_nMaxError){ 
			AfxMessageBox("神经网络没有训练好!"); 
		} 
		else 
		{ 
			AfxMessageBox("神经网络已经训练好!"); 
		} 
	} 
	m_CurrentX=1000; 
	m_CurrentY=-8000; 
} 
 
void CBpAlgorithm::Fanhua(){ 
	int i,j,k; 
	for(i=0;i=0;--i) 
	{ 
		if(i==m_nLayerNum-1){ 
			for(j=0;jm_hWnd,rectClient); 
	dc.DPtoLP(rectClient); 
	dc.MoveTo(1000,-8000); 
	dc.LineTo(17500,-8000); 
	dc.MoveTo(1000,-1000); 
	dc.LineTo(1000,-8000); 
	dc.MoveTo(1000,-1000); 
	dc.LineTo(800,-1200); 
	dc.MoveTo(1000,-1000); 
	dc.LineTo(1200,-1200); 
	dc.MoveTo(17500,-8000); 
	dc.LineTo(17300,-7800); 
	dc.MoveTo(17500,-8000); 
	dc.LineTo(17300,-8200); 
//设置横坐标 
	for(i=0;i<=10;i++) 
	{ 
		strText.Format("%d",m_nTrainingNum/10*i); 
		x=(int)(m_CurrentX+16000.0/10*i); 
		dc.MoveTo(x,-8000); 
		dc.LineTo(x,-7900); 
		dc.SetTextColor(RGB(0,0,255)); 
		dc.TextOut(x-500,y,strText); 
	} 
//设置纵坐标 
	x=1000; 
	for(i=1;i<=10;i++) 
	{ 
		strText.Format("%2f",0.02*i); 
		strText.Delete(4,4); 
		y=(int)(m_CurrentY+7000/10*i); 
		dc.MoveTo(1000,y); 
		dc.LineTo(1200,y); 
		dc.SetTextColor(RGB(0,0,255)); 
		dc.TextOut(x-1000,y+300,strText); 
	} 
} 
 
void CBpAlgorithm::ClearMatrix(){ 
	int i,j,k; 
	for(i=0;i<=m_nLayerNum;++i) 
	{ 
		for(j=0;j> t; 
			m_InitX[i][j] = t; 
		} 
		for (j=0; j> t; 
			m_InitY[i][j] = t; 
		} 
	} 
	m_IsInput = TRUE; 
	infile.close(); 
} 
 
#ifdef _DEBUG 
void CBpAlgorithm::Dump(CDumpContext& dc)const{ 
	CObject::Dump(dc); 
	dc<<"m_nLR="<