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

📄 遗传窜法.c

📁 利用遗传算法求函数最大值的一段源代码
💻 C
字号:
#include  <stdlib.h> //求函数在(-4,4)的最大值
#include  <math.h>
#include  <time.h>
#include  <string.h> 
#define POPSIZE  10//population size
#define Pc  0.8 //crossover probability
#define Pm 0.005//mutation probability
#define G  0.8 //generation gap
#define LENGTH 22 //  一个变量的长度
#define Maxgeneration  20
#define N  2      //  函数变量个数

int generation;
double value[POPSIZE][N];  //变量值

struct indivaual
{char chrom[N*LENGTH];
 double value;              //函数值
 double fitness;
};
struct indivaual population[POPSIZE];
struct indivaual matingpool[POPSIZE]; 



void decode(struct indivaual *p)
{
	int i,j,k,l;
	double temp=0.0;
	for(j=0;j<POPSIZE;j++)
	{
		i=0;k=0;
		for(l=0;i<N*LENGTH+1;k++,i++)
		{
			if (k==LENGTH)
			{
				k=0; 
				value[j][l]=8*temp/(pow(2,LENGTH))-4.0;
				temp=0.0;
				l++;
			}
			if (i==N*LENGTH)
				break;
			temp+=((int)(p[j].chrom[i]))*(pow(2,(LENGTH-1-k)));
		}
	}
}

void Function(struct indivaual *p)         
{	
	int i;
	decode(p);
	for(i=0;i<POPSIZE;i++)
	{
		p[i].value=4*value[i][0]*exp(-(pow(value[i][0],2)+pow(value[i][1],2)))+sin(pow(value[i][0],2));
	}
	
}

void Fitness(struct indivaual *p)
{
	int i;
	for(i=0;i<POPSIZE;i++) 
	{
		p[i].fitness=p[i].value+1000;
	}
}

//产生出始种群
void GenerateInitialPopulation()            
{
	int i,j;

	/* Seed the random-number generator with current time so that
    * the numbers will be different every time we run.
    */
	srand((unsigned)time(NULL));

	for(i=0;i<POPSIZE;i++)
	{
		for(j=0;j<N*LENGTH;j++)
		{
			(population[i]).chrom[j]=(char)(rand()%2);
		}
			(population[i]).chrom[j]='\0';
	}
}

void Order(struct indivaual *q)   //排序
{
	int i,j,k; 
 
	struct indivaual temp;
	for(k=0;k<POPSIZE-2;k++)
	{
		for(i=0;i<POPSIZE-1-k;i++)
		{
			if ((q[i].fitness)<(q[i+1].fitness))
			{
				for(j=0;j<N*LENGTH;j++)
				{
					temp.chrom[j]=q[i].chrom[j];
				}
				temp.fitness=q[i].fitness;         
				temp.value=q[i].value;
				for(j=0;j<N*LENGTH;j++)
				{
					q[i].chrom[j]=q[i+1].chrom[j];
				}
				q[i].fitness=q[i+1].fitness;
				q[i].value=q[i+1].value;
				for(j=0;j<N*LENGTH;j++)
				{
					q[i+1].chrom[j]=temp.chrom[j];
				}
				q[i+1].fitness=temp.fitness;
				q[i+1].value=temp.value;
			}
			continue;
		}
	}
}

void Reproduction()           //复制 生成matingpool
{
	int i,j,k;
	double total=0.0;
	double m,n;
	srand((unsigned)time(NULL));
	for(i=0;i<POPSIZE;i++)
	{
		total+=(population[i].fitness);
	}
	for(i=0;i<POPSIZE;i++)
	{
		n=(double)(rand()%(int)(total)); 
		m=0.0;
		for(k=0;(m<n)&&(k<POPSIZE);k++)
		{
			m+=(population[k].fitness);
		}
		for(j=0;j<N*LENGTH;j++)
		{
			matingpool[i].chrom[j]=population[k-1].chrom[j];
		}
		matingpool[i].fitness=population[k-1].fitness;
		matingpool[i].value=population[k-1].value;
	}
}


