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

📄 ca_testdlg.cpp

📁 用遗传算法实现函数优化
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	lMaxCount2=lMaxCount2+0.5;
	pDC->MoveTo(LeftTop_x,LeftTop_y);//这里画了一个矩形区域
	pDC->LineTo(LeftTop_x,RightButtom_y);
	pDC->LineTo(RightButtom_x,RightButtom_y);
	pDC->LineTo(RightButtom_x,LeftTop_y);
	pDC->LineTo(LeftTop_x,LeftTop_y);
	double jiangeX=(double((RightButtom_x-LeftTop_x))/m_edit2); //水平间隔
	for(int j=1;j<=m_edit2;j++)
	{
		if(m_edit2<500)
		{
//			if(j%20==0)
			{    //完成水平坐标值的标定
				pDC->MoveTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y);
				pDC->LineTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y+6);
				CString str5;
				str5.Format("%d",j);
				pDC->TextOut(LeftTop_x-4+jiangeX/2+j*jiangeX, RightButtom_y+3,str5);
				CPen pen1(PS_DASH,0.5,RGB(0,0,0));
				CPen *pOldPen=pDC->SelectObject(&pen1);
				if(j<m_edit2)   //这里完成网格垂直线的绘制
				{
					pDC->MoveTo(j*jiangeX+LeftTop_x,LeftTop_y);
					pDC->LineTo(j*jiangeX+LeftTop_x,RightButtom_y);
				}
				pDC->SelectObject(pOldPen);   
				pen1.DeleteObject();
			}
		}
		else
		{
			if(j%40==0)//世代数大于200,则每隔40标定横坐标
			{
				pDC->MoveTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y);
				pDC->LineTo(LeftTop_x+jiangeX/2+j*jiangeX, RightButtom_y+6);
				CString str5;
				str5.Format("%d",j);
				pDC->TextOut(LeftTop_x-4+jiangeX/2+j*jiangeX, RightButtom_y+3,str5);
				CPen pen1(PS_DASH,0.5,RGB(0,0,0));
				CPen *pOldPen=pDC->SelectObject(&pen1);
				if(j<m_edit2)
				{
					pDC->MoveTo(j*jiangeX+LeftTop_x,LeftTop_y);
					pDC->LineTo(j*jiangeX+LeftTop_x,RightButtom_y);	
				}
				pDC->SelectObject(pOldPen);   
				pen1.DeleteObject();
			}
		}
	}
	double jiangeY=(double((RightButtom_y-LeftTop_y))/SegCount); //竖直间隔
	for (i=0;i<(SegCount+1);i+=1)
	{
		pDC->MoveTo(LeftTop_x, RightButtom_y-i*jiangeY);
		pDC->LineTo(LeftTop_x-4, RightButtom_y-i*jiangeY);
		CString str6;
		str6.Format("%d",int(lMaxCount2/SegCount)*i);
		pDC->TextOut(2, RightButtom_y-5-i*jiangeY,str6);
		CPen pen2(PS_DASH,0.5,RGB(0,0,0));
		CPen *pOldPen1=pDC->SelectObject(&pen2);
		if(i<SegCount && i>=1)//下面画网格水平线
		{
			pDC->MoveTo(LeftTop_x,RightButtom_y-i*jiangeY);
			pDC->LineTo(RightButtom_x,RightButtom_y-i*jiangeY);
		}
		pDC->SelectObject(pOldPen1);  
		pen2.DeleteObject();
	}
	CPen pen3(PS_SOLID,2,RGB(255,0,0));//红色的画笔表示每世代的平均值
	CPen *pOldPen2=pDC->SelectObject(&pen3);
	for (i=1;i<DataLength;i++)
	{
		pDC->MoveTo(LeftTop_x+jiangeX*(i-1),RightButtom_y-(RightButtom_y-LeftTop_y)*(aver1[i]-lMinCount2)/(lMaxCount2-lMinCount2));
		pDC->LineTo(LeftTop_x+jiangeX*i,RightButtom_y-(RightButtom_y-LeftTop_y)*(aver1[i+1]-lMinCount2)/(lMaxCount2-lMinCount2));
	}
	pDC->SelectObject(pOldPen2);
	pen3.DeleteObject();
	CPen pen4(PS_SOLID,2,RGB(0,0,255));//蓝色画笔表示每世代的最大值
	CPen *pOldPen3=pDC->SelectObject(&pen4);
	for (i=1;i<DataLength;i++)
	{
		pDC->MoveTo(LeftTop_x+jiangeX*(i-1),RightButtom_y-(RightButtom_y-LeftTop_y)*(curbest[i]-lMinCount2)/(lMaxCount2-lMinCount2));
		pDC->LineTo(LeftTop_x+jiangeX*i,RightButtom_y-(RightButtom_y-LeftTop_y)*(curbest[i+1]-lMinCount2)/(lMaxCount2-lMinCount2));
	}
	pDC->SelectObject(pOldPen3);
	pen4.DeleteObject();
    pDC->TextOut(RightButtom_x+20,RightButtom_y+5,"代数");
	pDC->TextOut(LeftTop_x-40,LeftTop_y-20,"函数值");
}

