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