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

📄 shuangseqiudlg.cpp

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

			int r =0;
			int min = 1;

			int diff=0;
			while(same){
				r = rand()%(MAXRATE) + min;
				for(int next=0 ;next<6; next++){
					if (r == ItemCountRed[pop][next] ){
						same =true;
						diff= 0;
						break;
					}else{
						diff ++;
					}
				}
				if (diff >= 5){
					same = false;
				}
			}
			ItemCountRed[pop][j] = r;	
		}
	}	

	CStdioFile file; 
	file.Open("pop.txt",CFile::modeCreate|CFile::modeReadWrite); 
	for(i=0;i<popnum ;i++){
		CString popn="";

		for(int j=0;j<6;j++){			
			CString nextp="";
			nextp.Format("%d",sn[ItemCountRed[i][j]] );   //相当于rate.Format("%d --",sn[i]);
			popn = popn + " " + nextp;

		}
		file.WriteString(popn);
		file.WriteString("\n");
	}
	file.Close();


}


//计算适应度
void CShuangSeQiuDlg::ComputeFit()
{
	for(int pop=0;pop<popnum;pop++){
		for(int j=0;j<6;j++){
			int cur = sn[ItemCountRed[pop][j]] ;
			ItemCountRedRate[pop] =ItemCountRedRate[pop] + StatRedRate[cur] ;
		}		
	}


	CStdioFile file; 
	file.Open("poprate.txt",CFile::modeCreate|CFile::modeReadWrite); 
	for(int i=0;i<popnum ;i++){
		CString popn="";
		popn.Format("%.8f",ItemCountRedRate[i]);
		file.WriteString(popn);
		file.WriteString("\n");
	}
	file.Close();
}



//选择和淘汰种群
void CShuangSeQiuDlg::SelectAndDeletePop()
{
	float maxrate =0;
	float minrate =1000; 


	for(int i=0;i<popnum ;i++){
		if (ItemCountRedRate[i] > maxrate){
			maxindex = i;
			maxrate = ItemCountRedRate[i] ;
		}
		if (ItemCountRedRate[i] < minrate){
			minindex = i;
			minrate = ItemCountRedRate[i] ;
		}
	}

	CStdioFile file; 

	CFileStatus   fs;   
	if(!CFile::GetStatus(_T("popselect.txt"),fs))   
	{   		
		file.Open("popselect.txt",CFile::modeCreate|CFile::modeReadWrite); 
	}else{
		file.Open("popselect.txt",CFile::modeReadWrite); 
	}


	

	file.SeekToEnd();

	CString maxindexstr="";
	maxindexstr.Format("%d 最优的种群ID",maxindex);
	file.WriteString(maxindexstr);
	file.WriteString("\n");

	CString minindexstr="";
	minindexstr.Format("%d 最差的种群ID",minindex);
	file.WriteString(minindexstr);
	file.WriteString("\n");

	file.Close();
	
}

//交叉操作
void CShuangSeQiuDlg::CrossPop()
{
	srand(time(0));
	int min =0;
	int r = 0;		//随机一个种群号

	CStdioFile file; 
	file.Open("CrossPop.txt",CFile::modeCreate|CFile::modeReadWrite); 
	
	file.SeekToEnd();

	CString rr="";
	rr.Format("%d",minindex);
	CString crossstr="最差的 minindex=" + rr + "\n";

	for(int i=0;i<6;i++){
		CString s="";
		s.Format("%d" ,sn[ ItemCountRed[minindex][i] ]); 
		crossstr = crossstr + s  + " ";
	}
	file.WriteString(crossstr);
	file.WriteString("\n");


	bool nextthreesame = true;

	//如果随机的后三位和最优的前三位不同就可以
	while(nextthreesame){
		r = rand()%(popnum) + min;	//从种群20中随机一个种群号
		int cuti= 3;
		int cutb =0;
		for(cuti=3;cuti<6;cuti++){	//随机的后三位
			for(cutb=0;cutb<3;cutb++){//最优的前三位比较
				if(sn[ ItemCountRed[r][cuti] ] == sn[ ItemCountRed[maxindex][cutb] ]){
					nextthreesame = true;		//有相同的,则要重新找随机种群
					break;
				}
			}
		}
		if(cuti == 6 && cutb == 3){
			nextthreesame = false;
		}
	}


	//用最好的种群和随机的种群进行杂交,替换最差的种群的前三位值
	for(int cutb=0;cutb<3;cutb++){
		ItemCountRed[minindex][cutb] = ItemCountRed[maxindex][cutb] ;
	}

	for(int cuti=3;cuti<6;cuti++){
		ItemCountRed[minindex][cuti] = ItemCountRed[r][cuti] ;
	}


	rr.Format("%d",r);
	crossstr="随机 r=" + rr + "\n";
	for(i=0;i<6;i++){
		CString s="";
		s.Format("%d" ,sn[ ItemCountRed[r][i] ]); 
		crossstr = crossstr + s+ " ";
	}
	file.WriteString(crossstr);
	file.WriteString("\n");

	rr.Format("%d",maxindex);
	crossstr="最好的 maxindex=" + rr + "\n";
	for(i=0;i<6;i++){
		CString s="";
		s.Format("%d" ,sn[ ItemCountRed[maxindex][i] ]); 
		crossstr = crossstr + s + " ";
	}
	file.WriteString(crossstr);
	file.WriteString("\n");

	rr.Format("%d",minindex);
	crossstr="新的 minindex=" + rr + "\n";
	for(i=0;i<6;i++){
		CString s="";
		s.Format("%d" ,sn[ ItemCountRed[minindex][i] ]); 
		crossstr = crossstr + s + " ";
	}
	file.WriteString(crossstr);
	file.WriteString("\n");

	file.Close();

}


