1、/*/ /* 基于基本遗传算法的函数最优化 SGA.C */ /* A Function Optimizer using Simple Genetic Algorithm */ /* developed from the Pascal SGA code presented by David E.Goldberg */ /*/ #include #include /* 全局变量 */ struct individual /* 个体*/ unsigned *chrom; /* 染色体 */ double fitness; /* 个体适应度*/ double varible; /* 个体对应的变量值
2、*/ int xsite; /* 交叉位置 */ int parent2; /* 父个体 */ int *utility; /* 特定数据指针变量 */ ; struct bestever /* 最佳个体*/ unsigned *chrom; /* 最佳个体染色体 */ double fitness; /* 最佳个体适应度 */ double varible; /* 最佳个体对应的变量值 */ int generation; /* 最佳个体生成代 */ ; struct individual *oldpop; /* 当前代种群 */ struct individual *newpop; /*
3、新一代种群 */ struct bestever bestfit; /* 最佳个体 */ double sumfitness; /* 种群中个体适应度累计 */ double max; /* 种群中个体最大适应度 */ double avg; /* 种群中个体平均适应度 */ double min; /* 种群中个体最小适应度 */ float pcross; /* 交叉概率 */ float pmutation; /* 变异概率 */ int popsize; /* 种群大小 */ int lchrom; /* 染色体长度*/ int chromsize; /* 存储一染色体所需字节数 */
4、 int gen; /* 当前世代数 */ int maxgen; /* 最大世代数 */ int run; /* 当前运行次数 */ int maxruns; /* 总运行次数 */ int printstrings; /* 输出染色体编码的判断, 0 - 不输出, 1 - 输出 */ int nmutation; /* 当前代变异发生次数 */ int ncross; /* 当前代交叉发生次数 */ /* 随机数发生器使用的静态变量 */ static double oldrand55; static int jrand; static double rndx2; static int r
5、ndcalcflag; /* 输出文件指针 */ FILE *outfp ; /* 函数定义 */ void advance_random(); int flip(float);rnd(int, int); void randomize(); double randomnormaldeviate(); float randomperc(),rndreal(float,float); void warmup_random(float); void initialize(),initdata(),initpop(); void initreport(),generation(),initmallo
6、c(); void freeall(),nomemory(char *),report(); void writepop(),writechrom(unsigned *); void preselect(); void statistics(struct individual *); void title(),repchar (FILE *,char *,int); void skip(FILE *,int); int select(); void objfunc(struct individual *); int crossover (unsigned *, unsigned *, unsi
7、gned *, unsigned *); void mutation(unsigned *); void initialize() /* 遗传算法初始化 */ /* 键盘输入遗传算法参数 */ initdata(); /* 确定染色体的字节长度 */ chromsize = (lchrom/(8*sizeof(unsigned); if(lchrom%(8*sizeof(unsigned) chromsize+; /*分配给全局数据结构空间 */ initmalloc(); /* 初始化随机数发生器 */ randomize(); /* 初始化全局计数变量和一些数值 */ nmutation
8、= 0; ncross = 0; bestfit.fitness = 0.0; bestfit.generation = 0; /* 初始化种群,并统计计算结果 */ initpop(); statistics(oldpop); initreport(); void initdata() /* 遗传算法参数输入 */ char answer2; popsize=30; if(popsize%2) != 0) fprintf(outfp, “种群大小已设置为偶数n“); popsize+; ; lchrom=22; printstrings=1; maxgen=150; pcross=0.8;
9、pmutation=0.005; void initpop() /* 随机初始化种群 */ int j, j1, k, stop; unsigned mask = 1; for(j = 0; j fitness); /* 新一代个体 */ pind = fprintf(outfp,“(%2d,%2d) %2d “, pind-parent0, pind-parent1, pind-xsite); writechrom(pind-chrom); fprintf(outfp,“ %8fn“, pind-fitness); void writechrom(chrom) /* 输出染色体编码 */ u
10、nsigned *chrom; int j, k, stop; unsigned mask = 1, tmp; for(k = 0; k 1; void preselect() int j; sumfitness = 0; for(j = 0; j varible + bitpow; tp = tp1; critter-varible =-1+critter-varible*3/(pow(2.0,(double)lchrom)-1); critter-fitness =critter-varible*sin(critter-varible*10*atan(1)*4)+2.0; void mut
11、ation(unsigned *child) /*变异操作*/ int j, k, stop; unsigned mask, temp = 1; for(k = 0; k = high) i = low; else i = (randomperc() * (high - low + 1) + low; if(i high) i = high; return(i); void warmup_random(float random_seed) /* 初始化随机数发生器*/ int j1, ii; double new_random, prev_random; oldrand54 = random_seed; new_random = 0.000000001; prev_random = random_seed; for(j1 = 1 ; j1 fitness); /* 新一代个体 */ pind = fprintf(outfp,“(%2d,%2d) %2d “, pind-parent0, pind-parent1, pind-xsite); writechrom(pind-ch);