ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:20.11KB ,
资源ID:10497354      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10497354.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基本遗传算法的C源程序doc.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

基本遗传算法的C源程序doc.docx

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