ShuangSeQiuDlg.cpp
上传用户:flyanjing
上传日期:2015-10-09
资源大小:649k
文件大小:22k
开发平台:

Visual C++

  1. // ShuangSeQiuDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ShuangSeQiu.h"
  5. #include "ShuangSeQiuDlg.h"
  6. #include "AddHistoryDlg.h"
  7. #include "HistoryReorcd.h"
  8. #include "Spliter.h"
  9. #include "math.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CAboutDlg dialog used for App About
  17. class CAboutDlg : public CDialog
  18. {
  19. public:
  20. CAboutDlg();
  21. // Dialog Data
  22. //{{AFX_DATA(CAboutDlg)
  23. enum { IDD = IDD_ABOUTBOX };
  24. //}}AFX_DATA
  25. // ClassWizard generated virtual function overrides
  26. //{{AFX_VIRTUAL(CAboutDlg)
  27. protected:
  28. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  29. //}}AFX_VIRTUAL
  30. // Implementation
  31. protected:
  32. //{{AFX_MSG(CAboutDlg)
  33. virtual BOOL OnInitDialog();
  34. //}}AFX_MSG
  35. DECLARE_MESSAGE_MAP()
  36. };
  37. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  38. {
  39. //{{AFX_DATA_INIT(CAboutDlg)
  40. //}}AFX_DATA_INIT
  41. }
  42. BOOL CAboutDlg::OnInitDialog() 
  43. {
  44. CDialog::OnInitDialog();
  45. // TODO: Add extra initialization here
  46. SetDlgItemText(IDC_EDIT1,"声明:本程序采用历史开奖记录,用遗传算法计算下期可能出现的红色球号码和兰色球号码.本人不负责使用本程序引起的连带责任.");
  47. return TRUE;  // return TRUE unless you set the focus to a control
  48.               // EXCEPTION: OCX Property Pages should return FALSE
  49. }
  50. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  51. {
  52. CDialog::DoDataExchange(pDX);
  53. //{{AFX_DATA_MAP(CAboutDlg)
  54. //}}AFX_DATA_MAP
  55. }
  56. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  57. //{{AFX_MSG_MAP(CAboutDlg)
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CShuangSeQiuDlg dialog
  62. CShuangSeQiuDlg::CShuangSeQiuDlg(CWnd* pParent /*=NULL*/)
  63. : CDialog(CShuangSeQiuDlg::IDD, pParent)
  64. {
  65. //{{AFX_DATA_INIT(CShuangSeQiuDlg)
  66. // NOTE: the ClassWizard will add member initialization here
  67. //}}AFX_DATA_INIT
  68. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  69. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  70. }
  71. void CShuangSeQiuDlg::DoDataExchange(CDataExchange* pDX)
  72. {
  73. CDialog::DoDataExchange(pDX);
  74. //{{AFX_DATA_MAP(CShuangSeQiuDlg)
  75. DDX_Control(pDX, IDC_CODELIST, m_list);
  76. //}}AFX_DATA_MAP
  77. }
  78. BEGIN_MESSAGE_MAP(CShuangSeQiuDlg, CDialog)
  79. //{{AFX_MSG_MAP(CShuangSeQiuDlg)
  80. ON_WM_SYSCOMMAND()
  81. ON_WM_PAINT()
  82. ON_WM_QUERYDRAGICON()
  83. ON_BN_CLICKED(IDC_BTN_YUCE, OnBtnYuce)
  84. ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
  85. ON_BN_CLICKED(IDC_BTN_VIEWHISTORY, OnBtnViewhistory)
  86. ON_BN_CLICKED(IDC_BTN_SAVE, OnBtnSave)
  87. ON_BN_CLICKED(IDC_BTN_HISTORYSTAT, OnBtnHistorystat)
  88. ON_NOTIFY(NM_CLICK, IDC_CODELIST, OnClickCodelist)
  89. ON_BN_CLICKED(IDC_BTN_HISTORY, OnBtnHistory)
  90. ON_BN_CLICKED(IDC_BTN_DELETE, OnBtnDelete)
  91. //}}AFX_MSG_MAP
  92. ON_NOTIFY (NM_CUSTOMDRAW, IDC_CODELIST, OnCustomdrawMyList)
  93. ON_MESSAGE(WM_VALIDATE, OnEndLabelEditVariableCriteria) //添加的自定义的消息
  94. ON_MESSAGE(WM_SET_ITEMS, PopulateComboList)
  95. END_MESSAGE_MAP()
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CShuangSeQiuDlg message handlers
  98. BOOL CShuangSeQiuDlg::OnInitDialog()
  99. {
  100. CDialog::OnInitDialog();
  101. //skinppLoadSkin("AquaOS.ssk");
  102. skinppLoadSkin("MAC.ssk");
  103. // Add "About..." menu item to system menu.
  104. // IDM_ABOUTBOX must be in the system command range.
  105. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  106. ASSERT(IDM_ABOUTBOX < 0xF000);
  107. CMenu* pSysMenu = GetSystemMenu(FALSE);
  108. if (pSysMenu != NULL)
  109. {
  110. CString strAboutMenu;
  111. strAboutMenu.LoadString(IDS_ABOUTBOX);
  112. if (!strAboutMenu.IsEmpty())
  113. {
  114. pSysMenu->AppendMenu(MF_SEPARATOR);
  115. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  116. }
  117. }
  118. // Set the icon for this dialog.  The framework does this automatically
  119. //  when the application's main window is not a dialog
  120. SetIcon(m_hIcon, TRUE); // Set big icon
  121. SetIcon(m_hIcon, FALSE); // Set small icon
  122. m_list.EnableVScroll(); 
  123. m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
  124. m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  125. m_list.InsertColumn(0,_T("ID"),LVCFMT_LEFT,30);
  126. m_list.InsertColumn(1,_T("红1"),LVCFMT_LEFT,40);
  127. m_list.InsertColumn(2,_T("红2"),LVCFMT_LEFT,40);
  128. m_list.InsertColumn(3,_T("红3"),LVCFMT_LEFT,40);
  129. m_list.InsertColumn(4,_T("红4"),LVCFMT_LEFT,40);
  130. m_list.InsertColumn(5,_T("红5"),LVCFMT_LEFT,40);
  131. m_list.InsertColumn(6,_T("红6"),LVCFMT_LEFT,40);
  132. m_list.InsertColumn(7,_T("蓝"),LVCFMT_LEFT,40);
  133. line = 0;
  134. yuce = 0;
  135. //初始化变量
  136. initVar();
  137. //读历史数据
  138. ReadHistroy();
  139. CString strValidChars;//
  140. m_list.SetReadOnlyColumns(0);//read only
  141. strValidChars = "0123456789";
  142. m_list.SetColumnValidEditCtrlCharacters(strValidChars,1);//digital only edit
  143. m_list.SetColumnValidEditCtrlCharacters(strValidChars,2);//digital only edit
  144. m_list.SetColumnValidEditCtrlCharacters(strValidChars,3);//digital only edit
  145. m_list.SetColumnValidEditCtrlCharacters(strValidChars,4);//digital only edit
  146. m_list.SetColumnValidEditCtrlCharacters(strValidChars,5);//digital only edit
  147. m_list.SetColumnValidEditCtrlCharacters(strValidChars,6);//digital only edit
  148. m_list.SetColumnValidEditCtrlCharacters(strValidChars,7);//digital only edit
  149. // TODO: Add extra initialization here
  150. return TRUE;  // return TRUE  unless you set the focus to a control
  151. }
  152. void CShuangSeQiuDlg::OnSysCommand(UINT nID, LPARAM lParam)
  153. {
  154. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  155. {
  156. CAboutDlg dlgAbout;
  157. dlgAbout.DoModal();
  158. }
  159. else
  160. {
  161. CDialog::OnSysCommand(nID, lParam);
  162. }
  163. }
  164. // If you add a minimize button to your dialog, you will need the code below
  165. //  to draw the icon.  For MFC applications using the document/view model,
  166. //  this is automatically done for you by the framework.
  167. void CShuangSeQiuDlg::OnPaint() 
  168. {
  169. if (IsIconic())
  170. {
  171. CPaintDC dc(this); // device context for painting
  172. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  173. // Center icon in client rectangle
  174. int cxIcon = GetSystemMetrics(SM_CXICON);
  175. int cyIcon = GetSystemMetrics(SM_CYICON);
  176. CRect rect;
  177. GetClientRect(&rect);
  178. int x = (rect.Width() - cxIcon + 1) / 2;
  179. int y = (rect.Height() - cyIcon + 1) / 2;
  180. // Draw the icon
  181. dc.DrawIcon(x, y, m_hIcon);
  182. }
  183. else
  184. {
  185. CDialog::OnPaint();
  186. }
  187. }
  188. // The system calls this to obtain the cursor to display while the user drags
  189. //  the minimized window.
  190. HCURSOR CShuangSeQiuDlg::OnQueryDragIcon()
  191. {
  192. return (HCURSOR) m_hIcon;
  193. }
  194. //初始化变量
  195. void CShuangSeQiuDlg::initVar()
  196. {
  197. for(int i=0;i<6;i++){
  198. red[i] ="";
  199. }
  200. blue=""; //已经蓝球
  201. for(int r=0;r<34;r++){
  202. StatRed[r] =0; //红球累计
  203. StatRedRate[r] = 0.0; //红球累计率
  204. sn[r] = r;
  205. }
  206. for(int b=0;b<17;b++){
  207. StatBlue[b] =0; //蓝球累计
  208. StatBlueRate[b] = 0.0; //蓝球累计率
  209. }
  210. int dd = 0;
  211. deleteflag = false;
  212. totalsn = 0;
  213. popnum = 20;
  214. //为预报工作作一些初始化
  215. for(int item=0;item<popnum;item++){
  216. for(int r=0;r<6;r++){
  217. ItemCountRed[item][r]=0;
  218. }
  219. ItemCountBlue[item]=0;
  220. ItemCountRedRate[item] =0;
  221. }
  222. MAXRATE = 20; //rate 排序前max的值
  223. thebest =0;
  224. yecefail = true;
  225. }
  226. //读历史数据
  227. void CShuangSeQiuDlg::ReadHistroy()
  228. {
  229. CHistoryReorcd chr;
  230. CString path = chr.GetCurPath();
  231. CString filename = path+ "\history.txt";
  232. line = chr.GetFileLine(filename);
  233. //分析每一行的数据,根据不同的内容,把值分到不同的数组中.
  234. for(int i=1;i<=line;i++){
  235. CString linestr= chr.GetLineActionFile(filename,i);
  236. int sub = linestr.Find(":",0);
  237. CString codestr = linestr.Mid(sub+1);
  238. CSpliter cSpliter;
  239. cSpliter.setdata(codestr);
  240. cSpliter.setsplitflag(",");
  241. CStringArray a;
  242. cSpliter.getsplitstrarray(a);
  243. int number_red=0;
  244. for(int r=0;r<6;r++){
  245. number_red = atoi(a.GetAt(r));
  246. StatRed[number_red] ++;
  247. }
  248. //把最后两期的号赋到全局数组中,以供预测时候比较.
  249. if(i == line-1){
  250. for(int p=0;p<6;p++){
  251. int sn =p;
  252. passval[sn] = atoi(a.GetAt(p));
  253. }
  254. }else if (i == line){
  255. for(int p=0;p<6;p++){
  256. int sn = 6+p;
  257. passval[sn] = atoi(a.GetAt(p));
  258. }
  259. }
  260. int number_blue = atoi(a.GetAt(6));
  261. StatBlue[number_blue] ++;
  262. }
  263. float RedTotolTime  = (float)6*line; //红球总出现次数
  264. float BlueTotolTime = (float)line; //蓝球总出现次数
  265. //计算机率
  266. for(int rr=1;rr<34;rr++){
  267. StatRedRate[rr] = (float)StatRed[rr] / RedTotolTime; //红球累计率
  268. }
  269. for(int br=1;br<17;br++){
  270. StatBlueRate[br] = (float)StatBlue[br] /BlueTotolTime; //蓝球累计率
  271. }
  272. }
  273. void CShuangSeQiuDlg::OnBtnYuce() 
  274. {
  275. yecefail = true;
  276. while(yecefail){
  277. //通过算法得到数值
  278. GAStudy();
  279. UpdateData(TRUE);
  280. int i =m_list.GetItemCount();
  281. CString str;
  282. str.Format("%d",totalsn+1);
  283. if (!yecefail){
  284. SetDlgItemText(IDC_STATIC_INFO,"信息:这是个可选号码!" );
  285. m_list.InsertItem(LVIF_TEXT|LVIF_STATE, i+1, str, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED, 0, 0);
  286. }
  287. if (!yecefail){
  288. for(int sub=0;sub<6;sub++){
  289. CString s="";
  290. s.Format("%d" ,sn[ ItemCountRed[thebest][sub] ]); 
  291. m_list.SetItemText(i,sub+1,s);
  292. }
  293. int blue = rand()%(16) + 1;
  294. CString bstr;
  295. bstr.Format("%d",blue);
  296. //兰色球号码,没有怎么做,随机了一个兰色球,哈...
  297. m_list.SetItemText(i,7,_T(bstr));
  298. totalsn ++;
  299. }
  300. UpdateData(FALSE);
  301. }
  302. }
  303. //开始GA学习
  304. void CShuangSeQiuDlg::GAStudy()
  305. {
  306. initpop(); //初始化种群
  307. int train_count =0;
  308. int totalval =118; //累加和
  309.     int bubiaole =0;
  310. int pre = 0;
  311. while( totalval < 75  || totalval > 125  ||  train_count< 10  )
  312. {
  313. totalval = 0; //初始化为0
  314. train_count++; //下一代
  315. ComputeFit(); //计算适应度
  316. SelectAndDeletePop(); //选择和淘汰种群
  317. CrossPop(); //交叉操作
  318. Mutation();         //变异操作
  319. thebest = GetResult(); //得到最优种群ID
  320. int val[6] ={0};
  321. for(int i=0;i<6;i++){
  322. val[i] = sn[ItemCountRed[thebest][i]];
  323. totalval = totalval + val[i];
  324. }
  325. if (pre == totalval){
  326. bubiaole ++;
  327. }else{
  328. pre = totalval;
  329. }
  330. if (bubiaole>10){
  331. //AfxMessageBox("出现不推荐号码已跳过,请继续预测!");
  332. SetDlgItemText(IDC_STATIC_INFO,"信息:出现不推荐号码已跳过,系统继续预测中......" );
  333. yecefail = true;
  334. break;
  335. }else{
  336. yecefail = false;
  337. }
  338. //比较与上两期差别
  339. int samecount =0;
  340. for(i=0;i<6;i++){
  341. for(int sn=0;sn<12;sn++){
  342. if( val[i] == passval[sn] ){
  343. samecount ++ ;
  344. if (samecount > 2 ){ //如果大于两个则,放弃这个预测
  345. yecefail = true;
  346. SetDlgItemText(IDC_STATIC_INFO,"信息:与上两期相似号跳过,系统继续预测中......" );
  347. break;
  348. }else{
  349. yecefail = false;
  350. }
  351. }
  352. }
  353. }
  354. int dd = 0;
  355. }
  356. }
  357. //初始化种群
  358. void CShuangSeQiuDlg::initpop()
  359. {
  360. //排序
  361. int tmp=0;
  362. for(int i=1;i<34;i++){
  363. for(int j=i+1;j<34;j++) 
  364. if( StatRedRate[sn[i]]  < StatRedRate[sn[j]] ) {
  365. tmp = sn[i];
  366. sn[i]= sn[j];
  367. sn[j] = tmp;
  368. }
  369. }
  370. //间接排序问题
  371. /*
  372. CStdioFile file; 
  373. file.Open("sort.txt",CFile::modeCreate|CFile::modeReadWrite); 
  374. int len = 34;
  375. for(i=1;i<len ;i++){
  376. CString rate,ratelist;
  377. ratelist.Format("%.8f",StatRedRate[sn[i]]);
  378. rate.Format("%d --",sn[i]);
  379. rate = rate + ratelist;
  380. file.WriteString(rate);
  381. file.WriteString("n");
  382. }
  383. file.Close();
  384. */
  385. srand(time(0));/*设置种子,并生成伪随机序列*/ 
  386. for(int pop=0;pop<popnum;pop++){
  387. for(int j=0;j<6;j++){
  388. bool same = true;
  389. int r =0;
  390. int min = 1;
  391. int diff=0;
  392. while(same){
  393. r = rand()%(MAXRATE) + min;
  394. for(int next=0 ;next<6; next++){
  395. if (r == ItemCountRed[pop][next] ){
  396. same =true;
  397. diff= 0;
  398. break;
  399. }else{
  400. diff ++;
  401. }
  402. }
  403. if (diff >= 5){
  404. same = false;
  405. }
  406. }
  407. ItemCountRed[pop][j] = r;
  408. }
  409. }
  410. CStdioFile file; 
  411. file.Open("pop.txt",CFile::modeCreate|CFile::modeReadWrite); 
  412. for(i=0;i<popnum ;i++){
  413. CString popn="";
  414. for(int j=0;j<6;j++){
  415. CString nextp="";
  416. nextp.Format("%d",sn[ItemCountRed[i][j]] );   //相当于rate.Format("%d --",sn[i]);
  417. popn = popn + " " + nextp;
  418. }
  419. file.WriteString(popn);
  420. file.WriteString("n");
  421. }
  422. file.Close();
  423. }
  424. //计算适应度
  425. void CShuangSeQiuDlg::ComputeFit()
  426. {
  427. for(int pop=0;pop<popnum;pop++){
  428. for(int j=0;j<6;j++){
  429. int cur = sn[ItemCountRed[pop][j]] ;
  430. ItemCountRedRate[pop] =ItemCountRedRate[pop] + StatRedRate[cur] ;
  431. }
  432. }
  433. CStdioFile file; 
  434. file.Open("poprate.txt",CFile::modeCreate|CFile::modeReadWrite); 
  435. for(int i=0;i<popnum ;i++){
  436. CString popn="";
  437. popn.Format("%.8f",ItemCountRedRate[i]);
  438. file.WriteString(popn);
  439. file.WriteString("n");
  440. }
  441. file.Close();
  442. }
  443. //选择和淘汰种群
  444. void CShuangSeQiuDlg::SelectAndDeletePop()
  445. {
  446. float maxrate =0;
  447. float minrate =1000; 
  448. for(int i=0;i<popnum ;i++){
  449. if (ItemCountRedRate[i] > maxrate){
  450. maxindex = i;
  451. maxrate = ItemCountRedRate[i] ;
  452. }
  453. if (ItemCountRedRate[i] < minrate){
  454. minindex = i;
  455. minrate = ItemCountRedRate[i] ;
  456. }
  457. }
  458. CStdioFile file; 
  459. CFileStatus   fs;   
  460. if(!CFile::GetStatus(_T("popselect.txt"),fs))   
  461. {   
  462. file.Open("popselect.txt",CFile::modeCreate|CFile::modeReadWrite); 
  463. }else{
  464. file.Open("popselect.txt",CFile::modeReadWrite); 
  465. }
  466. file.SeekToEnd();
  467. CString maxindexstr="";
  468. maxindexstr.Format("%d 最优的种群ID",maxindex);
  469. file.WriteString(maxindexstr);
  470. file.WriteString("n");
  471. CString minindexstr="";
  472. minindexstr.Format("%d 最差的种群ID",minindex);
  473. file.WriteString(minindexstr);
  474. file.WriteString("n");
  475. file.Close();
  476. }
  477. //交叉操作
  478. void CShuangSeQiuDlg::CrossPop()
  479. {
  480. srand(time(0));
  481. int min =0;
  482. int r = 0; //随机一个种群号
  483. CStdioFile file; 
  484. file.Open("CrossPop.txt",CFile::modeCreate|CFile::modeReadWrite); 
  485. file.SeekToEnd();
  486. CString rr="";
  487. rr.Format("%d",minindex);
  488. CString crossstr="最差的 minindex=" + rr + "n";
  489. for(int i=0;i<6;i++){
  490. CString s="";
  491. s.Format("%d" ,sn[ ItemCountRed[minindex][i] ]); 
  492. crossstr = crossstr + s  + " ";
  493. }
  494. file.WriteString(crossstr);
  495. file.WriteString("n");
  496. bool nextthreesame = true;
  497. //如果随机的后三位和最优的前三位不同就可以
  498. while(nextthreesame){
  499. r = rand()%(popnum) + min; //从种群20中随机一个种群号
  500. int cuti= 3;
  501. int cutb =0;
  502. for(cuti=3;cuti<6;cuti++){ //随机的后三位
  503. for(cutb=0;cutb<3;cutb++){//最优的前三位比较
  504. if(sn[ ItemCountRed[r][cuti] ] == sn[ ItemCountRed[maxindex][cutb] ]){
  505. nextthreesame = true; //有相同的,则要重新找随机种群
  506. break;
  507. }
  508. }
  509. }
  510. if(cuti == 6 && cutb == 3){
  511. nextthreesame = false;
  512. }
  513. }
  514. //用最好的种群和随机的种群进行杂交,替换最差的种群的前三位值
  515. for(int cutb=0;cutb<3;cutb++){
  516. ItemCountRed[minindex][cutb] = ItemCountRed[maxindex][cutb] ;
  517. }
  518. for(int cuti=3;cuti<6;cuti++){
  519. ItemCountRed[minindex][cuti] = ItemCountRed[r][cuti] ;
  520. }
  521. rr.Format("%d",r);
  522. crossstr="随机 r=" + rr + "n";
  523. for(i=0;i<6;i++){
  524. CString s="";
  525. s.Format("%d" ,sn[ ItemCountRed[r][i] ]); 
  526. crossstr = crossstr + s+ " ";
  527. }
  528. file.WriteString(crossstr);
  529. file.WriteString("n");
  530. rr.Format("%d",maxindex);
  531. crossstr="最好的 maxindex=" + rr + "n";
  532. for(i=0;i<6;i++){
  533. CString s="";
  534. s.Format("%d" ,sn[ ItemCountRed[maxindex][i] ]); 
  535. crossstr = crossstr + s + " ";
  536. }
  537. file.WriteString(crossstr);
  538. file.WriteString("n");
  539. rr.Format("%d",minindex);
  540. crossstr="新的 minindex=" + rr + "n";
  541. for(i=0;i<6;i++){
  542. CString s="";
  543. s.Format("%d" ,sn[ ItemCountRed[minindex][i] ]); 
  544. crossstr = crossstr + s + " ";
  545. }
  546. file.WriteString(crossstr);
  547. file.WriteString("n");
  548. file.Close();
  549. }
  550. //变异操作
  551. void CShuangSeQiuDlg::Mutation()
  552. {
  553. float r = (float)rand()/65535 ;
  554. int min =0;
  555. int opindex = 0;
  556. if(r<0.4){
  557. opindex = rand()%(MAXRATE) + min; //从最优号码里面选一个号
  558. ItemCountRed[minindex][0] = opindex;
  559. }else if (r<0.8){
  560. opindex = rand()%(33) + min; //从全部号里面选一个号
  561. ItemCountRed[minindex][5] = opindex;
  562. }else{
  563. opindex = rand()%(33) + MAXRATE; //从最差号中选一个号
  564. ItemCountRed[minindex][5] = opindex;
  565. }
  566. CStdioFile file; 
  567. file.Open("Mutation.txt",CFile::modeCreate|CFile::modeReadWrite); 
  568. CString rr="";
  569. rr.Format("%.8f", r);
  570. CString crossstr="随机 r = " + rr + "n";
  571. file.WriteString(crossstr);
  572. file.WriteString("n");
  573. if(r<0.5){
  574. rr.Format("%d", opindex);
  575. crossstr="最优选号 opindex = " + rr + "n";
  576. file.WriteString(crossstr);
  577. file.WriteString("n");
  578. }else{
  579. rr.Format("%d", opindex);
  580. crossstr="全部选号 opindex = " + rr + "n";
  581. file.WriteString(crossstr);
  582. file.WriteString("n");
  583. }
  584. crossstr="变异后n";
  585. for(int i=0;i<6;i++){
  586. CString s="";
  587. s.Format("%d" ,sn[ ItemCountRed[minindex][i] ]); 
  588. crossstr = crossstr + s + " ";
  589. }
  590. file.WriteString(crossstr);
  591. file.WriteString("n");
  592. file.Close();
  593. }
  594. //得到最优的遗传结果
  595. int CShuangSeQiuDlg::GetResult()
  596. {
  597. int thebestpop =0;
  598. for(int pop=0;pop<popnum;pop++){
  599. ItemCountRedRate[pop] =0;
  600. for(int j=0;j<6;j++){
  601. int cur = sn[ItemCountRed[pop][j]] ;
  602. ItemCountRedRate[pop] =ItemCountRedRate[pop] + StatRedRate[cur] ;
  603. }
  604. }
  605. CStdioFile file; 
  606. file.Open("poprateget.txt",CFile::modeCreate|CFile::modeReadWrite); 
  607. for(int i=0;i<popnum ;i++){
  608. CString popn="";
  609. popn.Format("%.8f",ItemCountRedRate[i]);
  610. file.WriteString(popn);
  611. file.WriteString("n");
  612. }
  613. float maxrate =0;
  614. for(i=0;i<popnum ;i++){
  615. if (ItemCountRedRate[i] > maxrate){
  616. maxindex = i;
  617. maxrate = ItemCountRedRate[i] ;
  618. }
  619. }
  620. CString thebest = "";
  621. thebest.Format("%d",maxindex);
  622. file.WriteString(thebest);
  623. file.WriteString("n");
  624. CString crossstr="最优的种群为:n";
  625. for(i=0;i<6;i++){
  626. CString s="";
  627. s.Format("%d" ,sn[ ItemCountRed[maxindex][i] ]); 
  628. crossstr = crossstr + s + " ";
  629. }
  630. file.WriteString(crossstr);
  631. file.WriteString("n");
  632. file.Close();
  633. thebestpop = maxindex;
  634. return thebestpop;
  635. }
  636. //新增历史
  637. void CShuangSeQiuDlg::OnBtnAdd() 
  638. {
  639. CAddHistoryDlg adddlg;
  640. if (adddlg.DoModal()){
  641. //重新初始化;
  642. initVar();
  643. //重新导入记录;
  644. ReadHistroy();
  645. }
  646. }
  647. //查看历史
  648. void CShuangSeQiuDlg::OnBtnViewhistory() 
  649. {
  650. WinExec("Notepad.exe history.txt", SW_SHOW);
  651. }
  652. //保存号码
  653. void CShuangSeQiuDlg::OnBtnSave() 
  654. {
  655. CStdioFile file; 
  656. file.Open("save.txt",CFile::modeCreate|CFile::modeReadWrite); 
  657. int len = m_list.GetItemCount();
  658. for(int i=0;i<len ;i++){
  659. CString codeline;
  660. for(int j=1;j<8;j++){
  661. CString code = m_list.GetItemText(i,j);
  662. codeline = codeline + code + "  ";
  663. }
  664. file.WriteString(codeline);
  665. file.WriteString("n");
  666. }
  667. file.Close();
  668. WinExec("Notepad.exe save.txt", SW_SHOW);
  669. }
  670. //历史统计
  671. void CShuangSeQiuDlg::OnBtnHistorystat() 
  672. {
  673. CStdioFile file; 
  674. file.Open("historystat.txt",CFile::modeCreate|CFile::modeReadWrite); 
  675. CString redt;
  676. redt.Format("%d",line);
  677. CString rss = "现在总期数 " + redt+ "期.n" ;
  678. file.WriteString(rss);
  679. for(int r =1;r<34;r++){
  680. CString rstr,rn;
  681. rstr.Format("%d",r);
  682. rn.Format("%d",StatRed[r]);
  683. CString rp = "红" + rstr + " 出现 " + rn+ "次.";
  684. CString redrate;
  685. redrate.Format("%.8f",StatRedRate[r]);
  686. rp = rp + " 出现率为" + redrate + "n";
  687. file.WriteString(rp);
  688. }
  689. file.WriteString("n***********************n");
  690. CString bluet;
  691. bluet.Format("%d",line);
  692. CString bss = "兰球共出现 " + bluet+ "次.n" ;
  693. file.WriteString(bss);
  694. for(int b=1;b<17;b++){
  695. CString bstr,bn;
  696. bstr.Format("%d",b);
  697. bn.Format("%d",StatBlue[b]);
  698. CString bp = "兰" + bstr + " 出现 " + bn+ "次.";
  699. CString bluerate;
  700. bluerate.Format("%.8f",StatBlueRate[b]);
  701. bp = bp + " 出现率为" + bluerate + "n";
  702. file.WriteString(bp);
  703. }
  704. file.Close();
  705. WinExec("Notepad.exe historystat.txt", SW_SHOW);
  706. }
  707. void CShuangSeQiuDlg::OnClickCodelist(NMHDR* pNMHDR, LRESULT* pResult) 
  708. {
  709. POSITION   Pos   =   m_list.GetFirstSelectedItemPosition(); 
  710. cursel   =   m_list.GetNextSelectedItem(Pos);  
  711. *pResult = 0;
  712. }
  713. LRESULT CShuangSeQiuDlg::PopulateComboList(WPARAM wParam, LPARAM lParam)
  714. {
  715. // Get the Combobox window pointer
  716. CComboBox* pInPlaceCombo = static_cast<CComboBox*> (GetFocus());
  717. // Get the inplace combbox top left
  718. CRect obWindowRect;
  719. pInPlaceCombo->GetWindowRect(&obWindowRect);
  720. CPoint obInPlaceComboTopLeft(obWindowRect.TopLeft()); 
  721. m_list.GetWindowRect(&obWindowRect);
  722. int iColIndex = (int )wParam;
  723. CStringList* pComboList = reinterpret_cast<CStringList*>(lParam);
  724. pComboList->RemoveAll(); 
  725. if (obWindowRect.PtInRect(obInPlaceComboTopLeft)) 
  726. {
  727. if(iColIndex==2)  //对combox 列进行操作
  728. {
  729. // for(int i =0;i<ACTNUM;i++){
  730. // pComboList->AddTail(actstr[i]);
  731. // }
  732. }
  733. }
  734. return true;
  735. }
  736. LRESULT CShuangSeQiuDlg::OnEndLabelEditVariableCriteria(WPARAM wParam, LPARAM lParam)
  737. {
  738. LV_DISPINFO* pDispInfo = (LV_DISPINFO*)lParam;
  739. return 1;
  740. }
  741. void CShuangSeQiuDlg::OnBtnHistory() 
  742. {
  743. }
  744. void CShuangSeQiuDlg::OnBtnDelete() 
  745. {
  746. m_list.DeleteItem(cursel);
  747. }
  748. //为什么不进这个函数
  749. LRESULT CShuangSeQiuDlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
  750. {
  751. //This code based on Michael Dunn's excellent article on
  752. //list control custom draw at http://www.codeproject.com/listctrl/lvcustomdraw.asp
  753. NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
  754.     // Take the default processing unless we set this to something else below.
  755.     *pResult = CDRF_DODEFAULT;
  756.     // First thing - check the draw stage. If it's the control's prepaint
  757.     // stage, then tell Windows we want messages for every item.
  758. if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
  759. {
  760.         *pResult = CDRF_NOTIFYITEMDRAW;
  761. }
  762.     else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
  763. {
  764.         // This is the notification message for an item.  We'll request
  765.         // notifications before each subitem's prepaint stage.
  766.         *pResult = CDRF_NOTIFYSUBITEMDRAW;
  767. }
  768.     else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
  769. {
  770. COLORREF clrNewTextColor, clrNewBkColor;
  771.         
  772. int    nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
  773. CString strTemp = m_list.GetItemText(nItem,pLVCD->iSubItem);
  774. clrNewTextColor = RGB(255,0,0); //Set the text to red
  775. clrNewBkColor = RGB(255,255,0); //Set the bkgrnd color to blue
  776. pLVCD->clrText = clrNewTextColor;
  777. pLVCD->clrTextBk = clrNewBkColor;
  778.         
  779.         // Tell Windows to paint the control itself.
  780.         *pResult = CDRF_DODEFAULT;
  781.         
  782.         
  783. }
  784. return 1;
  785. }