基本遗传算法

//基本遗传算法源程序:求f(x1,x2)=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1)的最大值
#include
#include
#include

//The Definition of Constant
#define POPSIZE 500//population(群体) size
#define MAXIMIZATION 1//maximization flag
#define MINIMIZATION 2//minimization flag

//The Definition of User Data
#define Cmax 100//certain maximal value
#define Cmin 0//certain minimum value
#define LENGTH1 10//the chromosome length of 1st variable
#define LENGTH2 10//the chromosome length of 2st variable
#define CHROMLENGTH LENGTH1+LENGTH2//total length of chromosome
int FunctionMode=MAXIMIZATION;//optimization(最优化) type
int PopSize=80;//population size
int MaxGeneration=2000;//max.number of generation
double Pc=0.6;//probability of crossover(交叉)
double Pm=0.001;//probability of mutation(变异)

//The Definition of Data Structure
struct individual//data structure of individual(个体)
{
char chrom[CHROMLENGTH+1];//a string of code representing individual
double value;//object value of this individual
double fitness;//fitness(适应度) value of this individual
};

//The Definition of Global Variables
int generation;//number of generation
int best_index;//index of best individual
int worst_index;//index of worst individual
struct individual bestindividual;//best individual of current generation
struct individual worstindividual;//worst individual of current generation
struct individual currentbest;//best individual by now
struct individual population[POPSIZE];//population

//Declaration of Prototype
void GenerateInitialPopulation(void);
void GenerateNextPopulation(void);
void EvaluatePopulation(void);
long DecodeChromosome(char *,int,int);
void CalculateObjectValue(void);
void CalculateFitnessValue(void);
void FindBestAndWorstIndividual(void);
void PerformEvolution(void);
void SelectionOperator(void);
void CrossoverOperator(void);
void MutationOperator(void);
void OutputTextReport(void);

//main program
void main(void)
{
generation=0;
GenerateInitialPopulation();
EvaluatePopulation();
while(generation{
generation++;
GenerateNextPopulation();
EvaluatePopulation();
PerformEvolution();
OutputTextReport();

}

}
//Function:Generate the first population(群体)
//Variable:None
void GenerateInitialPopulation(void)//产生初始群体
{
int i,j;
for(i=0;i{
for(j=0;j{
population[i].chrom[j]=(rand()%10<5)?'0':'1';//rand()%10+1;

}
population[i].chrom[CHROMLENGTH]='\0';
}
}
//Function:Initialize the first population
//Variable:None
void GenerateNextPopulation(void)
{
SelectionOperator();
CrossoverOperator();
MutationOperator();

}
//Function:Evaluate(评价) Population according to certain formula
//Variable:None
void EvaluatePopulation(void)
{
CalculateObjectValue();
CalculateF

itnessValue();
FindBestAndWorstIndividual();

}
//Function:To decode a binary chromosome(染色体) into a decimal integer
//Variable:None
long DecodeChromosome(char *string,int point,int length)
{
int i;
long decimal=0L;
char *pointer;
for(i=0,pointer=string+point;i{
decimal+=(*pointer-'0')<<(length-1-i);

}
return(decimal);
}
//Function:To calculate object value
//Variable:None
void CalculateObjectValue(void)
{
int i;
long temp1,temp2;
double x1,x2;

for (i=0;i{
temp1=DecodeChromosome(population[1].chrom,0,LENGTH1);
temp2=DecodeChromosome(population[1].chrom,LENGTH1,LENGTH2);
x1=4.096*temp1/1023.0-2.048;
x2=4.096*temp2/1023.0-2.048;
population[i].value=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1);
}
}
//Function:To calculate fitness value
//Variable:None
void CalculateFitnessValue(void)
{
int i;
double temp;
for(i=0;i{
if(FunctionMode==MAXIMIZATION)
{
if((population[i].value+Cmin)>0.0)
{
temp=Cmin+population[i].value;
}
else
{
temp=0.0;
}
}
else if(FunctionMode==MINIMIZATION)
{
if(population[i].value{
temp=Cmax-population[i].value;
}
else
{
temp=0.0;
}
}
population[i].fitness=temp;
}
}
//Function:To Find out the best individual so far current generation
//Variable:None
void FindBestAndWorstIndividual(void)
{
int i;
double sum=0.0;
//find out the best and worst individual of this generation
bestindividual=population[0];
worstindividual=population[0];
for(i=1;i{
if(population[i].fitness>bestindividual.fitness)
{
bestindividual=population[i];
best_index=i;
}
else if(population[i].fitness{
worstindividual=population[i];
worst_index=i;
}
sum+=population[i].fitness;
}
//find out the best individual so far
if(generation==0)//initialize the best individual
{
currentbest=bestindividual;
}
else
{
if(bestindividual.fitness>currentbest.fitness)
{
currentbest=bestindividual;
}
}

}
//Function:To perform evolution based on elitise model.Elitist model is to
//replace the worst individual of this generation by the current best one.
//Variable:None
void PerformEvolution(void)
{
if(bestindividual.fitness>currentbest.fitness)
{
currentbest=population[best_index];
}
else
{
population[worst_index]=currentbest;
}
}
//Function:To replace a chromosome by proportional selection
//Variable:None
void SelectionOperator(void)
{
int i,index;
double p,sum;
double cfitness[POPSIZE];//cumulative fitness value
struct individual newpopulation[POPSIZE];
//calculate relative fitness
for(i=0;i{
sum+=population[i].fitness;
}
for(i=0;i{
cfitness[i]=population[i].fitness/sum;
}
//calculate cumulative fitness
for(i=1;i{

cfitness[i]=cfitness[i-1]+cfitness[i];
}
//selection operation
for(i=0;i{
p=rand()%1000/1000.0;
index=0;
while(p>cfitness[index])
{
index++;
}
newpopulation[i]=population[index];
}
for(i=0;i{
population[i]=newpopulation[i];
}
}
//Function:Crossover(交叉) two chromosome by means of one-point crossover(单点交叉)
//Variable:None
void CrossoverOperator(void)
{
int i,j;
int index[POPSIZE];
int point,temp;
double p;
char ch;
//make a pair of individual randomly
for(i=0;i{
index[i]=i;
}
for(i=0;i{
point=rand()%PopSize-i;
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
//one-point crossover operation
for(i=0;i{
p=rand()%1000/1000.0;
if(p{
point=(rand()%CHROMLENGTH-1)+1;
for(j=point;j{
ch=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=ch;

}
}
}
}
//Function:Mutation(变异) of a chromosome
//Variable:None
void MutationOperator(void)
{
int i,j;
double p;
for(i=0;i{
for(j=0;j{
p=rand()%1000/1000.0;
if(p{
population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';
}
}
}
}
//Function:Output the results of current population
//Variable:None
void OutputTextReport(void)
{
int i;
double sum;
double average;
//calculate average object value
sum=0.0;
for(i=0;i{
sum+=population[i].value;
}
average=sum/PopSize;
//print results of this population
printf("gen=%d,avg=%f,best=%f,",generation,average,currentbest.value);
printf("chromsome=");
for(i=0;i{
printf("%c",currentbest.chrom[i]);
}
printf("\n");
}


相关文档
最新文档