C语言多元函数的遗传算法 遗传算法多元函数最优解原理( 五 )


/* calculate cumulative fitness */
for (mem = 1; memPOPSIZE; mem++)
{
population[mem].cfitness =population[mem-1].cfitness +
population[mem].rfitness;
}
/* finally select survivors using cumulative fitness. */
for (i = 0; iPOPSIZE; i++)
{
p = rand()%1000/1000.0;
if (ppopulation[0].cfitness)
newpopulation[i] = population[0];
else
{
for (j = 0; jPOPSIZE;j++)
if (p = population[j].cfitness
ppopulation[j+1].cfitness)
newpopulation[i] = population[j+1];
}
}
/* once a new population is created, copy it back */
for (i = 0; iPOPSIZE; i++)
population[i] = newpopulation[i];
}
/***************************************************************/
/* Crossover selection: selects two parents that take part in*/
/* the crossover. Implements a single point crossover*/
/***************************************************************/
void crossover(void)
{
int i, mem, one;
int first=0; /* count of the number of members chosen */
double x;
for (mem = 0; memPOPSIZE; ++mem)
{
x = rand()%1000/1000.0;
if (xPXOVER)
{
++first;
if (first % 2 == 0)
Xover(one, mem);
else
one = mem;
}
}
}
/**************************************************************/
/* Crossover: performs crossover of the two selected parents. */
/**************************************************************/
void Xover(int one, int two)
{
int i;
int point; /* crossover point */
/* select crossover point */
if(NVARS1)
{
if(NVARS == 2)
point = 1;
else
point = (rand() % (NVARS - 1)) + 1;
for (i = 0; ipoint; i++)
swap(population[one].gene[i], population[two].gene[i]);
}
}
/*************************************************************/
/* Swap: A swap procedure that helps in swapping 2 variables */
/*************************************************************/
void swap(double *x, double *y)
{
double temp;
temp = *x;
*x = *y;
*y = temp;
}
/**************************************************************/
/* Mutation: Random uniform mutation. A variable selected for */
/* mutation is replaced by a random value between lower and*/
/* upper bounds of this variable*/
/**************************************************************/
void mutate(void)
{
int i, j;
double lbound, hbound;
double x;
for (i = 0; iPOPSIZE; i++)
for (j = 0; jNVARS; j++)
{
x = rand()%1000/1000.0;
if (xPMUTATION)
{
/* find the bounds on the variable to be mutated */
lbound = population[i].lower[j];
hbound = population[i].upper[j];
population[i].gene[j] = randval(lbound, hbound);
}
}
}
/***************************************************************/
/* Report function: Reports progress of the simulation. Data*/
/* dumped into theoutput file are separated by commas*/
/***************************************************************/
void report(void)
{
int i;
double best_val;/* best population fitness */
double avg;/* avg population fitness */
double stddev;/* std. deviation of population fitness */
double sum_square;/* sum of square for std. calc */
double square_sum;/* square of sum for std. calc */
double sum;/* total population fitness */
sum = 0.0;
sum_square = 0.0;
for (i = 0; iPOPSIZE; i++)
{
sum += population[i].fitness;
sum_square += population[i].fitness * population[i].fitness;
}
avg = sum/(double)POPSIZE;
square_sum = avg * avg * POPSIZE;
stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));

推荐阅读