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

📄 funapppage.cpp

📁 我以前写的一个的神经网络学习函数逼近和分类的例子
💻 CPP
字号:
// FunAppPage.cpp : implementation file
//

#include "stdafx.h"
#include "NeuroNetwork.h"
#include "NeuroNetSample.h"
#include "FunAppPage.h"
#include <MATH.H>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define PI2 (3.14159*2)
/////////////////////////////////////////////////////////////////////////////
// CFunAppPage property page

IMPLEMENT_DYNCREATE(CFunAppPage, CPropertyPage)

CFunAppPage::CFunAppPage() : CPropertyPage(CFunAppPage::IDD)
{
	//{{AFX_DATA_INIT(CFunAppPage)
	m_iTimes = 200;
	m_iSamples = 20;
	m_iHidLayNodNum = 5;
	m_dLearnFactor = 0.05;
	m_bAutoScale = FALSE;
	m_bStemGraph = TRUE;
	//}}AFX_DATA_INIT

	m_iLayNum = 3;
	m_pLayNodNum = new int [3];
	m_pLayNodNum[0] = 1;
	m_pLayNodNum[1] = m_iHidLayNodNum;
	m_pLayNodNum[2] = 1;
	m_pNet = new CNeuroNetBP(m_pLayNodNum, m_iLayNum, NEURONET_FUNCTYPE_SIGMOID, NEURONET_FUNCTYPE_LINEAR, m_dLearnFactor);

	m_pIn = new double [m_iSamples];
	m_pOut = new double [m_iSamples];
	m_pExpOut = new double [m_iSamples];
	m_pError = new double [m_iSamples];

	int i;
	m_pIn[0] = 0;
	for (i = 1; i < m_iSamples; i++)
	{
		m_pIn[i] = PI2/(m_iSamples-1) * i;
	}

	for (i = 0; i < m_iSamples; i++)
	{
		m_pExpOut[i] = sin(m_pIn[i]);
	}

	m_bReset = FALSE;
	m_iOldHidLayNodNum = m_iHidLayNodNum;
	m_iOldSamples = m_iSamples;
}

CFunAppPage::~CFunAppPage()
{
	delete [] m_pIn;
	delete [] m_pExpOut;
	delete [] m_pError;
	delete [] m_pOut;

	delete m_pNet;
	delete m_pLayNodNum;	
}

void CFunAppPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFunAppPage)
	DDX_Control(pDX, IDC_STATIC_PIC, m_pic);
	DDX_Control(pDX, IDC_SPIN_TIMES, m_spinTimes);
	DDX_Control(pDX, IDC_SPIN_HIDNODNUM, m_spinNodNum);
	DDX_Control(pDX, IDC_SPIN_SAMPLE, m_spinSamples);
	DDX_Control(pDX, IDC_PROGRESS1, m_Progress);
	DDX_Text(pDX, IDC_EDIT_TIMES, m_iTimes);
	DDV_MinMaxInt(pDX, m_iTimes, 1, 100000);
	DDX_Text(pDX, IDC_EDIT_SAMPLE, m_iSamples);
	DDV_MinMaxInt(pDX, m_iSamples, 1, 1000);
	DDX_Text(pDX, IDC_EDIT_HIDNODNUM, m_iHidLayNodNum);
	DDV_MinMaxInt(pDX, m_iHidLayNodNum, 1, 100);
	DDX_Text(pDX, IDC_EDIT_LEARNFACTOR, m_dLearnFactor);
	DDV_MinMaxDouble(pDX, m_dLearnFactor, 1.e-003, 1.);
	DDX_Check(pDX, IDC_CHECK_AUTOSCALE, m_bAutoScale);
	DDX_Check(pDX, IDC_CHECK_STEMGRAPH, m_bStemGraph);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFunAppPage, CPropertyPage)
	//{{AFX_MSG_MAP(CFunAppPage)
	ON_BN_CLICKED(IDC_BUTTON_TRAIN, OnButtonTrain)
	ON_BN_CLICKED(IDC_BUTTON_RESET, OnButtonReset)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFunAppPage message handlers

