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

📄 genetic.cpp

📁 前几天给大家共享了一个基本的遗传算法VC++原代码
💻 CPP
字号:
#include "StdAfx.h"
#include "genetic.h"
#include <math.h>

Genetic::Genetic(void)
{
}

Genetic::~Genetic(void)
{
}

void Genetic::init(void)
{

	for(int i=0;i<POPULATION_SIZE;i++)
	{
		for(int j=0;j<MAX_LENGTH;j++)
		{
		   Population[i].DNA[j]=randxy(VarMinMax[j][0],VarMinMax[j][1]);
		}

	}	

}

void Genetic::SetMutation(double mutation)
{
   Pmutation=mutation;
}

void Genetic::SetCross(double cross)
{
    Pcross=cross;
}


double Genetic::randxy(double x, double y)
{
	
	return(	x+((double)((rand()%1000)/1000.0))*(y-x)); 
}

bool Genetic::test(double possibility)
{
  double p;
  p=(rand()%1000)/1000.0;
  if(p<=possibility)
  return (true);
  else 
  return (false);

}

double Genetic::setvarscope(double scope[][2])
{

	for(int i=0;i<MAX_LENGTH;i++)
    {
		VarMinMax[i][0]=scope[i][0];  //最小值
        VarMinMax[i][1]=scope[i][1];  //最大值
     }

	return 0;
}

double Genetic::CalFitness(Individual *pIndividual)
{
	double z=0.0;
	double x[MAX_LENGTH];

	for(int i=0;i<MAX_LENGTH;i++)
	{
	  x[i]=(pIndividual->DNA[i]);
	}

    for(int j=0;j<MAX_LENGTH;j++)
	 {
	   z+=100*x[j]-pow(x[j],2); //*************适应度函数f(x)=∑(100x-x2);
	  }
    
	pIndividual->Fitness=z;   //设置个体的适应度值;

	return z;
}

int  Genetic::select(void)
{
	double rand1,partsum;
	int i=0;
	partsum=0;
   
	rand1=((rand()%1000)/1000.0)*SumFitness;

	do{
		partsum=partsum+Population[i].Fitness;
		i++;
	}while((partsum<rand1)&&(i<POPULATION_SIZE));
	return (i-1);
	
}

void Genetic::statistic(Individual *pIndividual)
{
	
	//计算单个染色体的适应度,以及SumFitness和AverageFitness;
	SumFitness=0;
    AverageFitness=0;
	double p=0.0;
	p=(double)POPULATION_SIZE;
	for(int k=0;k<POPULATION_SIZE;k++)
	{
		CalFitness(&pIndividual[k]);
		SumFitness=SumFitness+pIndividual[k].Fitness;
	}    
    AverageFitness=SumFitness/p;
	
    //对个体进行排序
	Individual temp;
	for(int i=0;i<POPULATION_SIZE;i++)
	{
		for(int j=i;j<POPULATION_SIZE;j++)
		{
			if(pIndividual[i].Fitness<=pIndividual[j].Fitness)
			{  
				temp=pIndividual[i];
				pIndividual[i]=pIndividual[j];
				pIndividual[j]=temp;
			}
		}	
	}
		//得到最佳个体;
		 BestIndividual=pIndividual[0];	
}

void Genetic::mutation(Individual *pIndividual,bool Scale)
{

  if(test(Pmutation))
  {
	  if(Scale==LARGE_SCALE)//大幅度变异;
	  {
        for(int j=0;j<MAX_LENGTH;j++)
		{
		   pIndividual->DNA[j]=randxy(VarMinMax[j][0],VarMinMax[j][1]);
		}
	  }
	  else//小腹度变异;
	  {  
		  for(int i=0;i<MAX_LENGTH;i++)
	      {
		      double x=0;
              x=randxy(9.5, 11.0);
		     if((pIndividual->DNA[i]*(x/10.0)<=VarMinMax[i][0])
			     ||(pIndividual->DNA[i]*(x/10.0)>=VarMinMax[i][1]))
		       {
                 pIndividual->DNA[i]=pIndividual->DNA[i];
		       }
		       else
		       {
			      pIndividual->DNA[i]=pIndividual->DNA[i]*(x/10.0);
		        }
	         }
	  }
  }

}

void Genetic::cross(Individual *pParent1, Individual *pParent2,Individual *pChild1,Individual *pChild2)
{

   double r=0.0;
   if(test(Pcross))
   {
      r=(rand()%1000)/1000.0;

	  for(int j=0;j<MAX_LENGTH;j++)
	   {
        pChild1->DNA[j]=r*(pParent1->DNA[j])+(1-r)*(pParent2->DNA[j]);
        pChild2->DNA[j]=(1-r)*(pParent1->DNA[j])+r*(pParent2->DNA[j]);
	   }

   }
   else
   {
	  (*pChild1)=(*pParent1);
      (*pChild2)=(*pParent2);
   }

}

void Genetic::RunGeneration()
{
     int r1=0,r2=0;
     Individual temp[POPULATION_SIZE];
     Individual child1,child2;

    statistic(Population);//进行统计计算;

     //从0到POPULATION_SIZE循环,根据适应度选择,进行交叉;
	 //最好的两个个体直接保留到下一代;
    for(int i=0;i<POPULATION_SIZE-2;i=i+2)
	{
		r1=select();
		r2=select();
		cross(&Population[r1],&Population[r2],&child1,&child2);

		temp[i]=  child1;
		temp[i+1]=child2;
	}//************************************进行交叉;
     
	 temp[POPULATION_SIZE-2]=Population[0];
     temp[POPULATION_SIZE-1]=Population[1];//保留最好的两个个体;
//***********************************************************
   statistic(temp);//进行统计排序

   //mutation(&temp[0],SMALL_SCALE);
   mutation(&temp[1],SMALL_SCALE);//对较好的个体进行小范围的变异;
   for(i=2;i<POPULATION_SIZE;i++)//对一般个体进行大范围的变异,;
   {
     mutation(&temp[i],LARGE_SCALE);
   }
   	 //	复制到下一代;
	for(i=0;i<POPULATION_SIZE;i++)
	{
		Population[i]=temp[i];
	}
	statistic(Population);//进行统计计算排序;
}

⌨️ 快捷键说明

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