📄 遗传算法view.cpp
字号:
if(pDoc1->Newpop[i].chrom[3] == pDoc1->Cankao[j].chrom[3])
N++;
if(pDoc1->Newpop[i].chrom[4] == pDoc1->Cankao[j].chrom[4])
N++;
if((pDoc1->Newpop[i].chrom[5] == pDoc1->Cankao[j].chrom[5])&&(pDoc1->Newpop[i].chrom[6] == pDoc1->Cankao[j].chrom[6]))
N++;
}
else
{
if((pDoc1->Newpop[i].chrom[0] == pDoc1->Cankao[j].chrom[0])&&(pDoc1->Newpop[i].chrom[1] == pDoc1->Cankao[j].chrom[1]))
M++;
if(pDoc1->Newpop[i].chrom[3] == pDoc1->Cankao[j].chrom[3])
M++;
if(pDoc1->Newpop[i].chrom[4] == pDoc1->Cankao[j].chrom[4])
M++;
if((pDoc1->Newpop[i].chrom[5] == pDoc1->Cankao[j].chrom[5])&&(pDoc1->Newpop[i].chrom[6] == pDoc1->Cankao[j].chrom[6]))
M++;
}
}
M++;//M加1,防止被除数为0
pDoc1->Newpop[i].fitness=(float)N/M;
pDoc1->Oldpop[i].fitness=pDoc1->Newpop[i].fitness;
}
m_fit1=pDoc1->Newpop[1].fitness;
m_fit2=pDoc1->Newpop[2].fitness;
m_fit3=pDoc1->Newpop[3].fitness;
m_fit4=pDoc1->Newpop[4].fitness;
UpdateData(FALSE);
}
/********************选择适应度最小的两个元素随机交叉**********************/
void CMyView::OnSelect()
{
CMyDoc* pDoc1=GetDocument();
int Fmin,Smin;
int i=1,j,temp;
Fmin=1;
Smin=2;
for(i=2;i<=4;i++)
{
if(pDoc1->Newpop[i].fitness<=pDoc1->Newpop[Fmin].fitness)
{
Smin=Fmin;
Fmin=i;
}
else
if(pDoc1->Newpop[i].fitness<=pDoc1->Newpop[Smin].fitness)
Smin=i;
}
m_Fmin=Fmin;
m_Smin=Smin;
UpdateData(FALSE);
pDoc1->xi1=Fmin;
pDoc1->xi2=Smin;
int cross;
cross=rand()%7;//随机选取交叉点
m_crossport=cross;
UpdateData(FALSE);
for(j=cross;j<=6;j++)
{
temp=pDoc1->Newpop[pDoc1->xi1].chrom[j];
pDoc1->Newpop[pDoc1->xi1].chrom[j]=pDoc1->Newpop[pDoc1->xi2].chrom[j];
pDoc1->Newpop[pDoc1->xi2].chrom[j]=temp;
}
OnFitcompute();
DeCode();
}
/************************解码在屏幕上显示************************/
void CMyView::DeCode()
{
CMyDoc* pDoc1=GetDocument();
if((pDoc1->Newpop[1].chrom[0] == 0)&&(pDoc1->Newpop[1].chrom[1] == 0))
m_11="20-30w";
else if((pDoc1->Newpop[1].chrom[0] == 0)&&(pDoc1->Newpop[1].chrom[1] == 1))
m_11="30-40w";
else if((pDoc1->Newpop[1].chrom[0] == 1)&&(pDoc1->Newpop[1].chrom[1] == 0))
m_11="40-50w";
else if((pDoc1->Newpop[1].chrom[0] == 1)&&(pDoc1->Newpop[1].chrom[1] == 1))
m_11="50-60w";
else
m_11="?";
if(pDoc1->Newpop[1].chrom[2] == 0)
m_12="no";
else
m_12="yes";
if(pDoc1->Newpop[1].chrom[3] == 0)
m_13="no";
else
m_13="yes";
if(pDoc1->Newpop[1].chrom[4] == 0)
m_14="woman";
else
m_14="man";
if((pDoc1->Newpop[1].chrom[5] == 0)&&(pDoc1->Newpop[1].chrom[6] == 0))
m_15="20-29";
else if((pDoc1->Newpop[1].chrom[5] == 0)&&(pDoc1->Newpop[1].chrom[6] == 1))
m_15="30-39";
else if((pDoc1->Newpop[1].chrom[5] == 1)&&(pDoc1->Newpop[1].chrom[6] == 0))
m_15="40-49";
else if((pDoc1->Newpop[1].chrom[5] == 1)&&(pDoc1->Newpop[1].chrom[6] == 1))
m_15="50-59";
else
m_15="?";
////////////////////////////////////////////
if((pDoc1->Newpop[2].chrom[0] == 0)&&(pDoc1->Newpop[2].chrom[1] == 0))
m_21="20-30w";
else if((pDoc1->Newpop[2].chrom[0] == 0)&&(pDoc1->Newpop[2].chrom[1] == 1))
m_21="30-40w";
else if((pDoc1->Newpop[2].chrom[0] == 1)&&(pDoc1->Newpop[2].chrom[1] == 0))
m_21="40-50w";
else if((pDoc1->Newpop[2].chrom[0] == 1)&&(pDoc1->Newpop[2].chrom[1] == 1))
m_21="50-60w";
else
m_21="?";
if(pDoc1->Newpop[2].chrom[2] == 0)
m_22="no";
else
m_22="yes";
if(pDoc1->Newpop[2].chrom[3] == 0)
m_23="no";
else
m_23="yes";
if(pDoc1->Newpop[2].chrom[4] == 0)
m_24="woman";
else
m_24="man";
if((pDoc1->Newpop[2].chrom[5] == 0)&&(pDoc1->Newpop[2].chrom[6] == 0))
m_25="20-29";
else if((pDoc1->Newpop[2].chrom[5] == 0)&&(pDoc1->Newpop[2].chrom[6] == 1))
m_25="30-39";
else if((pDoc1->Newpop[2].chrom[5] == 1)&&(pDoc1->Newpop[2].chrom[6] == 0))
m_25="40-49";
else if((pDoc1->Newpop[2].chrom[5] == 1)&&(pDoc1->Newpop[2].chrom[6] == 1))
m_25="50-59";
else
m_25="?";
//////////////////////////////////////////////
if((pDoc1->Newpop[3].chrom[0] == 0)&&(pDoc1->Newpop[3].chrom[1] == 0))
m_31="20-30w";
else if((pDoc1->Newpop[3].chrom[0] == 0)&&(pDoc1->Newpop[3].chrom[1] == 1))
m_31="30-40w";
else if((pDoc1->Newpop[3].chrom[0] == 1)&&(pDoc1->Newpop[3].chrom[1] == 0))
m_31="40-50w";
else if((pDoc1->Newpop[3].chrom[0] == 1)&&(pDoc1->Newpop[3].chrom[1] == 1))
m_31="50-60w";
else
m_31="?";
if(pDoc1->Newpop[3].chrom[2] == 0)
m_32="no";
else
m_32="yes";
if(pDoc1->Newpop[3].chrom[3] == 0)
m_33="no";
else
m_33="yes";
if(pDoc1->Newpop[3].chrom[4] == 0)
m_34="woman";
else
m_34="man";
if((pDoc1->Newpop[3].chrom[5] == 0)&&(pDoc1->Newpop[3].chrom[6] == 0))
m_35="20-29";
else if((pDoc1->Newpop[3].chrom[5] == 0)&&(pDoc1->Newpop[3].chrom[6] == 1))
m_35="30-39";
else if((pDoc1->Newpop[3].chrom[5] == 1)&&(pDoc1->Newpop[3].chrom[6] == 0))
m_35="40-49";
else if((pDoc1->Newpop[3].chrom[5] == 1)&&(pDoc1->Newpop[3].chrom[6] == 1))
m_35="50-59";
else
m_35="?";
////////////////////////////////////////////
if((pDoc1->Newpop[4].chrom[0] == 0)&&(pDoc1->Newpop[4].chrom[1] == 0))
m_41="20-30w";
else if((pDoc1->Newpop[4].chrom[0] == 0)&&(pDoc1->Newpop[4].chrom[1] == 1))
m_41="30-40w";
else if((pDoc1->Newpop[4].chrom[0] == 1)&&(pDoc1->Newpop[4].chrom[1] == 0))
m_41="40-50w";
else if((pDoc1->Newpop[4].chrom[0] == 1)&&(pDoc1->Newpop[4].chrom[1] == 1))
m_41="50-60w";
else
m_41="?";
if(pDoc1->Newpop[4].chrom[2] == 0)
m_42="no";
else
m_42="yes";
if(pDoc1->Newpop[4].chrom[3] == 0)
m_43="no";
else
m_43="yes";
if(pDoc1->Newpop[4].chrom[4] == 0)
m_44="woman";
else
m_44="man";
if((pDoc1->Newpop[4].chrom[5] == 0)&&(pDoc1->Newpop[4].chrom[6] == 0))
m_45="20-29";
else if((pDoc1->Newpop[4].chrom[5] == 0)&&(pDoc1->Newpop[4].chrom[6] == 1))
m_45="30-39";
else if((pDoc1->Newpop[4].chrom[5] == 1)&&(pDoc1->Newpop[4].chrom[6] == 0))
m_45="40-49";
else if((pDoc1->Newpop[4].chrom[5] == 1)&&(pDoc1->Newpop[4].chrom[6] == 1))
m_45="50-59";
else
m_45="?";
//////////////////////////////////////////////////
UpdateData(FALSE);
}
/****************选择适应度最小的元素随机变异*****************/
void CMyView::OnMutation()
{
CMyDoc* pDoc1=GetDocument();
int Min;
int i=1;
Min=1;
//////////////////////////////////////////
for(i=2;i<=4;i++)
if(pDoc1->Newpop[i].fitness<=pDoc1->Newpop[Min].fitness)
Min=i;
m_mute=Min;
UpdateData(FALSE);
int j;
j=rand()%7;//随机选择变异点
m_muteport=j;
UpdateData(FALSE);
if(pDoc1->Newpop[Min].chrom[j] == 1)
pDoc1->Newpop[Min].chrom[j]=0;
else
pDoc1->Newpop[Min].chrom[j]=1;
OnFitcompute();
DeCode();
}
/***************循环执行交叉和变异操作****************/
void CMyView::OnXunhuan()
{
int i,k;
CMyDoc* pDoc1=GetDocument();
k=0;
while(k<4)
{
OnSelect();
OnMutation();
k=0;
for(i=1;i<=4;i++)
if(pDoc1->Newpop[i].fitness>2)
k++;
}
}
void CMyView::OnXunhuan2()
{
int i=0;
while(i<100)
{
OnSelect();
OnMutation();
i++;
}
}
/*************输入新的元素,显示与其最接近的元素****************/
void CMyView::OnNew()
{
CMyDoc* pDoc1=GetDocument();
int i,j,k;
CDialog0 Mydlg1;
if(Mydlg1.DoModal()!=IDOK)
return;
for(i=1;i<=4;i++)
for(j=0;j<7;j++)
m_distance[i]=m_distance[i]+power(Mydlg1.mychrom[j],pDoc1->Newpop[i].chrom[j]);
k=1;
for(i=2;i<=4;i++)
if(m_distance[i]<m_distance[k])
k=i;
CDialog2 Mydlg2;
if((pDoc1->Newpop[k].chrom[0] == 0)&&(pDoc1->Newpop[k].chrom[1] == 0))
Mydlg2.m_1="20-30w";
else if((pDoc1->Newpop[k].chrom[0] == 0)&&(pDoc1->Newpop[k].chrom[1] == 1))
Mydlg2.m_1="30-40w";
else if((pDoc1->Newpop[k].chrom[0] == 1)&&(pDoc1->Newpop[k].chrom[1] == 0))
Mydlg2.m_1="40-50w";
else if((pDoc1->Newpop[k].chrom[0] == 1)&&(pDoc1->Newpop[k].chrom[1] == 1))
Mydlg2.m_1="50-60w";
else
Mydlg2.m_1="?";
if(pDoc1->Newpop[k].chrom[2] == 0)
Mydlg2.m_2="no";
else
Mydlg2.m_2="yes";
if(pDoc1->Newpop[k].chrom[3] == 0)
Mydlg2.m_3="no";
else
Mydlg2.m_3="yes";
if(pDoc1->Newpop[k].chrom[4] == 0)
Mydlg2.m_4="woman";
else
Mydlg2.m_4="man";
if((pDoc1->Newpop[k].chrom[5] == 0)&&(pDoc1->Newpop[k].chrom[6] == 0))
Mydlg2.m_5="20-29";
else if((pDoc1->Newpop[k].chrom[5] == 0)&&(pDoc1->Newpop[k].chrom[6] == 1))
Mydlg2.m_5="30-39";
else if((pDoc1->Newpop[k].chrom[5] == 1)&&(pDoc1->Newpop[k].chrom[6] == 0))
Mydlg2.m_5="40-49";
else if((pDoc1->Newpop[k].chrom[5] == 1)&&(pDoc1->Newpop[k].chrom[6] == 1))
Mydlg2.m_5="50-59";
else
Mydlg2.m_5="?";
Mydlg2.m_0=k;
UpdateData(FALSE);
Mydlg2.DoModal();
}
int CMyView::power(int i, int j)
{
return((i-j)*(i-j));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -