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

📄 luckylottery.cpp

📁 利用人工智能原理中BP神经网络算法
💻 CPP
字号:
// LuckyLottery.cpp : Defines the class behaviors for the application.
//

#include "stdafx.h"
#include  <math.h>

#include "LuckyLottery.h"
#include "InputDialog.h"
#include "OutputDialog.h"

#include "MainFrm.h"

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

/////////////////////////////////////////////////////////////////////////////
// CLuckyLotteryApp

BEGIN_MESSAGE_MAP(CLuckyLotteryApp, CWinApp)
	//{{AFX_MSG_MAP(CLuckyLotteryApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
	ON_COMMAND(ID_INPUT_LOTTERY, OnInputLottery)
	ON_COMMAND(ID_TRAIN_NETWORK, OnTrainNetwork)
	ON_COMMAND(ID_OUTPUT_LOTTERY, OnOutputLottery)
	ON_COMMAND(ID_WRITE_LOTTERY, OnWriteLottery)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLuckyLotteryApp construction

CLuckyLotteryApp::CLuckyLotteryApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CLuckyLotteryApp object

CLuckyLotteryApp theApp;

/////////////////////////////////////////////////////////////////////////////
// CLuckyLotteryApp initialization

BOOL CLuckyLotteryApp::InitInstance()
{
	// Standard initialization
	// If you are not using these features and wish to reduce the size
	//  of your final executable, you should remove from the following
	//  the specific initialization routines you do not need.

#ifdef _AFXDLL
	Enable3dControls();			// Call this when using MFC in a shared DLL
#else
	Enable3dControlsStatic();	// Call this when linking to MFC statically
#endif

	// Change the registry key under which our settings are stored.
	// TODO: You should modify this string to be something appropriate
	// such as the name of your company or organization.
	SetRegistryKey(_T("Local AppWizard-Generated Applications"));


	// To create the main window, this code creates a new frame window
	// object and then sets it as the application's main window object.

	CMainFrame* pFrame = new CMainFrame;
	m_pMainWnd = pFrame;

	// create and load the frame with its resources

	pFrame->LoadFrame(IDR_MAINFRAME,
		WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
		NULL);




	// The one and only window has been initialized, so show and update it.
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CLuckyLotteryApp message handlers





/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
		// No message handlers
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

// App command to run the dialog
void CLuckyLotteryApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

/////////////////////////////////////////////////////////////////////////////
// CLuckyLotteryApp message handlers

void CLuckyLotteryApp::OnInputLottery() 
{
	// TODO: Add your command handler code here
	InputDialog MyInputDlg;
	MyInputDlg.DoModal();
}

void CLuckyLotteryApp::OnTrainNetwork() 
{
	// TODO: Add your command handler code here
	int i, j, loop=0, count=0 /*,same=0, aa, bb*/;
//	short range;
	double temp_value, wk, wkb;
	CString finish;


	BeginWaitCursor(); // display the hourglass cursor

	GetData();
	InitNetwork();

//	CProgressCtrl pg;
//	pg.Create(PBS_SMOOTH|WS_CHILD|WS_BORDER|WS_VISIBLE ,CRect(10,350,1000,370),AfxGetApp()->m_pMainWnd,0);
//	range = 1000;
//	pg.SetRange(0,range);

	while(((count++)<END_COUNT)&&(error_value>END_VALUE))
	{
		error_value = 0.0;
		for(loop=0; loop<DATA_NUM; loop++)
		{
			//计算输入层单元的输出
			for(i=0; i<IN_NUM; i++)
				ot_in[i] = data_in[loop][i];

			//计算隐层单元的输出
			for(i=0; i<HIDE_NUM; i++)
			{
				temp_value = 0.0;
				for(j=0; j<IN_NUM; j++)
					temp_value += (w_in_hd[i][j]*ot_in[j]);
				temp_value += cw_hd[i];
				ot_hd[i] = Sigmf(temp_value);

			}

			//计算输出层单元的输出
			for(i=0; i<OUT_NUM; i++)
			{
				temp_value = 0.0;
				for(j=0; j<HIDE_NUM; j++)
					temp_value += (w_hd_ot[i][j]*ot_hd[j]);
				temp_value += cw_ot[i];
				ot_ot[i] = Sigmf(temp_value);
			}

			//输出层误差中间值计算
			for(i=0; i<OUT_NUM; i++)
			{
				teach[i] = data_ot[loop][i];
				wk = ot_ot[i];
				wkb = teach[i] - wk;
				error_value += (fabs(wkb));
				del_ot[i] =  wkb * ru0 * wk * (1.0 - wk);
			}

			//隐层误差中间值计算
			for(i=0; i<HIDE_NUM; i++)
			{
				temp_value = 0.0;
				for(j=0; j<OUT_NUM; j++)
					temp_value += (del_ot[j] * w_hd_ot[j][i]);
				wk = ot_hd[i];
				del_hd[i] = temp_value * ru0 * wk * (1.0 - wk);
			}

			//输出层的权值修正量计算
			for(i=0; i<OUT_NUM; i++)
			{
				dcw_ot[i] = steplength * del_ot[i];
				for(j=0; j<HIDE_NUM; j++)
					dw_hd_ot[i][j] = steplength * del_ot[i] * ot_hd[j];
			}

			//隐层的权值修正量计算
			for(i=0; i<HIDE_NUM; i++)
			{
				dcw_hd[i] = steplength * del_hd[i];
				for(j=0; j<IN_NUM; j++)
					dw_in_hd[i][j] = steplength * del_hd[i] * ot_in[j];
			}

			//隐层的权值调整
			for(i=0; i<HIDE_NUM; i++)
			{
				wk = alpha * ocw_hd[i] + dcw_hd[i];
				cw_hd[i] += wk;
				ocw_hd[i] = wk;
				for(j=0; j<IN_NUM; j++)
				{
					wk = alpha * ow_in_hd[i][j] + dw_in_hd[i][j];
					w_in_hd[i][j] += wk;
					ow_in_hd[i][j] = wk;
				}
			}

			//输出层的权值调整
			for(i=0; i<OUT_NUM; i++)
			{
				wk = alpha * ocw_ot[i] + dcw_ot[i];
				cw_ot[i] -= wk;
				ocw_ot[i] = wk;
				for(j=0; j<HIDE_NUM; j++)
				{
					wk = alpha * ow_hd_ot[i][j] + dw_hd_ot[i][j];
					w_hd_ot[i][j] -= wk;
					ow_hd_ot[i][j] = wk;
				}
			}





		}
//			if(count%20)pg.SetPos(count/20);
	}
	EndWaitCursor(); // remove the hourglass cursor
//	finish.Empty();
//	finish.Format("训练结束, 共%d次,最后误差为 %f !\n", count, error_value);
//	AfxMessageBox(finish);
//	OutputDialog MyOutputDlg;
//	MyOutputDlg.DoModal();

	return;
}

void CLuckyLotteryApp::OnOutputLottery() 
{
	// TODO: Add your command handler code here
	OutputDialog MyOutputDlg;
	MyOutputDlg.DoModal();
}

double CLuckyLotteryApp::Sigmf(double su)
{
	double RValue;
//	RValue = 0.5 * ru0 * su;
//	RValue = 0.5 * (1.0 + tanh(su));
	RValue = 1.0 + exp(su*ru0);
	RValue = 1.0/RValue;
//	if (RValue > 0.999) return(0.999);
//	else 
//		if (RValue < 0.001) return(0.001);
	return(RValue);
}

void CLuckyLotteryApp::GetData() 
{
	CStdioFile MyFile;
	CString pFileName = _T("E:\\vc_work\\LOTTERY\\LotteryFile.txt");
	double out;
	int i,j, pos;

	MyFile.Open(pFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite);
//	i = MyFile.GetLength();
//	j = 9*(DATA_NUM + (IN_NUM / 7));
	if (MyFile.GetLength() < 9*(DATA_NUM + (IN_NUM / 7)))
	{
		AfxMessageBox("彩票号码不够,请先输入彩票号码!");
		return;
	}
	else
		MyFile.Seek(-9*(DATA_NUM+(IN_NUM / 7)), CFile::end);
	memset(buffer, 0, 9*(DATA_NUM+(IN_NUM / 7)));
	MyFile.Read(buffer, 9*(DATA_NUM+(IN_NUM / 7)));

	for(i=0; i< DATA_NUM; i++)
	{
		for (j=0; j < IN_NUM; j++)
		{
			pos = (i*8)+j+(int)(j/7);
			data_in[i][j] = ((double)buffer[pos] - 48.0)/10.0;		
		}
		for (j=0; j < OUT_NUM; j++)
		{
//			pos = (i+(IN_NUM/7))*8+j+(int)(j/7);
//			data_ot[i][j] = ((double)buffer[pos] - 48.0)/10.0;		
			out = (double)buffer[(i*8+(8 * (IN_NUM / OUT_NUM)))+j] - 48.0;
			data_ot[i][j] = out/10.0;
		}
	}

	MyFile.Close();
}

void CLuckyLotteryApp::InitNetwork() 
{
	int i,j;
	
	error_value = 100.0;
	alpha = 0.2;
	steplength = 0.8;
	ru0 = 0.5;
	srand((unsigned)time(NULL));

	for(i=0; i<HIDE_NUM; i++)
	{
		ot_hd[i] = 0.0;
		for(j=0; j<IN_NUM; j++)
		{
			w_in_hd[i][j] = (double)rand();
			w_in_hd[i][j] /= RAND_MAX;
			w_in_hd[i][j] -= 0.5;
			w_in_hd[i][j] *= 5.0;
			dw_in_hd[i][j] = 0.0;
			ow_in_hd[i][j] = 0.0;
		}
		cw_hd[i] = (double)rand();
		cw_hd[i] /= RAND_MAX;
		cw_hd[i] -= 0.5;
	}

	for(i=0; i<OUT_NUM; i++)
	{
		ot_ot[i] = 0.0;
		for(j=0; j<HIDE_NUM; j++)
		{
			w_hd_ot[i][j] = (double)rand();
			w_hd_ot[i][j] /= RAND_MAX;
			w_hd_ot[i][j] -= 0.5;
			w_hd_ot[i][j] *= 5.0;
			dw_hd_ot[i][j] = 0.0;
			ow_hd_ot[i][j] = 0.0;
		}
		cw_ot[i] = (double)rand();
		cw_ot[i] /= RAND_MAX;
		cw_ot[i] -= 0.5;
	}
}





CString CLuckyLotteryApp::ForecastLottery(CString input_data)
{
	int i, j, k;
	double temp_value;
	CString temp_str, return_str;

	//计算输入层单元的输出
	for(i=0; i<IN_NUM; i++)
		ot_in[i] = ((double)input_data[(i%7)+((int)(i/7))*8] - 48.0)/10.0;

	//计算隐层单元的输出
	for(i=0; i<HIDE_NUM; i++)
	{
		temp_value = 0.0;
		for(j=0; j<IN_NUM; j++)
			temp_value += (w_in_hd[i][j]*ot_in[j]);
		temp_value += cw_hd[i];
		ot_hd[i] = Sigmf(temp_value);
	}

	//计算输出层单元的输出
	for(i=0; i<OUT_NUM; i++)
	{
		temp_value = 0.0;
		for(j=0; j<HIDE_NUM; j++)
			temp_value += (w_hd_ot[i][j]*ot_hd[j]);
		temp_value += cw_ot[i];
		ot_ot[i] = Sigmf(temp_value) * 10.0;
	}

	return_str.Empty();
	for(i=0; i<OUT_NUM; i++)
	{
		k = (int)(ot_ot[i] + 0.1);
//		k = (int)(ot_ot[i]);
		temp_str.Format("%d ", k);
		return_str += temp_str;
	}
//	return_str.SetAt(20, '@');
	return(return_str);
}

void CLuckyLotteryApp::OnWriteLottery() 
{
	// TODO: Add your command handler code here
	int i;
	char buffer[9 * (IN_NUM/7) + 9];
	CStdioFile MyFile;
	CString Input, Output;

	CString pFileName = _T("E:\\vc_work\\LOTTERY\\LotteryFile.txt");
	MyFile.Open(pFileName, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeRead);
	MyFile.Seek(-(IN_NUM / 7 * 9), CFile::end);
	memset(buffer, 0, (9 * (IN_NUM/7) + 9));
	MyFile.Read(buffer, ((IN_NUM/7) * 8 + 8));
	Input.Empty();
	Input += buffer;
	MyFile.Close();


	pFileName = _T("E:\\vc_work\\LOTTERY\\OutputFile.txt");
	MyFile.Open(pFileName, CFile::modeCreate | CFile::modeWrite);

	

	for(i=0; i<3; i++)
	{
		OnTrainNetwork();
		Output.Empty();
		Output = ForecastLottery(Input);
		Output += "\n";
		MyFile.Write(Output, Output.GetLength());

	}
	MyFile.Close();
	AfxMessageBox("彩票中大奖啦!!!");

}

⌨️ 快捷键说明

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