收藏 分享(赏)

遗传算法.doc

上传人:hwpkd79526 文档编号:6546155 上传时间:2019-04-16 格式:DOC 页数:12 大小:103.20KB
下载 相关 举报
遗传算法.doc_第1页
第1页 / 共12页
遗传算法.doc_第2页
第2页 / 共12页
遗传算法.doc_第3页
第3页 / 共12页
遗传算法.doc_第4页
第4页 / 共12页
遗传算法.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、遗传算法摘要:遗传算法(Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的 J.Holland 教授1975 年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术。 遗传算法经过不断的发展和改进,又发展出许多新的进化算法,如模拟退

2、火算法,免疫遗传算法,粒子群优化算法等等。关键字:遗传算法;进化率;寻优方法;组合优化1、遗传算法的发展及历史 遗传算法(Genetic Algorithm,简称 GA)起源于对生物系统所进行的计算机模拟研究。 美国 Michigan 大学的 Ho11and 教授及其学生受到生物模拟技术的启发,创造出了一种基于生物遗传和进化机制的适合于复杂系统优化的自适应概率优化技术遗传算法。 1967 年,Holland 的学生 Bagley 在其博士论文中首次提出了“遗传算法”一词,他发展了复制、交叉、变异、显性、倒位等遗传算子,在个体编码上使用双倍体的编码方法。Holland 教授用遗传算法的思想对自然

3、和人工自适应系统进行了研究,提出了遗传算法的基本定理模式定理(Schcma Theorem),并于 1975 年出版了第一本系统论述遗传算法和人工自适应系统的专著Adaptation in Natural and Artificial Systems 。 20 世纪 80 年代,Holland 教授实现了第一个基于遗传算法的机器学习系统,开创了遗传算法的机器学习的新概念。1975 年 DeJong 基于遗传算法的思想在计算机上进行了大量的纯数值函数优化计算实验,建立了遗传算法的工作框架,得到了一些重要且具有指导意义的结论。1989 年 Goldberg 出版了专著Genetic Algorit

4、hm in Search Optimization and Machine Learning ,系统地总结了遗传算法的主要研究成果,全面完整地论述了遗传算法的基本原理及其应用。1991 年,Davis 出版了Handbook of Genetic Algorithms一书,介绍了遗传算法在科学计算、工程技术和社会经济中的大量实例。 1992 年,Koza 将遗传算法应用于计算机程序的优化设计及自动生成,提出了遗传编程(Genetic Programming ,简称 GP)的概念。 在控制系统的离线设计方面遗传算法被众多的使用者证明是有效的策略。例如,Krishnakumar 和 Goldber

5、g 以及 Bramlette 和 Cusin 已证明使用遗传优化方法在太空应用中导出优异的控制器结构比使用传统方法如 LQR 和 Powell(鲍威尔)的增音机设计所用的时间要少(功能评估)。Porter 和 Mohamed 展示了使用本质结构分派任务的多变量飞行控制系统的遗传设计方案。与此同时,另一些人证明了遗传算法如何在控制器结构的选择中使用。 从遗传算法的整个发展过程来看,20 世纪 70 年代是兴起阶段,20 世纪 80年代是发展阶段,20 世纪 90 年代是高潮阶段。遗传算法作为一种实用、高效、鲁棒性强的优化技术,发展极为迅速,已引起国内外学者的高度重视。2、遗传算法的计算步骤及关键

6、 2.1 需求分析1本程序演示的是用简单遗传算法随机一个种群,然后根据所给的交叉率,变异率,世代数计算最大适应度所在的代数。 2演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的命令;相应的输入数据和运算结果显示在其后。 3测试数据 输入初始变量后用 f(x)=100*(x1*x1-x2)*(x1*x2-x2)+(1-x1)*(1-x1)其中-2.048#include#include#include#define POPSIZE 500#define maximization 1#define minimization 2#defi

7、ne cmax 100#define cmin 0#define length1 10 #define length2 10 #define chromlength length1+length2 /染色体长度int functionmode=maximization;int popsize; /种群大小int maxgeneration; /最大世代数double pc; /交叉率double pm; /变异率 struct individual char chromchromlength+1; double value; double fitness; /适应度 ; int generat

8、ion; /世代数 int best_index; int worst_index; struct individual bestindividual; /最佳个体 struct individual worstindividual; /最差个体 struct individual currentbest; struct individual populationPOPSIZE; /函数声明 void generateinitialpopulation(); void generatenextpopulation(); void evaluatepopulation(); long decod

9、echromosome(char *,int,int); void calculateobjectvalue(); void calculatefitnessvalue(); void findbestandworstindividual(); void performevolution(); void selectoperator(); void crossoveroperator(); void mutationoperator(); void input(); void outputtextreport(); void generateinitialpopulation( ) /种群初始

10、化 int i,j; for (i=0;i0.0) temp=cmin+populationi.value; else temp=0.0; else if (functionmode=minimization) if(populationi.valuebestindividual.fitness) bestindividual=populationi;best_index=i; else if (populationi.fitness=currentbest.fitness)currentbest=bestindividual; void performevolution() /演示评价结果

11、if (bestindividual.fitnesscurrentbest.fitness) currentbest=populationbest_index; else populationworst_index=currentbest; void selectoperator() /比例选择算法int i,index;double p,sum=0.0;double cfitnessPOPSIZE;struct individual newpopulationPOPSIZE; for(i=0;icfitnessindex) index+; newpopulationi=populationi

12、ndex; for(i=0;ipopsize; i+) populationi=newpopulationi; void crossoveroperator() /交叉算法 int i,j; int indexPOPSIZE; int point,temp; double p; char ch;for (i=0;ipopsize;i+)indexi=i; for (i=0;ipopsize;i+) point=rand()%(popsize-i);temp=indexi; indexi=indexpoint+i;indexpoint+i=temp; for (i=0;ipopsize-1;i+

13、=2) p=rand()%1000/1000.0; if (ppc)point=rand()%(chromlength-1)+1;for (j=point; jchromlength;j+)ch=populationindexi.chromj;populationindexi.chromj=populationindexi+1.chromj;populationindexi+1.chromj=ch; void mutationoperator() /变异操作 int i,j; double p; for (i=0;ipopsize;i+) for(j=0;jchromlength;j+) p=

14、rand()%1000/1000.0; if (ppm) populationi.chromj=(populationi.chromj=0)?1:0; void input() /数据输入 printf(“初始化全局变量:n“);printf(“ 种群大小(50-500):“);scanf(“%d“, if(popsize%2) != 0) printf( “ 种群大小已设置为偶数n“);popsize+; printf(“ 最大世代数(1-300):“); scanf(“%d“, printf(“ 交叉率(0.2-0.99):“);scanf(“%f“, printf(“ 变异率(0.001

15、-0.1):“);scanf(“%f“, void outputtextreport()/数据输出 int i; double sum;double average;sum=0.0; for(i=0;ipopsize;i+) sum+=populationi.value; average=sum/popsize; printf(“当前世代=%dn 当前世代平均函数值=%fn 当前世代最高函数值=%fn“,generation,average,populationbest_index.value); void main() /主函数 int i; printf(“本程序为求函数 y=100*(x

16、1*x1-x2)*(x1*x2-x2)+(1-x1)*(1-x1)的最大值 n其中-2.048=x1,x2=2.048n“);generation=0; input(); generateinitialpopulation(); evaluatepopulation(); while(generationmaxgeneration) generation+; generatenextpopulation();evaluatepopulation();performevolution();outputtextreport(); printf(“n“);printf(“ 统计结果: “);printf(“n“);printf(“n“);printf(“最大函数值等于:%fn“,currentbest.fitness); printf(“其染色体编码为:“);for (i=0;ichromlength;i+) printf(“%c“,currentbest.chromi); printf(“n“);5、运行结果

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 数据结构与算法

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报