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

📄 shuangseqiudlg.cpp

📁 根据双色球历史开奖记录,用GA(遗传算法)推算下期开奖号码.主要是用于学习遗传算法,推算下期开奖号码只是一个乐趣.并不能真正的正确.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ShuangSeQiuDlg.cpp : implementation file
//

#include "stdafx.h"
#include "ShuangSeQiu.h"
#include "ShuangSeQiuDlg.h"

#include "AddHistoryDlg.h"
#include "HistoryReorcd.h"

#include "Spliter.h"

#include "math.h"

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

/////////////////////////////////////////////////////////////////////////////
// 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)
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

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

}

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here

	SetDlgItemText(IDC_EDIT1,"声明:本程序采用历史开奖记录,用遗传算法计算下期可能出现的红色球号码和兰色球号码.本人不负责使用本程序引起的连带责任.");
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


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

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	//}}AFX_MSG_MAP
	
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShuangSeQiuDlg dialog

CShuangSeQiuDlg::CShuangSeQiuDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CShuangSeQiuDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CShuangSeQiuDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CShuangSeQiuDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CShuangSeQiuDlg)
	DDX_Control(pDX, IDC_CODELIST, m_list);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CShuangSeQiuDlg, CDialog)
	//{{AFX_MSG_MAP(CShuangSeQiuDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_YUCE, OnBtnYuce)
	ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
	ON_BN_CLICKED(IDC_BTN_VIEWHISTORY, OnBtnViewhistory)
	ON_BN_CLICKED(IDC_BTN_SAVE, OnBtnSave)
	ON_BN_CLICKED(IDC_BTN_HISTORYSTAT, OnBtnHistorystat)
	ON_NOTIFY(NM_CLICK, IDC_CODELIST, OnClickCodelist)
	ON_BN_CLICKED(IDC_BTN_HISTORY, OnBtnHistory)
	ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
	//}}AFX_MSG_MAP
	ON_NOTIFY (NM_CUSTOMDRAW, IDC_CODELIST, OnCustomdrawMyList)

	ON_MESSAGE(WM_VALIDATE, OnEndLabelEditVariableCriteria) //添加的自定义的消息
	ON_MESSAGE(WM_SET_ITEMS, PopulateComboList)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CShuangSeQiuDlg message handlers

BOOL CShuangSeQiuDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	//skinppLoadSkin("AquaOS.ssk");
	skinppLoadSkin("MAC.ssk");


	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	

	
	m_list.EnableVScroll(); 
	m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);	
	m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);	



	m_list.InsertColumn(0,_T("ID"),LVCFMT_LEFT,30);
	m_list.InsertColumn(1,_T("红1"),LVCFMT_LEFT,40);
	m_list.InsertColumn(2,_T("红2"),LVCFMT_LEFT,40);
	m_list.InsertColumn(3,_T("红3"),LVCFMT_LEFT,40);
	m_list.InsertColumn(4,_T("红4"),LVCFMT_LEFT,40);
	m_list.InsertColumn(5,_T("红5"),LVCFMT_LEFT,40);
	m_list.InsertColumn(6,_T("红6"),LVCFMT_LEFT,40);

	m_list.InsertColumn(7,_T("蓝"),LVCFMT_LEFT,40);


	line = 0;
	yuce = 0;

	//初始化变量
	initVar();

	//读历史数据
	ReadHistroy();

	CString strValidChars;//	
	m_list.SetReadOnlyColumns(0);//read only

	strValidChars = "0123456789";
	m_list.SetColumnValidEditCtrlCharacters(strValidChars,1);//digital only edit
	m_list.SetColumnValidEditCtrlCharacters(strValidChars,2);//digital only edit
	m_list.SetColumnValidEditCtrlCharacters(strValidChars,3);//digital only edit
	m_list.SetColumnValidEditCtrlCharacters(strValidChars,4);//digital only edit
	m_list.SetColumnValidEditCtrlCharacters(strValidChars,5);//digital only edit
	m_list.SetColumnValidEditCtrlCharacters(strValidChars,6);//digital only edit
	m_list.SetColumnValidEditCtrlCharacters(strValidChars,7);//digital only edit
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CShuangSeQiuDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}




// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CShuangSeQiuDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}



// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CShuangSeQiuDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


//初始化变量
void CShuangSeQiuDlg::initVar()
{

	for(int i=0;i<6;i++){
		red[i] ="";
	}

	blue="";		//已经蓝球

	for(int r=0;r<34;r++){
		StatRed[r] =0;		//红球累计
		StatRedRate[r] = 0.0;		//红球累计率

		sn[r] = r;
	}

	for(int b=0;b<17;b++){
		StatBlue[b] =0;				//蓝球累计	
		StatBlueRate[b] = 0.0;		//蓝球累计率
	}
	
	int dd = 0;

	deleteflag = false;
	totalsn = 0;

	popnum = 20;

	//为预报工作作一些初始化
	for(int item=0;item<popnum;item++){
		for(int r=0;r<6;r++){
			ItemCountRed[item][r]=0;	
		}
		ItemCountBlue[item]=0;
		ItemCountRedRate[item] =0;
	}


	MAXRATE = 20;	//rate 排序前max的值

	thebest =0;		

	yecefail = true;
}


