//基因的交叉算子
//Crossover two chromosome by means of one-point crosover.
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 < PopSize; i++)
{
index[i] = i;
}
for(i =0; i < PopSize; i++)
{
point = random(PopSize - i);
temp = index[i];
index[i] = index[point + i];
index[point + i] = temp;
}
//one - point crossover operation
for(i = 0; i < PopSize - 1; i += 2)
{
p = rand() % 1000 / 1000.0;
if(p < Pc)
{
point = random(CHROMLENGTH - 1) + 1;
for(j = point; j < CHROMLENGTH; 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;
}
}
}
}
//基因突变
//Mutation of a chromosome.
void MutationOperator(void)
{
int i, j;
double p;
//bit mutation
for(i = 0; i < PopSize; i++)
{
for(j = 0; j < CHROMLENGTH; j++)
{
p = rand() % 1000 / 1000.0;
if(p < Pm)
{
population[i].chrom[j] = (population[i].chrom[j] = '0') ? '1' : '0';
}
}
}
}
//打印报表
//Output the results of urrent population
void OutputTextReport(void)
{
int i;
double sum;//temporary sum
double average; //average of population object value;
//calculate average object value
sum = 0.0;
for(i = 0; i < PopSize; i++)
{
sum += population[i].value;
}
average = sum / PopSize;
//print result of this population
printf("gen=%d\tavg=%f\tbest=%f\t", generation, average, currentbest.value);
printf("chromosome=");
for(i = 0; i < CHROMLENGTH; i++)
{
printf("%c", currentbest.chrom[i]);
}
printf("\n");
//getch();
}
//END
//(标准库中没有random函数,这个是我补充的函数)
int random(int max)
{
return (rand() % max);
评论