//变异操作	
void CShuangSeQiuDlg::Mutation()
{

	float r = (float)rand()/65535 ;
	int min =0;
	int	opindex = 0;

	if(r<0.4){
		opindex = rand()%(MAXRATE) + min;		//从最优号码里面选一个号
		ItemCountRed[minindex][0] = opindex;
	}else if (r<0.8){
		opindex = rand()%(33) + min;			//从全部号里面选一个号
		ItemCountRed[minindex][5] = opindex;
	}else{
		opindex = rand()%(33) + MAXRATE;		//从最差号中选一个号
		ItemCountRed[minindex][5] = opindex;
	}


	
	CStdioFile file; 
	file.Open("Mutation.txt",CFile::modeCreate|CFile::modeReadWrite); 

	CString rr="";
	rr.Format("%.8f", r);
	CString crossstr="随机 r = " + rr + "\n";
	file.WriteString(crossstr);
	file.WriteString("\n");
	if(r<0.5){
		rr.Format("%d", opindex);
		crossstr="最优选号 opindex = " + rr + "\n";
		file.WriteString(crossstr);
		file.WriteString("\n");
	}else{
		rr.Format("%d", opindex);
		crossstr="全部选号 opindex = " + rr + "\n";
		file.WriteString(crossstr);
		file.WriteString("\n");
	}


	crossstr="变异后\n";
	for(int i=0;i<6;i++){
		CString s="";
		s.Format("%d" ,sn[ ItemCountRed[minindex][i] ]); 
		crossstr = crossstr + s + " ";
	}
	file.WriteString(crossstr);
	file.WriteString("\n");

	file.Close();

	
}

//得到最优的遗传结果
int CShuangSeQiuDlg::GetResult()
{
	int thebestpop =0;

	for(int pop=0;pop<popnum;pop++){
		ItemCountRedRate[pop] =0;
		for(int j=0;j<6;j++){
			int cur = sn[ItemCountRed[pop][j]] ;
			ItemCountRedRate[pop] =ItemCountRedRate[pop] + StatRedRate[cur] ;
		}		
	}

	CStdioFile file; 
	file.Open("poprateget.txt",CFile::modeCreate|CFile::modeReadWrite); 
	for(int i=0;i<popnum ;i++){
		CString popn="";
		popn.Format("%.8f",ItemCountRedRate[i]);
		file.WriteString(popn);
		file.WriteString("\n");
	}


	float maxrate =0;
	for(i=0;i<popnum ;i++){
		if (ItemCountRedRate[i] > maxrate){
			maxindex = i;
			maxrate = ItemCountRedRate[i] ;
		}
	}
	
	CString thebest = "";
	thebest.Format("%d",maxindex);
	file.WriteString(thebest);
	file.WriteString("\n");

	CString crossstr="最优的种群为:\n";
	for(i=0;i<6;i++){
		CString s="";
		s.Format("%d" ,sn[ ItemCountRed[maxindex][i] ]); 
		crossstr = crossstr + s + " ";
	}
	file.WriteString(crossstr);
	file.WriteString("\n");
	file.Close();

	thebestpop = maxindex;
	return thebestpop;
}


//新增历史
void CShuangSeQiuDlg::OnBtnAdd() 
{
	CAddHistoryDlg adddlg;
	if (adddlg.DoModal()){
		//重新初始化;
		initVar();
		//重新导入记录;
		ReadHistroy();
	}
}


//查看历史
void CShuangSeQiuDlg::OnBtnViewhistory() 
{
	WinExec("Notepad.exe history.txt", SW_SHOW);	
}