//读历史数据
void CShuangSeQiuDlg::ReadHistroy()
{
	CHistoryReorcd chr;
	CString path = chr.GetCurPath();
	CString filename = path+ "\\history.txt";
	line = chr.GetFileLine(filename);

	//分析每一行的数据,根据不同的内容,把值分到不同的数组中.
	for(int i=1;i<=line;i++){
		CString linestr= chr.GetLineActionFile(filename,i);
		int sub = linestr.Find(":",0);
		CString codestr = linestr.Mid(sub+1);

		CSpliter cSpliter;
		cSpliter.setdata(codestr);
		cSpliter.setsplitflag(",");
		CStringArray a;
		cSpliter.getsplitstrarray(a);

		int number_red=0;

		for(int r=0;r<6;r++){
			number_red = atoi(a.GetAt(r));
			StatRed[number_red] ++;
		}
		//把最后两期的号赋到全局数组中,以供预测时候比较.
		if(i == line-1){	
			for(int p=0;p<6;p++){		
				int sn =p;
				passval[sn] = atoi(a.GetAt(p));
			}
		}else if (i == line){	
			for(int p=0;p<6;p++){	
				int sn = 6+p;
				passval[sn] = atoi(a.GetAt(p));
			}
		}
		

		int number_blue = atoi(a.GetAt(6));
		StatBlue[number_blue] ++;
	}

	
	float RedTotolTime  = (float)6*line;		//红球总出现次数
	float BlueTotolTime = (float)line;			//蓝球总出现次数

	//计算机率
	for(int rr=1;rr<34;rr++){
		StatRedRate[rr] = (float)StatRed[rr] /	RedTotolTime;			//红球累计率
	}

	for(int br=1;br<17;br++){
		StatBlueRate[br] = (float)StatBlue[br] /BlueTotolTime;			//蓝球累计率
	}
	

}

void CShuangSeQiuDlg::OnBtnYuce() 
{
	yecefail = true;

	while(yecefail){

		//通过算法得到数值
		GAStudy();

		UpdateData(TRUE);

		int i =m_list.GetItemCount();

		CString str;
		str.Format("%d",totalsn+1);

		if (!yecefail){
			SetDlgItemText(IDC_STATIC_INFO,"信息:这是个可选号码!" );
			m_list.InsertItem(LVIF_TEXT|LVIF_STATE, i+1, str, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED, 0, 0);
		}



		if (!yecefail){		
			for(int sub=0;sub<6;sub++){
				CString s="";	
				s.Format("%d" ,sn[ ItemCountRed[thebest][sub] ]); 	
				m_list.SetItemText(i,sub+1,s);
			}
			int blue = rand()%(16) + 1;
			CString bstr;
			bstr.Format("%d",blue);
			//兰色球号码,没有怎么做,随机了一个兰色球,哈...
			m_list.SetItemText(i,7,_T(bstr));
			totalsn ++;
		}
		UpdateData(FALSE);	

	}




	
}

//开始GA学习
void CShuangSeQiuDlg::GAStudy()
{	

	initpop();				//初始化种群

	int train_count =0;

	int totalval =118;		//累加和

    int bubiaole =0;
	int pre = 0;

	while( totalval < 75  || totalval > 125  ||  train_count< 10  )
	{
		totalval = 0;			//初始化为0

		train_count++;			//下一代

		ComputeFit();			//计算适应度
		
		SelectAndDeletePop();	//选择和淘汰种群
		
		CrossPop();				//交叉操作

		Mutation();		        //变异操作

		thebest = GetResult();	//得到最优种群ID

		int val[6] ={0};
		
		for(int i=0;i<6;i++){
			val[i] = sn[ItemCountRed[thebest][i]];
			totalval = totalval + val[i];
		}

		if (pre == totalval){
			bubiaole ++;
		}else{
			pre = totalval;
		}

		if (bubiaole>10){
			//AfxMessageBox("出现不推荐号码已跳过,请继续预测!");
			SetDlgItemText(IDC_STATIC_INFO,"信息:出现不推荐号码已跳过,系统继续预测中......" );
			yecefail = true;
			break;
		}else{
			yecefail = false;
		}

		//比较与上两期差别
		int samecount =0;
		for(i=0;i<6;i++){
			for(int sn=0;sn<12;sn++){
				if(	val[i] == passval[sn] ){
					samecount ++ ;
					if (samecount > 2 ){	//如果大于两个则,放弃这个预测					
						yecefail = true;
						SetDlgItemText(IDC_STATIC_INFO,"信息:与上两期相似号跳过,系统继续预测中......" );
						break;
					}else{
						yecefail = false;
					}
				}
			}
		}

		int dd = 0;
			
	}

}

//初始化种群
void CShuangSeQiuDlg::initpop()
{
	//排序
	int tmp=0;

	for(int i=1;i<34;i++){
		for(int j=i+1;j<34;j++) 
			if(	StatRedRate[sn[i]]  < StatRedRate[sn[j]] ) {
				tmp = sn[i];
				sn[i]= sn[j];
				sn[j] = tmp;				
			}
	}


	//间接排序问题
	/*
	CStdioFile file; 
	file.Open("sort.txt",CFile::modeCreate|CFile::modeReadWrite); 

	int len = 34;
	for(i=1;i<len ;i++){
		CString rate,ratelist;
		ratelist.Format("%.8f",StatRedRate[sn[i]]);
		rate.Format("%d --",sn[i]);
		rate = rate + ratelist;
		file.WriteString(rate);
		file.WriteString("\n");
	}
	file.Close();
	*/


	srand(time(0));/*设置种子,并生成伪随机序列*/ 
	for(int pop=0;pop<popnum;pop++){
		for(int j=0;j<6;j++){
			bool same = true;

⌨️ 快捷键说明

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