void CCA_TestDlg::crossover()//交叉
{
	int i,j,k;
//	s=(int)(1+rand()%(2-1));
//	struct individual R[10][10];
	struct individual temp11[10][10];
	struct individual temp22[10][10];
	double lamda=double(rand())/RAND_MAX*3-2;
/*
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			R[i][j]=population[i][j];
		}
	}
*/
/*	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			for(k=0;k<2;k++)
			{
				if(k>=1&&k<=s)
				{
					population[i][j].x[k]=R[i][j].x[k];
				}
				else
				{
					population[i][j].x[k]=bestneighboragent[i][j].x[k];
				}		  		  
			}	
		}
	}
*/
////
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			for(k=0;k<2;k++)
			{
				temp11[i][j].x[k]=lamda*population[i][j].x[k]+(1-lamda)*bestneighborindividual[i][j].x[k];
				temp22[i][j].x[k]=(1-lamda)*population[i][j].x[k]+lamda*bestneighborindividual[i][j].x[k];
			}	
		}
	}
////
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			for(k=0;k<2;k++)
			{
				population[i][j].x[k]=temp11[i][j].x[k];
			}	
		}
	}

	calculateobjectvalue();       
	calculatefitnessvalue();

	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			temp11[i][j].fitness=population[i][j].fitness;
		}
	}
////	
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			for(k=0;k<2;k++)
			{
				population[i][j].x[k]=temp22[i][j].x[k];
			}	
		}
	}

	calculateobjectvalue();       
	calculatefitnessvalue();

	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			temp22[i][j].fitness=population[i][j].fitness;
		}
	}
////
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			if(temp11[i][j].fitness>temp22[i][j].fitness)
			{
				population[i][j]=temp11[i][j];
			}
			else
			{
				population[i][j]=temp22[i][j];
			}
		}
	}
/*	
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			population[i][j]=R[i][j];
		}
	}
*/
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			for(k=0;k<2;k++)
			{
				if (population[i][j].x[k]<xmin)
				{
					population[i][j].x[k]=xmin;
				}
				if (population[i][j].x[k]>xmax)
				{
					population[i][j].x[k]=xmax;
				}
			}	
		}
	}
}

void CCA_TestDlg::auto_mutation()//自变异算子
{
	int i,j,k;
	double temp1;
	double rand1;
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			agent[i][j]=population[i][j];
		}
	}
	
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			for(k=0;k<2;k++)
			{   
				rand1=(double)rand()/RAND_MAX*1.0;
				population[i][j].x[k]=agent[i][j].x[k];
			}
			temp1=population[i][j].x[0];
			population[i][j].x[0]=population[i][j].x[0]+rand1*2*p-p;
			population[i][j].x[1]=temp1*temp1/population[i][j].x[0];
		}
	} 
	
	calculateobjectvalue();       
	calculatefitnessvalue();
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			if(population[i][j].fitness>agent[i][j].fitness)
			{
				agent[i][j]=population[i][j];
			}	
		}
	}

	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			for(k=0;k<2;k++)
			{
				if (agent[i][j].x[k]<xmin)
				{
					agent[i][j].x[k]=xmin;
				}
				if (agent[i][j].x[k]>xmax)
				{
					agent[i][j].x[k]=xmax;
				}
			}	
		}
	}

	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			population[i][j]=agent[i][j];
		}
	}
}

void CCA_TestDlg::compete()//领域竞争算子
{
	int i,j,k;
	double rand1;
	rand1=(double)rand()/RAND_MAX*2.0-1.0;  
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			if (population[i][j].fitness<bestneighborindividual[i][j].fitness)
			{
				for(k=0;k<2;k++)
				{
					if(bestneighborindividual[i][j].x[k]+rand1*(bestneighborindividual[i][j].x[k]-population[i][j].x[k])<xmin)
					{
						population[i][j].x[k]=xmin;
					}
					else if(bestneighborindividual[i][j].x[k]+rand1*(bestneighborindividual[i][j].x[k]-population[i][j].x[k])>xmax)
					{
						population[i][j].x[k]=xmax;
					}
					else
					{
						population[i][j].x[k]=bestneighborindividual[i][j].x[k]+rand1*(bestneighborindividual[i][j].x[k]-population[i][j].x[k]);
					}
				}		
			}	
		}
	}
	evaluatepopulation();
}