//保存号码
void CShuangSeQiuDlg::OnBtnSave() 
{

	CStdioFile file; 
	file.Open("save.txt",CFile::modeCreate|CFile::modeReadWrite); 

	int len = m_list.GetItemCount();
	for(int i=0;i<len ;i++){
		CString codeline;
		for(int j=1;j<8;j++){
			CString code = m_list.GetItemText(i,j);
			codeline = codeline + code + "  ";
		}
		file.WriteString(codeline);
		file.WriteString("\n");
	}
	file.Close();

	WinExec("Notepad.exe save.txt", SW_SHOW);	
	
}

//历史统计
void CShuangSeQiuDlg::OnBtnHistorystat() 
{
	CStdioFile file; 
	file.Open("historystat.txt",CFile::modeCreate|CFile::modeReadWrite); 

	CString redt;
	redt.Format("%d",line);
	
	CString rss = "现在总期数 " + redt+ "期.\n" ;


	file.WriteString(rss);

	for(int r =1;r<34;r++){		
		CString rstr,rn;
		rstr.Format("%d",r);
		rn.Format("%d",StatRed[r]);
		CString rp = "红" + rstr + " 出现 " + rn+ "次.";

		CString redrate;
		redrate.Format("%.8f",StatRedRate[r]);
		rp = rp + " 出现率为" + redrate + "\n";

		file.WriteString(rp);
	}	

	file.WriteString("\n***********************\n");

	CString bluet;
	bluet.Format("%d",line);
	CString bss = "兰球共出现 " + bluet+ "次.\n" ;
	file.WriteString(bss);

	for(int b=1;b<17;b++){		
		CString bstr,bn;
		bstr.Format("%d",b);
		bn.Format("%d",StatBlue[b]);
		CString bp = "兰" + bstr + " 出现 " + bn+ "次.";
		CString bluerate;
		bluerate.Format("%.8f",StatBlueRate[b]);
		bp = bp + " 出现率为" + bluerate + "\n";
		file.WriteString(bp);
	}


	file.Close();
	WinExec("Notepad.exe historystat.txt", SW_SHOW);	

}



void CShuangSeQiuDlg::OnClickCodelist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	POSITION   Pos   =   m_list.GetFirstSelectedItemPosition(); 	
	cursel   =   m_list.GetNextSelectedItem(Pos);  


	*pResult = 0;
}


LRESULT CShuangSeQiuDlg::PopulateComboList(WPARAM wParam, LPARAM lParam)
{
	// Get the Combobox window pointer
	CComboBox* pInPlaceCombo = static_cast<CComboBox*> (GetFocus());

	// Get the inplace combbox top left
	CRect obWindowRect;

	pInPlaceCombo->GetWindowRect(&obWindowRect);

	CPoint obInPlaceComboTopLeft(obWindowRect.TopLeft()); 

	m_list.GetWindowRect(&obWindowRect);

	int iColIndex = (int )wParam;

	CStringList* pComboList = reinterpret_cast<CStringList*>(lParam);
	pComboList->RemoveAll(); 

	if (obWindowRect.PtInRect(obInPlaceComboTopLeft)) 
	{				
		if(iColIndex==2)  //对combox 列进行操作
		{
		//	for(int i =0;i<ACTNUM;i++){
		//		pComboList->AddTail(actstr[i]);
		//	}
		}			
	}
	return true;
}

LRESULT CShuangSeQiuDlg::OnEndLabelEditVariableCriteria(WPARAM wParam, LPARAM lParam)
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)lParam;
	
	return 1;
}

void CShuangSeQiuDlg::OnBtnHistory() 
{

}

void CShuangSeQiuDlg::OnBtnDelete() 
{
	m_list.DeleteItem(cursel);	
}

//为什么不进这个函数
LRESULT CShuangSeQiuDlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
{
	//This code based on Michael Dunn's excellent article on
	//list control custom draw at http://www.codeproject.com/listctrl/lvcustomdraw.asp

	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );

    // Take the default processing unless we set this to something else below.
    *pResult = CDRF_DODEFAULT;

    // First thing - check the draw stage. If it's the control's prepaint
    // stage, then tell Windows we want messages for every item.
	if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
	{
        *pResult = CDRF_NOTIFYITEMDRAW;
	}
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
	{
        // This is the notification message for an item.  We'll request
        // notifications before each subitem's prepaint stage.
		
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
	}
    else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
	{
		
		COLORREF clrNewTextColor, clrNewBkColor;
        
		int    nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );

		CString strTemp = m_list.GetItemText(nItem,pLVCD->iSubItem);


		clrNewTextColor = RGB(255,0,0);		//Set the text to red
		clrNewBkColor = RGB(255,255,0);		//Set the bkgrnd color to blue
	


		pLVCD->clrText = clrNewTextColor;
		pLVCD->clrTextBk = clrNewBkColor;
		
        
        // Tell Windows to paint the control itself.
        *pResult = CDRF_DODEFAULT;
        
        
	}


	return 1;
}



⌨️ 快捷键说明

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