void CFunAppPage::OnButtonTrain() 
{
	// TODO: Add your control notification handler code here
	if (!UpdateData(TRUE))
		return;

	//preparing data
	if (m_bReset || m_iOldHidLayNodNum != m_iHidLayNodNum)
	{
		m_pLayNodNum[1] = m_iHidLayNodNum;
		delete m_pNet;
		m_pNet = new CNeuroNetBP(m_pLayNodNum, m_iLayNum, NEURONET_FUNCTYPE_SIGMOID, NEURONET_FUNCTYPE_LINEAR, m_dLearnFactor);	
	}
	m_pNet->SetLearnFactor(m_dLearnFactor);

	if (m_iOldSamples != m_iSamples)
	{
		delete [] m_pIn;
		delete [] m_pExpOut;
		delete [] m_pError;
		delete [] m_pOut;

		m_pIn = new double [m_iSamples];
		m_pOut = new double [m_iSamples];
		m_pExpOut = new double [m_iSamples];
		m_pError = new double [m_iSamples];

		int i;
		m_pIn[0] = 0;
		for (i = 1; i < m_iSamples; i++)
		{
			m_pIn[i] = PI2/(m_iSamples-1) * i;
		}

		m_pExpOut[0] = 0;
		for (i = 0; i < m_iSamples; i++)
		{
			m_pExpOut[i] = sin(m_pIn[i]);
		}
	}

	m_bReset = FALSE;
	m_iOldHidLayNodNum = m_iHidLayNodNum;
	m_iOldSamples = m_iSamples;


	//training	
	int iTimes = m_iTimes;
	int iSamples = m_iSamples;
	int t, i;	
	m_Progress.SetRange32(1, iSamples * iTimes);
	m_Progress.SetStep(1);
	for (t = 0; t < iTimes; t++)
	{
		for (i = 0; i < iSamples; i++)
		{
			m_pNet->SetInput(&m_pIn[i]);
			m_pNet->SetExpOutput(&m_pExpOut[i]);
			if (!m_pNet->Train(1))
				return;
			m_Progress.StepIt();			
		}
	}
	m_Progress.SetPos(0);

	//output
	int iSelID = GetCheckedRadioButton(IDC_RADIO_SHOWOUTPUT, IDC_RADIO_SHOWERROR);
	BOOL bShowMode = (IDC_RADIO_SHOWOUTPUT == iSelID);

	double dMax = 0;
	for (i = 0; i < iSamples; i++)
	{
		m_pNet->SetInput(&m_pIn[i]);
		m_pNet->ForwardCalc();
		m_pNet->GetOutput(&m_pOut[i]);

		
		m_pError[i] = m_pExpOut[i]-m_pOut[i];

		if (bShowMode)
		{
			if (fabs(m_pOut[i])>dMax)
				dMax = fabs(m_pOut[i]);
		}
		else
		{
			if (fabs(m_pError[i])>dMax)
				dMax = fabs(m_pError[i]);
		}
	}

	m_pic.ClearPaint();
	if (bShowMode)
		m_pic.PaintImg(m_pOut, m_iSamples, dMax, m_bAutoScale, m_bStemGraph);
	else
		m_pic.PaintImg(m_pError, m_iSamples, dMax, m_bAutoScale, m_bStemGraph);

}

void CFunAppPage::OnButtonReset() 
{
	// TODO: Add your control notification handler code here
	m_bReset = TRUE;
}

void CFunAppPage::OnButtonClear() 
{
	// TODO: Add your control notification handler code here
	CDC* pdc = m_pic.GetDC();

	RECT rect;
	m_pic.GetClientRect(&rect);
//	rect.bottom = rect.bottom - rect.top - 5;
//	rect.right = rect.right - rect.left - 5;
//	rect.top = 5;
//	rect.left = 5;

//	int iWidth = rect.right - rect.left;
//	int iHeight = rect.bottom - rect.top;

	pdc->FillSolidRect(&rect, 0x00FFFFFF);
	
}

BOOL CFunAppPage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	// TODO: Add extra initialization here
	CheckRadioButton(IDC_RADIO_SHOWOUTPUT, IDC_RADIO_SHOWERROR, IDC_RADIO_SHOWOUTPUT);
	
	RECT rect;

	m_spinNodNum.GetWindowRect(&rect);
	ScreenToClient(&rect);
	m_spinNodNum.DestroyWindow();
	m_spinNodNum.Create(WS_VISIBLE|UDS_WRAP|UDS_ARROWKEYS|UDS_AUTOBUDDY|UDS_SETBUDDYINT, rect, this, IDC_SPIN_NODNUM);
	m_spinNodNum.SetBuddy(GetDlgItem(IDC_EDIT_HIDNODNUM));
	m_spinNodNum.SetRange(1, 100);
	
	m_spinSamples.GetWindowRect(&rect);
	ScreenToClient(&rect);
	m_spinSamples.DestroyWindow();
	m_spinSamples.Create(WS_VISIBLE|UDS_WRAP|UDS_ARROWKEYS|UDS_AUTOBUDDY|UDS_SETBUDDYINT, rect, this, IDC_SPIN_SAMPLE);
	m_spinSamples.SetBuddy(GetDlgItem(IDC_EDIT_SAMPLE));
	m_spinSamples.SetRange(1, 1000);

	m_spinTimes.GetWindowRect(&rect);
	ScreenToClient(&rect);
	m_spinTimes.DestroyWindow();
	m_spinTimes.Create(WS_VISIBLE|UDS_WRAP|UDS_ARROWKEYS|UDS_AUTOBUDDY|UDS_SETBUDDYINT, rect, this, IDC_SPIN_TIMES);
	m_spinTimes.SetBuddy(GetDlgItem(IDC_EDIT_TIMES));
	m_spinTimes.SetRange(1, 10000);

	m_pic.InitImg();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


int CFunAppPage::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CPropertyPage::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	
	return 0;
}

BOOL CFunAppPage::OnSetActive() 
{
	// TODO: Add your specialized code here and/or call the base class

	CancelToClose();		//change OK button caption to "Close" and disable the cancel button
	return CPropertyPage::OnSetActive();
}

⌨️ 快捷键说明

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