void CCA_TestDlg::calculateobjectvalue()
{
	int i,j;
	double value;	
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
		  value=0.0;
//	      GetDlgItem(IDC_COMBO1)->GetWindowText(str);         
//		  if(str=="Rosenbrock函数")
//		  {
/*
		  for(k=0;k<2;k++)
			 {
				 if(k+1>2)
				 {
				 population[i][j].x[k+1]=population[i][j].x[1];
				 }
			     value=value+(100*pow(population[i][j].x[k+1]-pow(population[i][j].x[k],2),2)+pow((1-population[i][j].x[k]),2));
			}
*/	
		  value=value+(100*pow((pow(population[i][j].x[0],2)-population[i][j].x[1]),2)+pow((1-population[i][j].x[0]),2));
//		  }
/*	      if(str=="Ackley函数")
			{   
				double value1,value2;
				value1=0.0;
				value2=0.0;
				for(k=1;k<=n;k++)
				{
                  value1=value1+pow(agent[i][j].x[k],2);				  
				  value2=value2+cos(2*3.1415926*agent[i][j].x[k]);				  
				}
				value=-20*exp(-0.2*sqrt(value1/n))-exp(value2/n)+20+2.72;
		
			}
	       if(str=="Schwefel函数")
		   {
			  for(k=1;k<=n;k++)
			  {
               value=value+(-agent[i][j].x[k]*sin(sqrt(fabs(agent[i][j].x[k]))));
			  }
		   }
	       if(str=="Rastrigin函数")
		   {
		    for(k=1;k<=n;k++)
			  {
               value=value+(pow(agent[i][j].x[k],2)-10*cos(2*3.1415926*agent[i][j].x[k])+10);
			  }
		   }
	       if(str=="Griewank函数")
		   {
			double value1,value2;
			value1=0.0;
			value2=1.0;
            for(k=1;k<=n;k++)
			 {
			   value1=value1+pow(agent[i][j].x[k],2);
			   value2=value2*cos(agent[i][j].x[k]/sqrt(k));		       
			  }
			value=value1/4000-value2+1;
		   }
		   if(str=="求和函数")
		   {
			   for(k=1;k<=n;k++)
			   {
			   value=value+pow(agent[i][j].x[k],2);
			   }
		   }*/		   
	      population[i][j].value=value;
		}
	}
}



