📄 shuangseqiudlg.cpp
字号:
// 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 + -