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


/* This is a simple genetic algorithm implementation where the */
/* evaluation function takes positive values only and the*/
/* fitness of an individual is the same as the value of the*/
/* objective function*/
/**************************************************************************/
#include stdio.h
#include stdlib.h
#include math.h
/* Change any of these parameters to match your needs */
#define POPSIZE 50/* population size */
#define MAXGENS 1000/* max. number of generations */
#define NVARS 3/* no. of problem variables */
#define PXOVER 0.8/* probability of crossover */
#define PMUTATION 0.15/* probability of mutation */
#define TRUE 1
#define FALSE 0
int generation;/* current generation no. */
int cur_best;/* best individual */
FILE *galog;/* an output file */
struct genotype /* genotype (GT), a member of the population */
{
double gene[NVARS];/* a string of variables */
double fitness;/* GT's fitness */
double upper[NVARS];/* GT's variables upper bound */
double lower[NVARS];/* GT's variables lower bound */
double rfitness;/* relative fitness */
double cfitness;/* cumulative fitness */
};
struct genotype population[POPSIZE+1];/* population */
struct genotype newpopulation[POPSIZE+1]; /* new population; */
/* replaces the */
/* old generation */
/* Declaration of procedures used by this genetic algorithm */
void initialize(void);
double randval(double, double);
void evaluate(void);
void keep_the_best(void);
void elitist(void);
void select(void);
void crossover(void);
void Xover(int,int);
void swap(double *, double *);
void mutate(void);
void report(void);
/***************************************************************/
/* Initialization function: Initializes the values of genes*/
/* within the variables bounds. It also initializes (to zero)*/
/* all fitness values for each member of the population. It*/
/* reads upper and lower bounds of each variable from the*/
/* input file `gadata.txt'. It randomly generates values*/
/* between these bounds for each gene of each genotype in the*/
/* population. The format of the input file `gadata.txt' is*/
/* var1_lower_bound var1_upper bound*/
/* var2_lower_bound var2_upper bound ...*/
/***************************************************************/
void initialize(void)
{
FILE *infile;
int i, j;
double lbound, ubound;
if ((infile = fopen("gadata.txt","r"))==NULL)
{
fprintf(galog,"\nCannot open input file!\n");
exit(1);
}
/* initialize variables within the bounds */
for (i = 0; iNVARS; i++)
{
fscanf(infile, "%lf",lbound);
fscanf(infile, "%lf",ubound);
for (j = 0; jPOPSIZE; j++)
{
population[j].fitness = 0;
population[j].rfitness = 0;
population[j].cfitness = 0;
population[j].lower[i] = lbound;
population[j].upper[i]= ubound;
population[j].gene[i] = randval(population[j].lower[i],
population[j].upper[i]);
}
}
fclose(infile);
}
/***********************************************************/
/* Random value generator: Generates a value within bounds */
/***********************************************************/
double randval(double low, double high)
{
double val;
val = ((double)(rand()%1000)/1000.0)*(high - low) + low;
return(val);
}
/*************************************************************/
/* Evaluation function: This takes a user defined function.*/
/* Each time this is changed, the code has to be recompiled. */
/* The current function is:x[1]^2-x[1]*x[2]+x[3]*/
/*************************************************************/

推荐阅读