1、基本遗传算法的C源程序doc/*/ /* 基于基本遗传算法的函数最优化 SGA.C */ /* A Function Optimizer using Simple Genetic Algorithm */ /* developed from the Pascal SGA code presented by David E.Goldberg */ /*/ #include #include #include #include graph.c /* 全局变量 */ struct individual /* 个体*/ unsigned *chrom; /* 染色体 */ double fitness
2、; /* 个体适应度*/ double varible; /* 个体对应的变量值*/ int xsite; /* 交叉位置 */ int parent2; /* 父个体 */ int *utility; /* 特定数据指针变量 */ ; struct bestever /* 最佳个体*/ unsigned *chrom; /* 最佳个体染色体*/ double fitness; /* 最佳个体适应度 */ double varible; /* 最佳个体对应的变量值 */ int generation; /* 最佳个体生成代 */ ; struct individual *oldpop; /*
3、当前代种群 */ struct individual *newpop; /* 新一代种群 */ struct bestever bestfit; /* 最佳个体 */ double sumfitness; /* 种群中个体适应度累计 */ double max; /* 种群中个体最大适应度 */ double avg; /* 种群中个体平均适应度 */ double min; /* 种群中个体最小适应度 */ float pcross; /* 交叉概率 */ float pmutation; /* 变异概率 */ int popsize; /* 种群大小 */ int lchrom; /* 染
4、色体长度*/ int chromsize; /* 存储一染色体所需字节数 */ int gen; /* 当前世代数 */ int maxgen; /* 最大世代数 */ int run; /* 当前运行次数 */ int maxruns; /* 总运行次数 */ int printstrings; /* 输出染色体编码的判断,0 - 不输出, 1 - 输出 */ int nmutation; /* 当前代变异发生次数 */ int ncross; /* 当前代交叉发生次数 */ /* 随机数发生器使用的静态变量 */ static double oldrand55; static int jr
5、and; static double rndx2; static int rndcalcflag; /* 输出文件指针 */ 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(); vo
6、id initreport(),generation(),initmalloc(); 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 c
7、rossover (unsigned *, unsigned *, unsigned *, unsigned *); void mutation(unsigned *); void initialize() /* 遗传算法初始化 */ /* 键盘输入遗传算法参数 */ initdata(); /* 确定染色体的字节长度 */ chromsize = (lchrom/(8*sizeof(unsigned); if(lchrom%(8*sizeof(unsigned) chromsize+; /*分配给全局数据结构空间 */ initmalloc(); /* 初始化随机数发生器 */ random
8、ize(); /* 初始化全局计数变量和一些数值*/ nmutation = 0; ncross = 0; bestfit.fitness = 0.0; bestfit.generation = 0; /* 初始化种群,并统计计算结果 */ initpop(); statistics(oldpop); initreport(); void initdata() /* 遗传算法参数输入 */ char answer2; setcolor(9); disp_hz16(种群大小(20-100):,100,150,20); gscanf(320,150,9,15,4,%d, &popsize); if
9、(popsize%2) != 0) fprintf(outfp, 种群大小已设置为偶数n); popsize+; ; setcolor(9); disp_hz16(染色体长度(8-40):,100,180,20); gscanf(320,180,9,15,4,%d, &lchrom); setcolor(9); disp_hz16(是否输出染色体编码(y/n):,100,210,20); printstrings=1; gscanf(320,210,9,15,4,%s, answer); if(strncmp(answer,n,1) = 0) printstrings = 0; setcolo
10、r(9); disp_hz16(最大世代数(100-300):,100,240,20); gscanf(320,240,9,15,4,%d, &maxgen); setcolor(9); disp_hz16(交叉率(0.2-0.9):,100,270,20); gscanf(320,270,9,15,5,%f, &pcross); setcolor(9); disp_hz16(变异率(0.01-0.1):,100,300,20); gscanf(320,300,9,15,5,%f, &pmutation); void initpop() /* 随机初始化种群 */ int j, j1, k,
11、stop; unsigned mask = 1; for(j = 0; j popsize; j+) for(k = 0; k chromsize; k+) oldpopj.chromk = 0; if(k = (chromsize-1) stop = lchrom - (k*(8*sizeof(unsigned); else stop =8*sizeof(unsigned); for(j1 = 1; j1 = stop; j1+) oldpopj.chromk = oldpopj.chromk1; if(flip(0.5) oldpopj.chromk = oldpopj.chromk|ma
12、sk; oldpopj.parent0 = 0; /* 初始父个体信息 */ oldpopj.parent1 = 0; oldpopj.xsite = 0; objfunc(&(oldpopj); /* 计算初始适应度*/ void initreport() /* 初始参数输出 */ void skip(); skip(outfp,1); fprintf(outfp, 基本遗传算法参数n); fprintf(outfp, -n); fprintf(outfp, 种群大小(popsize) = %dn,popsize); fprintf(outfp, 染色体长度(lchrom) = %dn,lc
13、hrom); fprintf(outfp, 最大进化代数(maxgen) = %dn,maxgen); fprintf(outfp, 交叉概率(pcross) = %fn, pcross); fprintf(outfp, 变异概率(pmutation) = %fn, pmutation); fprintf(outfp, -n); skip(outfp,1); fflush(outfp); void generation() int mate1, mate2, jcross, j = 0; /* 每代运算前进行预选 */ preselect(); /* 选择, 交叉, 变异 */ do /* 挑
14、选交叉配对 */ mate1 = select(); mate2 = select(); /* 交叉和变异 */ jcross = crossover(oldpopmate1.chrom, oldpopmate2.chrom, newpopj.chrom, newpopj+1.chrom); mutation(newpopj.chrom); mutation(newpopj+1.chrom); /* 解码, 计算适应度 */ objfunc(&(newpopj); /*记录亲子关系和交叉位置 */ newpopj.parent0 = mate1+1; newpopj.xsite = jcros
15、s; newpopj.parent1 = mate2+1; objfunc(&(newpopj+1); newpopj+1.parent0 = mate1+1; newpopj+1.xsite = jcross; newpopj+1.parent1 = mate2+1; j = j + 2; while(j (popsize-1); void initmalloc() /*为全局数据变量分配空间 */ unsigned nbytes; char *malloc(); int j; /* 分配给当前代和新一代种群内存空间 */ nbytes = popsize*sizeof(struct ind
16、ividual); if(oldpop = (struct individual *) malloc(nbytes) = NULL) nomemory(oldpop); if(newpop = (struct individual *) malloc(nbytes) = NULL) nomemory(newpop); /* 分配给染色体内存空间 */ nbytes = chromsize*sizeof(unsigned); for(j = 0; j popsize; j+) if(oldpopj.chrom = (unsigned *) malloc(nbytes) = NULL) nomem
17、ory(oldpop chromosomes); if(newpopj.chrom = (unsigned *) malloc(nbytes) = NULL) nomemory(newpop chromosomes); if(bestfit.chrom = (unsigned *) malloc(nbytes) = NULL) nomemory(bestfit chromosome); void freeall() /* 释放内存空间 */ int i; for(i = 0; i 所在代数: %d , bestfit.generation); fprintf(outfp, 适应度:%f 染色体
18、:, bestfit.fitness); writechrom(&bestfit)-chrom); fprintf(outfp, 对应的变量值: %f, bestfit.varible); skip(outfp,1); repchar(outfp,-,80); skip(outfp,1); void writepop() struct individual *pind; int j; for(j=0; j fprintf(outfp,%3d) ,j+1); /* 当前代个体 */ pind = &(oldpopj); writechrom(pind-chrom); fprintf(outfp,
19、 %8f | , pind-fitness); /* 新一代个体 */ pind = &(newpopj); fprintf(outfp,(%2d,%2d) %2d , pind-parent0, pind-parent1, pind-xsite); writechrom(pind-chrom); fprintf(outfp, %8fn, pind-fitness); void writechrom(chrom) /* 输出染色体编码 */ unsigned *chrom; int j, k, stop; unsigned mask = 1, tmp; for(k = 0; k chromsi
20、ze; k+) tmp = chromk; if(k = (chromsize-1) stop = lchrom - (k*(8*sizeof(unsigned); else stop =8*sizeof(unsigned); for(j = 0; j 1; void preselect() int j; sumfitness = 0; for(j = 0; j popsize; j+) sumfitness += oldpopj.fitness; int select() /* 轮盘赌选择*/ extern float randomperc(); float sum, pick; int i
21、; pick = randomperc(); sum = 0; if(sumfitness != 0) for(i = 0; (sum pick) & (i popsize); i+) sum += oldpopi.fitness/sumfitness; else i = rnd(1,popsize); return(i-1); void statistics(pop) /* 计算种群统计数据 */ struct individual *pop; int i, j; sumfitness = 0.0; min = pop0.fitness; max = pop0.fitness; /* 计算最
22、大、最小和累计适应度 */ for(j = 0; j max) max = popj.fitness; if(popj.fitness bestfit.fitness) for(i = 0; i chromsize; i+) bestfit.chromi = popj.chromi; bestfit.fitness = popj.fitness; bestfit.varible = popj.varible; bestfit.generation = gen; /* 计算平均适应度 */ avg = sumfitness/popsize; void title() settextstyle(0
23、,0,4); gprintf(110,15,4,0,SGA Optimizer); setcolor(9); disp_hz24(基本遗传算法,220,60,25); void repchar (outfp,ch,repcount) FILE *outfp; char *ch; int repcount; int j; for (j = 1; j = repcount; j+) fprintf(outfp,%s, ch); void skip(outfp,skipcount) FILE *outfp; int skipcount; int j; for (j = 1; j varible = 0.0; for(k = 0; k chromk; for(j = 0; j stop; j+) bitpos = j + (8*sizeof(unsigned)*k; if(tp&mask) = 1)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1