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

📄 ga1.cpp

📁 利用数论中的佳点集的理论和方法
💻 CPP
字号:
/***求f(X)=x1*x1+x2*x2+x3*x3的最大值 -5.12<=xi<=5.12的最大值*****/
#include <iostream.h>
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/****常量声明,遗传算法的系统参数*********/
const int N=3;  //变量的个数
const int LENGTH=5;  //每个变量的编码位数
const int CHROMLENGTH=LENGTH*N; //染色体长度
const int popsize=4;  //种群中个体个数
const int maxgeneration=200; //最大进化代数
const double pc=0.6; //交叉概率
const double pm=0.01; //变异概率
const double Umin=-5.12; //变量范围的最小数
const double Umax=5.12; //变量范围的最大数
/***类声明***/
class individual{
public: 
	 char chrom[CHROMLENGTH+1]; //最后一位放'\0'
	 double X[N]; //存放每个变量的实数值
	 double fitness; //每个个体的适应值
};						   

/*******全局变量声明**********/
int generation;
//int best_index;
//int worst_index;
class individual bestindividual;
//class individual worstindividual;
class individual currentindividual;
class individual population[popsize];
class individual newpopulation[popsize];
class individual nextpopulation[popsize];
double fitness_sum;

void GenerateInitialPopulation()
{
    srand((unsigned)   time   (NULL));   

	 for(int i=0;i<popsize;i++)
	 {
	    for(int j=0;j<CHROMLENGTH;j++)
		{
			population[i].chrom[j]=(rand()%2==0)?'0':'1';
		}
		population[i].chrom[CHROMLENGTH]='\0';
	 }
	 for(i=0;i<popsize;i++)
			 cout<<population[i].chrom<<" ";
	 cout<<endl;
}

double decodechromesome(char a[],int i,int j)
{
    double y=0;
	for(int k=i;k<j;k++)
	{
	   y+=(int(a[k])-48)*pow(2,j-k-1);
	}
	y=Umin+y*(Umax-Umin)/(pow(2,LENGTH)-1);
	return y;
}

void calculatevalue() //计算每个变量的值
{
   for(int i=0;i<popsize;i++)
   {
      int count=0;
	  for(int j=0;j<CHROMLENGTH;)
	  {
	     population[i].X[count++]=decodechromesome(population[i].chrom,j,j+LENGTH);
	     j=j+LENGTH;
	  }
   }
}

double F(double X[],int N)
{
   return (X[0]*X[0]+X[1]*X[1]+X[2]*X[2]);
}
void calculatefitness()
{
    calculatevalue();
	fitness_sum=0.0;
	
	for(int i=0;i<popsize;i++)
	{  for(int j=0;j<N;j++)
	{  cout<<"X=("<<population[i].X[j]<<"  ";
	}
	cout<<")";
	   population[i].fitness=F(population[i].X,N);
       fitness_sum+=population[i].fitness;
	}
}

void FindBestIndividual()
{
   calculatefitness();
   bestindividual=population[0];
   
   for(int i=1;i<popsize;i++)
   {
     if(population[i].fitness>bestindividual.fitness)
	 {
	    bestindividual=population[i];
	 }
   }
   currentindividual=bestindividual;
   
}

void EvaluatePopulation()
{
   FindBestIndividual();
   cout<<"当前最好的个体是"<<currentindividual.chrom;
   cout<<"   其适应度为"<<currentindividual.fitness;
}

double ps[popsize];
int number[popsize];
void selectoperation() //取整数后,再取小数
{
	int i;
	double except_num[popsize];
	int count=0; double max=0.0;
    double fraction[popsize];
   
  /*for(i=0;i<popsize;i++)
  {
     population[i]=newpopulation[i];
  }*/
  for( i=0;i<popsize;i++)
   {
      ps[i]=population[i].fitness/fitness_sum;
      number[i]=0;
	  except_num[i]=ps[i]*popsize;
   }
 
   for(i=0;i<popsize;i++)
   {
       //srand((unsigned)   time   (NULL));   
      number[i]=int(except_num[i]);
	  count+=number[i];
	  fraction[i]=except_num[i]-number[i];
   }
    while(count!=4)
	  {  int flag; max=0.0;
	     for(int j=0;j<popsize;j++)
		 {
		    if(max<fraction[j])
			{
			   max=fraction[i];flag=j;
			}
		 }//for
		 number[flag]++;
		 count++;
	  }
   count=0;
   for(i=0;i<popsize;i++)
   {
     int num=number[i];
      while(num>0)
	  {
		  newpopulation[count++]=population[i];
	      num--;
	  }
   }
}


