//计算函数值
//To calulate object value;
//Note: For different problem, user must change these code .
// This example is dealing with Rosenbrock function.
// Rosenbrock function is define as:
// f(x1,x2) = 100 * (x1 ** 2 - x2) ** 2 + (1 - x1) ** 2
// Its maximal value is:
// f(-2.048, -2.048) = 3905.926227
void CalculateObjectValue(void)
{
int i;
long temp1,temp2;
double x1, x2;
for(i = 0; i < PopSize; i++)
{
temp1 = DecodeChromosome(population[i].chrom, 0, LENGTH1);
temp2 = DecodeChromosome(population[i].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);
}
}
//适应度计算
//To calculate fitness value.
void CalulateFitnessValue(void)
{
int i;
double temp;
for(i = 0; i < PopSize; i++)
{
if(FunctionMode == MAXIMIZATION)//maximization
{
if((population[i].value + Cmin) > 0.0)
{
temp = Cmin + population[i].value;
}
else
{
temp = 0.0;
}
}
else if(FunctionMode == MINIMIZATION)//minimization
{
if(population[i].value < Cmax)
{
temp = Cmax - population[i].value;
}
else
{
temp = 0.0;
}
}
population[i].fitness = temp;
}
}
//找到最优个体和最差个体
//To find out the best individual so far current generation
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 < PopSize; i++)
{
if(population[i].fitness > bestindividual.fitness)
{
bestindividual = population[i];
best_index = i;
}
else if(population[i].fitness < worstindividual.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;
}
}
}
//进化操作
//Toperform evolution operation based on elitise modual. Elitist model is to replace the worst
//individual of this generation by the current best one.
void PerformEvolution(void)
{
if(bestindividual.fitness > currentbest.fitness)
{
currentbest = population[best_index];
}
else
{
population[worst_index] = currentbest;
}
}
//基因的选择算子
//Toreplace a chromosome by proportional selection.
void SelectionOperator(void)
{
int i, index;
double p,sum = 0.0;
double cfitness[POPSIZE]; //cumulative fitness value
struct individual newpopulation[POPSIZE];
//calculate relative fitness
for(i = 0; i < PopSize; i++)
{
sum += population[i].fitness;
}
for(i = 0; i < PopSize; i++)
{
cfitness[i] = population[i].fitness / sum;
}
//calculate cumulative fitness
for(i = 1; i < PopSize; i++)
{
cfitness[i] = cfitness[i-1] + cfitness[i];
}
//selection operation
for(i = 0; i < PopSize; i++)
{
p = rand() % 1000 / 1000.0;
index = 0;
while(p > cfitness[index])
index++;
newpopulation[i] = population[index];
}
for(i = 0; i < PopSize; i++)
{
population[i] = newpopulation[i];
}
}
评论