




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/* * 简单遗传算法(SGA) * 主要算法模块有:选择 交叉 变异 (三个遗传操作) 和 群体更新 * 以及 随即数发生器 输入 输出 译码 适应度计算 * 选择机制为比例选择 交叉采用单点交叉 变异采用简单的位点变异方式 * 多变量编码采用把各个变量染色体基因交替相连的方式,体现在译码模块中 */* 1999.10.20 增添编码函数,方便输入初值 */ -/ A Simple Genetic Algorithm - SGA / (c) Ding Zhen Yu 1998 / -/ All Rights Reserved / -#include #include #include /#define NeedInputInitialChrom / 如果需要输入初始值,一般是因为上次没有 / 计算完成,可以接着再算 /#define NeedInputData /输入种群中第一个的大小(01.0之间)#undef NeedInputInitialChrom/*NOTICE:modify varnumber and perchrom for each problem.*/#define varnumber 32 /* 变量个数 */#define perchrom 5 /* 单变量染色体长度 */#define popsize 20 /* 群体规模(应为偶数) */#define maxgen 5000 /* 遗传世代数 */#define maxstring varnumber*perchrom /* 多变量总的染色体长度 */#define pcross 0.80 /* 交叉概率0.00,1.00 */#define pmutation 0.001 /* 变异概率0.00,1.00 */extern double Obj_func(double *x);struct pp unsigned int chrommaxstring; double xvarnumber,fitness; unsigned int parent1,parent2,xsite; ;struct pp oldpoppopsize,newpoppopsize,p1popsize;unsigned int lchrom,gen,nmutation,ncross,jcross,maxpp,minpp;double sumfitness,avg,max,min;double coef;long seedl1;double objfunc(double *); /* 目标函数,应该是正的,最小问题要化为最大问题 */void statistics(); /* 群体适应度统计 */int rselect(); /* 赌轮选择 */int flip(double); /* 贝努利测试 */int crossover(); /* 一点交叉操作 */int mutation(unsigned int); /* 变异操作 */void generation(); /* 世代更新 */void initialize(); /* 初始化 */void initpop(); void report(); void initdata();void initreport();void decode(unsigned int *, double *); /* 解码,变量取值在0到1之间 */void encode(unsigned int *, double *); /* 编码,输入变量取值在0到1之间 */double randomd01();int randomi01();int randomi(int,int);/* SGA main program */* xxi will be a double between 0 and 1.0 */void sga(double *xx) long int i,gen,k,j; double oldmax; int oldmaxpp; gen=0; seedl0=-9l; /printf(initializing.n); initialize(); for (i=0; ipopsize; i ) p1i=newpopi; newpopi=oldpopi; report(gen); for (i=0; ipopsize; i ) newpopi=p1i; do gen=gen 1; oldmax=max; oldmaxpp=maxpp; generation(); statistics(newpop); if (maxoldmax) for (j=0; jlchrom; j ) newpopminpp.chromj=oldpopoldmaxpp.chromj; for (j=0; jvarnumber; j ) newpopminpp.xj=oldpopoldmaxpp.xj; newpopminpp.fitness=oldpopoldmaxpp.fitness; statistics(newpop); report(gen); for (i=0; ipopsize; i ) p1i=oldpopi; oldpopi=newpopi; newpopi=p1i; while (genmaxgen); for (i=0; ivarnumber; i ) xxi=oldpopmaxpp.xi; /printf(xx%d=%f ,i,xxi); /printf(n); return;/* calculate individual fitness */double objfunc(double *x) double temp; temp=1.0/Obj_func(x); return temp;/* statistics of the group fitness */void statistics(pop)struct pp *pop; int j; sumfitness=pop0.fitness; min=pop0.fitness; max=pop0.fitness; maxpp=0; minpp=0; for (j=1;jmax) max=popj.fitness; maxpp=j; if (popj.fitnessmin) min=popj.fitness; minpp=j; avg=sumfitness/(double)popsize;/* new group */void generation() unsigned int j,mate1,mate2; j=0; do mate1=rselect(); mate2=rselect(); crossover(oldpopmate1.chrom,oldpopmate2.chrom,j); decode(newpopj.chrom,newpopj.x); newpopj.fitness=objfunc(newpopj.x); newpopj.parent1=mate1; newpopj.parent2=mate2; newpopj.xsite=jcross; decode(newpopj 1.chrom,newpopj 1.x); newpopj 1.fitness=objfunc(newpopj 1.x); newpopj 1.parent1=mate1; newpopj 1.parent2=mate2; newpopj 1.xsite=jcross; j=j 2; while (jpopsize);/* initialize */void initialize() coef=pow(2.00,perchrom)-1.0; initdata(); initpop(); statistics(oldpop); initreport();/* contral parameters input */void initdata() lchrom=perchrom*varnumber; nmutation=0; ncross=0;/* generation of initial group */* 按随机方式产生初始解群,或者直接输入前次结束时的染色体, * 或者按需要输入一个个体 */void initpop() int i,j,j1; /printf(initializing populations.n);#ifdef NeedInputInitialChrom printf(input initial chrom:n);#endif for (j=0;jpopsize;j ) /printf(j=%dn,j); for (j1=0;j1lchrom;j1 ) oldpopj.chromj1=randomi01();#ifdef NeedInputInitialChrom for (j1=0;j1lchrom;j1 ) scanf(,&oldpopj.chromj1); printf(%d in %d has been readed.n,j 1,popsize);#endif decode(oldpopj.chrom,oldpopj.x);#ifdef NeedInputInitialChrom for (j1=0;j1varnumber;j1 ) printf(x%d=%fn,j1,oldpopj.xj1);#endif oldpopj.fitness=objfunc(oldpopj.x); oldpopj.parent1=0; oldpopj.parent2=0; oldpopj.xsite=0; #ifdef NeedInputData printf(input %d initial data(0.01.0):n,varnumber); for (i=0; ivarnumber; i ) scanf(%lf,&oldpop0.xi); encode(oldpop0.chrom,oldpop0.x); oldpop0.fitness=objfunc(oldpop0.x); oldpop0.parent1=0; oldpop0.parent2=0; oldpop0.xsite=0;#endif/* initialization infomation output */void initreport() int j,k; printf(n-n); printf( SGA Parameters n); printf(-nn); printf(Population size (popsize) = %d n,popsize); printf(Chromosome length (lchrom) = %d n,lchrom); printf(Maximum # of generation (maxgen) = %d n,maxgen); printf(Crossover probablity (pcross) = %f n,pcross); printf(Mutation probablity (pmutation) = %f n,pmutation); printf(-nn); printf(Initial Population Maximum Fitness = %f n,max); printf(Initial Population Average Fitness = %f n,avg); printf(Initial Population Minimum Fitness = %f n,min); printf(Initial Population Sum of Fitness = %f n,sumfitness);/* data output */void report(int gen) int k,j,i; for (j=0; j79; j ) printf(*); printf(n); printf(Population Report n); printf(Generation = n,gen); printf(#parents xsite string x fitness n); for (j=0; j79; j ) printf( ); printf(n); for (j=0; jpopsize; j ) for (k=0; klchrom; k ) printf(%d,newpopj.chromk); printf(n); printf(n); /for (j=0; jpopsize; j ) j=maxpp; printf(%d %d ,j,newpopj.parent1); printf(%d %d ,newpopj.parent2,newpopj.xsite); /for (k=0; klchrom; k ) / printf(%d,newpopj.chromk); for (i=0; ivarnumber; i ) printf( %f ,newpopj.xi); printf(fitness=%f n,newpopj.fitness); for (k=0; k79; k ) printf(*); printf(n); printf(RESULT: GEN: %d ,gen); printf(AVG=%f MIN=%f MAX=%f n,avg,min,max); printf(ncross=%d nmutation = %d n,ncross,nmutation); /* decode */void decode(unsigned int *pp,double *x) int i,j; double tt,tt1; for (i=0; i-1 (varnumber-i-1);j-=varnumber) if (ppj) tt=tt tt1; tt1=2.0*tt1; tt=tt/coef;/tt is between 0.0 and 1.0 /change variables value range xi=0.0001 7.0*tt/10.0; /* encode */void encode(unsigned int *pp,double *x) int i,j,dx; double fx; for (i=0; i0.5) dx =1; for (j=lchrom-1-i;j-1 (varnumber-i-1); j-=varnumber) if (dx%2=1) ppj=1; /printf(1); else ppj=0; /printf(0); dx=dx/2; /* select operation */* 几种流行的选择机制:* 1. 赌轮选择(roulette wheel selection)机制; 也叫适应度比例方式(fitness proportional model); 2. 最佳保留(elitist model)选择机制; 3. 期望值模型(expected value model)选择机制; 4. 随机竞争(stochastic tournament)选择机制; 5. 排序(ranking)选择机制; 6. 排挤方法(crowding model);*/ 赌轮选择(roulette wheel selection)机制;int rselect() double rand1,partsum; int j; partsum=0.0; j=0; rand1=randomd01()*sumfitness; do partsum=partsum oldpopj.fitness; j=j 1; while (partsumrand1)&(jpopsize); return j-1;/* mutation operation */int mutation(unsigned int ch) int mutate,j; mutate=flip(pmutation); if (mutate) nmutation=nmutation 1; if (ch) ch=0; else ch=1; if (ch) return 1; else return 0;/* crossover operation */int crossover(unsigned int *parent1,unsigned int *parent2,int k5) int i,j,j1; if (flip(pcross) jcross=randomi(1,lchrom-1); ncross=ncross 1; else jcross=lchrom; if (jcross!=lchrom) for (j=0; jjcross; j ) newpopk5.chromj=mutation(parent1j); newpopk5 1.chromj=mutation(parent2j); for (j=jcross;jlchrom;j ) newpopk5.chromj=mutation(parent2j); newpopk5 1.chromj=mutation(parent1j); else for (j=0; jlchrom; j ) newpopk5.chromj=mutation(parent1j); newpopk5 1.chromj=mutation(parent2j); return 1;/* Bernoulli Trials */int flip(double probability) double ppp; ppp=randomd01(); if (ppp=probability) return 1; else return 0;/* return a double random number between 0.01.0 */double randomd01() int j; long k; static long idum2=1234567
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年合同制员工管理核心流程 清华大学人事部
- 智能交通技术项目合作合同
- 电子商务网络安全防御技能测试卷
- 产品销售代理合同书及其附件
- 2023-2024学年广东广州白云区五年级上册语文期末试卷及答案
- 2025年蚌埠市国有资本运营控股集团有限公司招聘4人笔试参考题库附带答案详解
- 2025年湖南兴湘投资控股集团有限公司春季校园招聘28人笔试参考题库附带答案详解
- 废弃矿山修复策略及实施方案解析
- 办公楼改造项目可行性研究报告分析
- 居家办公合同协议书
- 苏教版二年级数学下册《角的初步认识》学习单(终稿)
- 2022年质量、环境及职业健康安全三体系各部门内审检查记录表完整内容
- 《工厂供电》第六版习习题解答(不全)
- 海水分析化学 考试大纲
- QJZ系列说明书
- 压铸模具毕业设计论文
- 国内常见模具钢牌号对照表
- 专用汽车购销合同
- 解聘证明范本
- C620床头箱设计说明书解析
- 混凝土静力抗压弹性模量试验记录表
评论
0/150
提交评论