int crossoverindividual[popsize];
int crossoverpoint[popsize];
void crossoveroperation() 
{//每个染色体都有个随机产生的交叉概率,若小于给定的交叉概率,则进行交叉,否则不进行
  for(int i=0;i<popsize;i++)
  {
	 population[i]=newpopulation[i];
     crossoverindividual[i]=-1;
  }
   
   for(i=0;i<popsize;i++) 
  {
	  	 
	   if(crossoverindividual[i]==-1)
	  {
	     // srand((unsigned)   time   (NULL));   

		  int k=rand()%popsize;
		  for(int r=0;r<popsize;r++)
		  {
		    if(crossoverindividual[r]==k||i==k) 
			{
				k=rand()%popsize;
				r=0;
			}
		  }
		 crossoverindividual[i]=k;
		 crossoverindividual[k]=i;
		 
		 double p=rand()%99/100.0;
		 if(p<=pc)
		 {  //进行交叉
		    crossoverpoint[i]=crossoverpoint[k]=rand()%CHROMLENGTH;
		    for(int j=crossoverpoint[i];j<CHROMLENGTH;j++)
			{
			   char temp=population[i].chrom[j];
			   population[i].chrom[j]=population[k].chrom[j];
			   population[k].chrom[j]=temp;
			}
		 }//if
		 else crossoverpoint[i]=crossoverpoint[k]=-1;
	 }//if
	  nextpopulation[i]=population[i];  //nextpopulation为交叉表中的子代
  }//for
}

char isMutate[popsize];  //是否变异
int mutatepoint[popsize];//变异的位置
void mutationoperation() 
{
  for(int i=0;i<popsize;i++)
  {
	 //srand((unsigned)   time   (NULL));    
	 mutatepoint[i]=-1;	 
     population[i]=nextpopulation[i];
	 newpopulation[i]=population[i];
	 population[i]=nextpopulation[i];
	 double p=rand()%99/100.0;
	 if(p<=pm)
	 {
	    isMutate[i]='Y';
		int k=rand()%CHROMLENGTH;
        mutatepoint[i]=k;
		newpopulation[i].chrom[k]=(newpopulation[i].chrom[k]=='0')?'1':'0';
	 }//if
	 else isMutate[i]='N';
	
  }//for
}


void outputselect()
{
   cout<<"第"<<generation<<"代选择情况"<<endl;
   cout<<"序号    种群        适应值    选择概率    选中次数"<<endl;
   for(int i=0;i<popsize;i++)
   {
     cout<<i<<"  "<<population[i].chrom<<"       "<<population[i].fitness<<"      "
		 <<ps[i]<<"       "<<number[i]<<endl;
   }
}

void outputcrossover()
{
   cout<<"第"<<generation<<"代种群交叉情况"<<endl;
   cout<<"序号   种群     交叉个体   交叉值  子代  "<<endl;
   for(int i=0;i<popsize;i++)
   {
      cout<<i<<" "<<population[i].chrom<<"  "<<crossoverindividual[i]
		  <<"  "<<crossoverpoint[i]<<"  "<<nextpopulation[i].chrom<<endl;
   }
}

void outputmutation()
{
  cout<<"第"<<generation<<"代种群变异情况"<<endl;
  cout<<"序号   种群   是否变异  变异值   新种群"<<endl;
  for(int i=0;i<popsize;i++)
  {
    cout<<i<<"  "<<population[i].chrom<<"  "<<isMutate[i]<<"  "<<mutatepoint[i]
		<<" "<<newpopulation[i].chrom<<endl;
  }
  for(i=0;i<popsize;i++)
     population[i]=newpopulation[i];
}

void GenerateNextPopulation()
{
  selectoperation();
  outputselect();
  crossoveroperation();
  outputcrossover();
  mutationoperation();
  outputmutation();
}



void main()
{
   generation=0;
   GenerateInitialPopulation();
   calculatevalue();
   calculatefitness();
   FindBestIndividual();
   EvaluatePopulation();
   while(generation<maxgeneration)
   {
	   GenerateNextPopulation();
	   EvaluatePopulation();
	  // PerformEvaluation();
	  // OutputReport();
	   generation++;
   }
   cout<<"函数的最大值为"<<currentindividual.fitness<<endl;
  cout<<"最优解为X=(";
  for(int i=0;i<N;i++)
	  cout<<currentindividual.X[i]<<"  ";
  cout<<")"<<endl;
  cout<<endl;
  cin>>generation;
}

⌨️ 快捷键说明

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