void Crossover()
{
	int i,j,k;
	int index[POPSIZE];
	int pointp,temp,point[N];
	char ch;
	srand((unsigned)time(NULL));
	for(i=0;i<POPSIZE;i++)
	{
		index[i]=i;
	}
	for(i=0;i<POPSIZE;i++)              //打乱顺序
	{
		pointp=rand()%(POPSIZE-i);
		temp=index[i];
		index[i]=index[pointp+i];
		index[pointp+i]=temp;
	}
	for(i=0;i<(int)(Pc*POPSIZE)-1;i+=2) 
	{
		for(k=0;k<N;k++)
		{
			point[k]=k*LENGTH+rand()%LENGTH;
		}
		for(k=0;k<N;k++)
		{ 
			for(j=point[k];j<(k+1)*LENGTH;j++)
			{
				ch=matingpool[index[i]].chrom[j];
				matingpool[index[i]].chrom[j]=matingpool[index[i+1]].chrom[j]; 
				matingpool[index[i+1]].chrom[j]=ch;
			}
		}
	}
}

void Mutation()                 //基因突变 
{int i,j;
 int index[POPSIZE];
 int pointp,temp;
 srand((unsigned)time(NULL));
 for(i=0;i<POPSIZE;i++)
 {index[i]=i;}
 for(i=0;i<POPSIZE;i++)
 {pointp=rand()%(POPSIZE-i);
  temp=index[i];
  index[i]=index[pointp+i];
  index[pointp+i]=temp;
 }
  for(i=0;i<(int)(Pm*POPSIZE)-1;i++) 
  {j=rand()%(N*LENGTH-1);
  matingpool[index[i]].chrom[j]=((matingpool[index[i]].chrom[j]=='0')?'1':'0'); 
  }
}

void GenerateNextpopulation()
{int i,j;
 Reproduction();
 Crossover();
 Mutation();
 Function(matingpool);
 Fitness(matingpool);
 Order(matingpool);
 Order(population);
 for(i=0;i<(int)(G*POPSIZE);i++)
 {for(j=0;j<N*LENGTH;j++) 
 {population[(int)((1-G)*POPSIZE)+i].chrom[j]=matingpool[i].chrom[j];
 }
  population[(int)((1-G)*POPSIZE)+i].fitness=matingpool[i].fitness;
  population[(int)((1-G)*POPSIZE)+i].value=matingpool[i].value;
 }
 
}

void OutputTextReport()
{int i,k,l;
 double sum,average,temp;
 sum=0.0;
 for(i=0;i<POPSIZE;i++)
 {sum+=population[i].value;}
  average=sum/POPSIZE;
  printf("\nGENERATION:%d\nAVERAGE:%f\nGOODVALUE:%f",generation,average,population[0].value);
  printf("\nbestchrom:");
  for(i=0;i<N*LENGTH;i++)
  {printf("%d",population[0].chrom[i]);}
  printf("\n");

  for(l=0,i=0,k=0,temp=0.0;i<N*LENGTH+1;k++,i++)                               //对最优染色体解码
   {if (k==LENGTH)                                                   //对最优染色体解码
	{k=0;                                                           //对最优染色体解码
	 value[0][l]=temp/(pow(2,LENGTH));                             //对最优染色体解码
	 temp=0.0;l++;                                                //对最优染色体解
  }                                                              //对最优染色体解码
    if (i==N*LENGTH)                                            //对最优染色体解码
		break;                                                 //对最优染色体解码
    temp+=((int)(population[0].chrom[i]))*(pow(2,(LENGTH-1-k)));       //对最优染色体解码
   }
  for(i=0;i<N;i++)
  printf("x%d=%f\n",i+1,8*value[0][i]-4.0);
}

main()
{
	generation=0;

	GenerateInitialPopulation();

	Function(population);
	Fitness(population);
	for(;generation<Maxgeneration;generation++)
	{
		GenerateNextpopulation();
	}
	Order(population);
	OutputTextReport();
	printf("%f",population[0].value);
}	
 

 

⌨️ 快捷键说明

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