📄 luckylottery.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 + -