void CCA_TestDlg::findneighborbestindividual()
{
	int i,j,k;
	struct individual bestna;
	struct individual neighborindividual[8];
	int aaa=0;
	FILE *fp1;
	fp1=fopen("neigbour.txt","w");
	for(i=0;i<L;i++)
	{
		for(j=0;j<L;j++)
		{
			aaa++;
			fprintf(fp1,"%d\n",aaa);
			fprintf(fp1,"%d\n",L);
			fprintf(fp1,"%d,%d\n",i,j);
			for(k=0;k<8;k++)
			{
				neighborindividual[k].fitness=0.0;
			}
			if((i==0)&&(j==0))
			{
				//neighborindividual[0]=population[L-1][L-1];
				//neighborindividual[1]=population[L-1][j];
				//neighborindividual[2]=population[L-1][j+1];
				//neighborindividual[3]=population[i][L-1];
				neighborindividual[4]=population[i][j+1];
				//neighborindividual[5]=population[i+1][L-1];
				neighborindividual[6]=population[i+1][j];
				//neighborindividual[7]=population[i+1][j+1];
				fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
				fprintf(fp1,"\n");
			}
			if((i!=0)&&(i!=L-1)&&(j!=0)&&(j!=L-1))
			{
				//neighborindividual[0]=population[i-1][j-1];
				neighborindividual[1]=population[i-1][j];
				//neighborindividual[2]=population[i-1][j+1];
				neighborindividual[3]=population[i][j-1];
				neighborindividual[4]=population[i][j+1];
				//neighborindividual[5]=population[i+1][j-1];
				neighborindividual[6]=population[i+1][j];
				//neighborindividual[7]=population[i+1][j+1];
				fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
				fprintf(fp1,"\n");
			}
			
            if((i==0)&&(j!=0)&&(j!=L-1))
			{
				//neighborindividual[0]=population[L-1][j-1];
				//neighborindividual[1]=population[L-1][j];
				//neighborindividual[2]=population[L-1][j+1];
				neighborindividual[3]=population[i][j-1];
				neighborindividual[4]=population[i][j+1];
				//neighborindividual[5]=population[i+1][j-1];
				neighborindividual[6]=population[i+1][j];
				//neighborindividual[7]=population[i+1][j+1];
				fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
				fprintf(fp1,"\n");
			}
            if((i!=0)&&(i!=L-1)&&(j==0))
			{
				//neighborindividual[0]=population[i-1][L-1];
				neighborindividual[1]=population[i-1][j];
				//neighborindividual[2]=population[i-1][j+1];
				//neighborindividual[3]=population[i][L-1];
				neighborindividual[4]=population[i][j+1];
				//neighborindividual[5]=population[i+1][L-1];
				neighborindividual[6]=population[i+1][j];
				//neighborindividual[7]=population[i+1][j+1];
				fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
				fprintf(fp1,"\n");
			}
            if((i==L-1)&&(j!=0)&&(j!=L-1))
			{
				//neighborindividual[0]=population[i-1][j-1];
				neighborindividual[1]=population[i-1][j];
				//neighborindividual[2]=population[i-1][j+1];
				neighborindividual[3]=population[i][j-1];
				neighborindividual[4]=population[i][j+1];
				//neighborindividual[5]=population[0][j-1];
				//neighborindividual[6]=population[0][j];
				//neighborindividual[7]=population[0][j+1];
				fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
				fprintf(fp1,"\n");
			}
            if((i!=0)&&(i!=L-1)&&(j==L-1))
			{
				//neighborindividual[0]=population[i-1][j-1];
				neighborindividual[1]=population[i-1][j];
				//neighborindividual[2]=population[i-1][0];
				neighborindividual[3]=population[i][j-1];
				//neighborindividual[4]=population[i][0];
				//neighborindividual[5]=population[i+1][j-1];
				neighborindividual[6]=population[i+1][j];
				//neighborindividual[7]=population[i+1][0];
				fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
				fprintf(fp1,"\n");
			}
            
			if((i==0)&&(j==L-1))
			{
				//neighborindividual[0]=population[L-1][j-1];
				//neighborindividual[1]=population[L-1][j];
				//neighborindividual[2]=population[L-1][0];
				neighborindividual[3]=population[i][j-1];
			    //neighborindividual[4]=population[i][0];
				//neighborindividual[5]=population[i+1][j-1];
				neighborindividual[6]=population[i+1][j];
				//neighborindividual[7]=population[i+1][0];
				fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[6].fitness);
				fprintf(fp1,"\n");
			}
			if((i==L-1)&&(j==0))
			{
				//neighborindividual[0]=population[i-1][L-1];
				neighborindividual[1]=population[i-1][j];
				//neighborindividual[2]=population[i-1][j+1];
				//neighborindividual[3]=population[i][L-1];
				neighborindividual[4]=population[i][j+1];
				//neighborindividual[5]=population[0][L-1];
				//neighborindividual[6]=population[0][j];
				//neighborindividual[7]=population[0][j+1];
				fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[4].fitness);
				fprintf(fp1,"\n");
			}
			if((i==L-1)&&(j==L-1))
			{
				//neighborindividual[0]=population[i-1][j-1];
				neighborindividual[1]=population[i-1][j];
				//neighborindividual[2]=population[i-1][0];
				neighborindividual[3]=population[i][j-1];
				//neighborindividual[4]=population[i][0];
				//neighborindividual[5]=population[0][j-1];
				//neighborindividual[6]=population[0][j];
				//neighborindividual[7]=population[0][0];
				fprintf(fp1,"%lf\n",neighborindividual[1].fitness);
				fprintf(fp1,"%lf\n",neighborindividual[3].fitness);
				fprintf(fp1,"\n");
			}
	
//			for(k=0;k<8;k++)
//			{
//				fprintf(fp1,"%lf\n",neighborindividual[k].fitness);
//			}

			bestna.fitness=neighborindividual[0].fitness;
			for(k=0;k<8;k++)
			{
				if(neighborindividual[k].fitness>bestna.fitness)
				{
                   bestna=neighborindividual[k];
				}
						
			}
			bestneighborindividual[i][j]=bestna;
			fprintf(fp1,"%lf\n",bestneighborindividual[i][j].fitness);
			fprintf(fp1,"\n\n");
		}
	}
	fclose(fp1);

}

void CCA_TestDlg::performevolution()
{
	if (bestindividual.fitness>currentbest.fitness)
	{
		currentbest=population[best_indexi][best_indexj];
	}
	else
	{
		population[worst_indexi][worst_indexj]=currentbest;
	}
}

⌨️ 快捷键说明

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