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

📄 遗传算法view.cpp

📁 关于遗传算法的一个源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -