




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
广西大学 机械学院 人工智能 课程设计人工智能遗传算法函数优化目录1引言31.1 摘要31.2 背景32 实验过程42.1 程序目标42.2 实验原理及步骤42.3程序52.3.1程序理解:52.3.3调试程序:62.4 实验总结181引言1.1 摘要函数优化是遗传算法的经典应用领域,也是对遗传算法进行性能评价的常用算例。本文将用一个详细的例子来说明用遗传算法解一个简单参数优化问题的过程。这里求解的是一个函数的最大值的问题。1.2 背景遗传算法采纳自然进化模型。通过保持一个潜在解的群体执行了多方向的搜索并支持这些方向上的信息构成和交换。群体经过一个模拟进化的过程:在每一代,相对“好”的解产生,相对“差”的解死亡。为区别不同解,我们使用了一个目标(评价)函数,它起着一个环境的作用。选择是用来确定管理费用或交叉个体,以及被选个体将产生多少个代个体。杂交组合了两个亲代染色体的特征,并通过交换父代相应的片断形成了两个相似的后代。杂交算子的意图是在不同潜在解之间进行信息交换。变异是通过用一个等于变异率的概率随机地改变被选择染色体上的一个或多个基因。变异算子的意图是向群体引入一些额外的变化性。运用遗传算法解题必经的五个步骤:1 对问题潜在解的遗传表达。2 产生潜在解初始群体的方法。3 起环境作用的用“适应值”评价解的适应程度的评价函数。4 改变后代组成的各种遗传算子。5 遗传算法所使用的各种参数:群体规模、应用遗传算子的概率等。2 实验过程2.1 程序目标在实验过程中,我们应用遗传算法来模拟一个函数优化的问题。程序所要解决的问题是求f(x1,x2)=21.5+x1*sin(4pi*x1)+x2*sin(20pi*x2)的最大值,其中-3.0x112.1及4.1x25.8。2.2 实验原理及步骤1 ) 首先确立变量x1的定义域长度为15.1;所要求的小数点以后第四位精度意味着区间-3.0, 12.1应该至少被分成15.1*10000个等距区间,即染色体的第一部分需要18位;自变量x2域长度为1.7,精度要求区间4.1, 5.8应该至少被分成1.7*10000个等距区间,即染色体的第二部分需要15位。所以染色体总长度为33位。用遗传算法的优化函数f,产生了一个有pop_size = 20个染色体的群体。所有染色体的33位都是随机初始化。对每个染色体进行解码并计算解码后的(x1,x2)的适应函数值,eval(vi) (i=1,.,pop_size) = f(x1,x2)。2)为选择过程建立一个轮盘。计算群体的总适应值F,并计算每个染色体vi (i=1,.,pop_size)的选择概率pi:pi = eval(vi) / F 和累积概率qi: qi = p1 + . + pi.3)转动轮盘20次,每次为新群体选择一单个染色体。生成一个区间0,1里的20个数的一个随机序列。如果一个随机数位于qi于q(i+1)之间,则q(i+1)被选择。4)对新群体中的个体应用杂交算子。杂交概率pc = 0.25,所以预计染色体中平均有25%将经历杂交。杂交按照下面的方法进行:对新群体中的每个染色体,产生在区间0,1里的随机数r,并从随机序列中选出r0.25的染色体进行杂交。5)对被选择的染色体随机进行配对。并从区间1,32里产生一个随机整数pos。数字pos表示杂交点的位置。6)算子变异。在一位一位基础上执行。变异概率pm = 0.01,所以我们预计平均将有1%的位经历变异。整个群体共有m*pop_size = 660位,可以预计平均每代有6.6次变异。因为每一位都有均等的机会被变异,所以对群体中的每一位可以产生区间0,1里的一个随机数r,如果r0.01,则变异此位。7)由上面得到最新的向量群体。对每个染色体进行解码,并计算解码后的(x1,x2)的适应函数值。选出最好染色体的评价值。8)准备再一次运行选择过程,继续进行迭代计算,应用遗传算子及评价下一代。2.3程序2.3.1程序理解:初始化函数:在变量限定的范围内初始化遗传因子的值。从gadata.txt这个文件中读取每个变量的上下边界,并且在这个范围内随机初始化产生染色体中的值。随机值生成函数:多次用到此函数。评价函数:函数需要用户自己定义一个数学函数式。populationmem.fitness = 21.5+x1*sin(4.0*PI*x1)+x2*sin(20.0*PI*x2);记录最优个体(取优函数):前一代的最优成员被存储在数组的最后。但如果现今这一代的最优成员并没有上一代的好(值小于),则后者(上一代的最优值)会取代本代中最差的成员。如果当前代的最优值大于上一代的,则将当前代的最优值拷贝出来,否则则用上一代的最优值取代当前代的最差值。确保我们始终取到最适合的那个值。选择函数:为的是解决优化模型中的最大问题,确保最优秀的成员始终存活下来。杂交函数:void Xover(int one, int two)对选择出来的双亲进行杂交。变异:void mutate(void)某个被选择出来的要进行变异的因子,将会被一个取值范围内的随机量所代替。报告函数:void report(void)用来报告演算程序的进展。输入output文件里的数据以逗号相隔。2.3.3调试程序:写好程序之后,就可以进行调试了。当在gadat.txt里输入3 5;6 9;7 8;1 6四组数据时,在”galog.txt”文件中可以看到输出的结果。现附上迭代500次的结果:1, 32., 23., 5. 2, 32., 25., 4. 3, 32., 25., 4. 4, 32., 26., 4. 5, 34., 27., 4. 6, 34., 27., 4. 7, 34., 28., 4. 8, 34., 28., 4. 9, 34., 28., 3.。 494, 34., 34., 0. 495, 34., 34., 0. 496, 34., 34., 0. 497, 34., 34., 0. 498, 34., 34., 0. 499, 34., 34., 0. 500, 34., 34., 0.Simulation completed var(0) = 4. var(1) = 8. var(2) = 7. var(3) = 5. Best fitness = 34.附源代码:#include #include #include #define TRUE 1#define FALSE 0#define PMUTATION 0.001 #define MAXGENS 500 #define POPSIZE 100 #define NVARS 4 #define PXOVER 0.8 int generation; int cur_best; FILE *galog; FILE *output; struct genotype double geneNVARS; double fitness; double upperNVARS; double lowerNVARS; double rfitness; double cfitness; ;struct genotype populationPOPSIZE+1; struct genotype newpopulationPOPSIZE+1; 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);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); remove(output.dat);for (i = 0; i NVARS; i+) fscanf(infile, %lf,&lbound); fscanf(infile, %lf,&ubound); for (j = 0; j POPSIZE; j+) populationj.fitness = 0; populationj.rfitness = 0; populationj.cfitness = 0; populationj.loweri = lbound; populationj.upperi = ubound; populationj.genei = randval(populationj.loweri, populationj.upperi); fclose(infile);double randval(double low, double high)double val;val = (double)(rand()%1000)/1000.0)*(high - low) + low;return(val);void evaluate(void)if (output = fopen(output.dat,a)=NULL) exit(1); int mem;int i;double xNVARS+1;double PI = 3.;for (mem = 0; mem POPSIZE; mem+) for (i = 0; i NVARS; i+) xi+1 = populationmem.genei; populationmem.fitness = 21.5+x1*sin(4.0*PI*x1)+x2*sin(20.0*PI*x2); if (populationmem.fitness 35) fprintf(output, n%5d, %6.9f, %6.9f, %6.9f , generation, x1,x2,populationmem.fitness); fclose(output);void keep_the_best()int mem;int i;cur_best = 0; for (mem = 0; mem populationPOPSIZE.fitness) cur_best = mem; populationPOPSIZE.fitness = populationmem.fitness; for (i = 0; i NVARS; i+) populationPOPSIZE.genei = populationcur_best.genei;void elitist()int i;double best, worst; int best_mem, worst_mem; best = population0.fitness;worst = population0.fitness;for (i = 0; i populationi+1.fitness) if (populationi.fitness = best) best = populationi.fitness; best_mem = i; if (populationi+1.fitness = worst) worst = populationi+1.fitness; worst_mem = i + 1; else if (populationi.fitness = best) best = populationi+1.fitness; best_mem = i + 1; if (best = populationPOPSIZE.fitness) for (i = 0; i NVARS; i+) populationPOPSIZE.genei = populationbest_mem.genei; populationPOPSIZE.fitness = populationbest_mem.fitness; else for (i = 0; i NVARS; i+) populationworst_mem.genei = populationPOPSIZE.genei; populationworst_mem.fitness = populationPOPSIZE.fitness; void select(void)int mem, i, j, k;double sum = 0;double p;for (mem = 0; mem POPSIZE; mem+) sum += populationmem.fitness; for (mem = 0; mem POPSIZE; mem+) populationmem.rfitness = populationmem.fitness/sum; population0.cfitness = population0.rfitness;for (mem = 1; mem POPSIZE; mem+) populationmem.cfitness = populationmem-1.cfitness + populationmem.rfitness; for (i = 0; i POPSIZE; i+) p = rand()%1000/1000.0; if (p population0.cfitness) newpopulationi = population0; else for (j = 0; j = populationj.cfitness & ppopulationj+1.cfitness) newpopulationi = populationj+1; for (i = 0; i POPSIZE; i+) populationi = newpopulationi; void crossover(void)int i, mem, one;int first = 0; double x;for (mem = 0; mem POPSIZE; +mem) x = rand()%1000/1000.0; if (x 1) if(NVARS = 2) point = 1; else point = (rand() % (NVARS - 1) + 1; for (i = 0; i point; i+) swap(&populationone.genei, &populationtwo.genei); void swap(double *x, double *y)double temp;temp = *x;*x = *y;*y = temp;void mutate(void)int i, j;double lbound, hbound;double x;for (i = 0; i POPSIZE; i+) for (j = 0; j NVARS; j+) x = rand()%1000/1000.0; if (x PMUTATION) lbound = populationi.lowerj; hbound = populationi.upperj; populationi.genej = randval(lbound, hbound); void report(void)int i;double best_val; double avg; double stddev; double sum_square; double square_sum; double sum; sum = 0.0;sum_square = 0.0;for (i = 0; i POPSIZE; i+) sum += populationi.fitness; sum_square += populationi.fitness * populationi.fitness; avg = sum/(double)POPSIZE;square_sum = avg * avg * POPSIZE;stddev = sqrt(sum_square - square_sum)/(POPSIZE - 1);best_val = populationPOPSIZE.fitness;fprintf(galog, n%5d, %6.9f, %6.9f, %6.9f , generation, best_val, avg, stddev);printf( n%5d, %6.9f, %6.9f, %6.9f , generation, best_val, avg, stddev);void main(void)int i;if (galog = fopen(galog.txt,w)=NULL) exit(1); generation = 0;fprintf(galog, n generation best average standard n);printf( n generation best average standard n);fprintf(galog,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一活动吃喝玩乐活动方案
- 六一活动捉小鸡活动方案
- 六一活动美容活动方案
- 六一烹饪活动方案
- 六一舞蹈趣味活动方案
- 六一趣味捞鱼活动方案
- 六一饮品联名活动方案
- 医保知识考试试题及答案2025
- 药日考试试题及答案
- 药房招聘考试试题及答案
- 单位办公室文员考试试题及答案
- 国家融通地产所属单位招聘笔试题库2025
- 海关总署在京直属事业单位招聘考试真题2024
- 医学职业防护课件
- 大学生自杀统计报告和多重因素分析
- 辽宁中考:历史必考知识点
- 2022大容量海上风电机组智能功能要求技术规范
- 职业技术学院化工装备技术专业人才培养调研报告
- 护理心理学试题及答案解读
- 殡葬火化师试题及答案大全
- 2025年高考物理压轴题专项训练:动量定理及碰撞类动量守恒定律的应用(解析版)
评论
0/150
提交评论