📄 inherit.cpp
字号:
void elitist()
{
int i;
double best, worst; /* best and worst fitness values */
int best_mem, worst_mem; /* indexes of the best and worst member */
best = population[0].fitness;
worst = population[0].fitness;
for (i=0; i<POPSIZE; i++)
{
if ( population[i].fitness >= best )
{
best = population[i].fitness;
best_mem = i;
}
if ( population[i].fitness <= worst )
{
worst = population[i].fitness;
worst_mem = i;
}
}
// for (i = 0; i < POPSIZE - 1; i++) //这种求法啰嗦
// {
// if(population[i].fitness > population[i+1].fitness)
// {
// if (population[i].fitness >= best)
// {
// best = population[i].fitness;
// best_mem = i;
// }
// if (population[i+1].fitness <= worst)
// {
// worst = population[i+1].fitness;
// worst_mem = i + 1;
// }
// }
// else
// {
// if (population[i].fitness <= worst)
// {
// worst = population[i].fitness;
// worst_mem = i;
// }
// if (population[i+1].fitness >= best)
// {
// best = population[i+1].fitness;
// best_mem = i + 1;
// }
// }
// }
/* if best individual from the new population is better than */
/* the best individual from the previous population, then */
/* copy the best from the new population; else replace the */
/* worst individual from the current population with the */
/* best one from the previous generation */
if (best >= population[POPSIZE].fitness)
{
for (i = 0; i < NVARS; i++)
population[POPSIZE].gene[i] = population[best_mem].gene[i];
population[POPSIZE].fitness = population[best_mem].fitness;
}
else
{
for (i = 0; i < NVARS; i++)
population[worst_mem].gene[i] = population[POPSIZE].gene[i];
population[worst_mem].fitness = population[POPSIZE].fitness;
}
}
/**************************************************************/
/* Selection function: Standard proportional selection for */
/* maximization problems incorporating elitist model - makes */
/* sure that the best member survives */
/**************************************************************/
void select(void)
{
int mem, i, j;
double sum = 0;
double p;
/* find total fitness of the population */
for (mem = 0; mem < POPSIZE; mem++)
{
sum += population[mem].fitness;
}
/* calculate relative fitness */
for (mem = 0; mem < POPSIZE; mem++)
{
population[mem].rfitness = population[mem].fitness/sum;
}
population[0].cfitness = population[0].rfitness;
/* calculate cumulative fitness */
for (mem = 1; mem < POPSIZE; mem++)
{
population[mem].cfitness = population[mem-1].cfitness + population[mem].rfitness;
}
/* finally select survivors using cumulative fitness. */
for (i = 0; i < POPSIZE; i++)
{
// p = rand()%1000/1000.0;
p=rand()/((RAND_MAX+1)*1.0);
if (p < population[0].cfitness)
newpopulation[i] = population[0];
else
{
for (j = 0; j < POPSIZE;j++)
if (p >= population[j].cfitness && p<population[j+1].cfitness)
newpopulation[i] = population[j+1];
}
}
/* once a new population is created, copy it back */
for (i = 0; i < POPSIZE; 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 mem, one;
int first = 0; /* count of the number of members chosen */
double x,y,a[NVARS],b[NVARS];
for (mem = 0; mem < POPSIZE; mem++)
{
// x = rand()%1000/1000.0;
x=rand()/((RAND_MAX+1)*1.0);
if (x < PXOVER)
{
first++;
if (first % 2 == 0)
{
for (int i=0;i<NVARS;i++)
{
a[i] = population[one].gene[i];
b[i] = population[mem].gene[i];
}
y = rand()/((RAND_MAX+1)*1.0);//y为随机加权因子
for (i=0;i<NVARS;i++)//杂交
{
population[one].gene[i]=y*a[i]+(1-y)*b[i];
population[mem].gene[i]=(1-y)*a[i]+y*b[i];
}
}
// 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(NVARS > 1)
// {
// if(NVARS == 2)
// point = 1;
// else
// point = (rand() % (NVARS - 1)) + 1;
//
// for (i = 0; i < point; 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; i < POPSIZE; i++)
for (j = 0; j < NVARS; j++)
{
// x = rand()%1000/1000.0;
x=rand()/((RAND_MAX+1)*1.0);
if (x < PMUTATION)
{
/* 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 the output file are separated by commas */
/***************************************************************/
void report(ofstream galog)
{
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; i < POPSIZE; i++)
{
sum += population[i].fitness;
sum_square += population[i].fitness * population[i].fitness;
}
avg= sum/POPSIZE;
square_sum = avg * avg * POPSIZE;
stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));
best_val = population[POPSIZE].fitness;
galog<<endl<<generation<<'\t'<<best_val<<'\t'<<avg<<'\t'<<stddev<<endl;
// fprintf(galog, "\n%5d, %6.3f, %6.3f, %6.3f \n\n", generation, best_val, avg, stddev);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -