JAVA课程设计 2.docx
《JAVA课程设计 2.docx》由会员分享,可在线阅读,更多相关《JAVA课程设计 2.docx(24页珍藏版)》请在冰豆网上搜索。
JAVA课程设计2
遗传算法求复杂函数极值问题
中文摘要:
本文首先介绍遗传算法的历史背景,基本思想,对遗传算法的常见的编码解码方法进行了深入的阐述,并对算子选择方法进行深入分析和对比,在此基础上把遗传算法应用于求解复杂函数的极值计算。
最后在MATLAB语言环境下编写程序,对求解函数的最大值进行了仿真,并对调试的结果进行了分析,得出了部分结论。
关键词:
遗传算法最优解算子选择复杂函数
目录
第一章绪论„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(5)
1.1遗传算法生物学背景„„„„„„„„„„„„„„„„„„„„„„„„(5)
1.1.1遗传与变异„„„„„„„„„„„„„„„„„„„„„„„„„„„„(5)
1.1.2进化„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(5)
1.2本文主要内容„„„„„„„„„„„„„„„„„„„„„„„„„„„(5)
第二章遗传算法简介„„„„„„„„„„„„„„„„„„„„„„„„„(6)
2.1遗传算法历史和发展„„„„„„„„„„„„„„„„„„„„„„„„(6)
2.2遗传算法的基本原理„„„„„„„„„„„„„„„„„„„„„„„„(6)
2.3遗传算法的特点„„„„„„„„„„„„„„„„„„„„„„„„„„(7)
2.4遗传算法的目的„„„„„„„„„„„„„„„„„„„„„„„„„„(7)
2.5遗传算法应用„„„„„„„„„„„„„„„„„„„„„„„„„„„(8)
第三章遗传算法的参数和算子选择„„„„„„„„„„„„„„„„„„(10)
3.1遗传算法的数学理论„„„„„„„„„„„„„„„„„„„„„„„(10)
3.2编码„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(11)
3.2.1编码方法„„„„„„„„„„„„„„„„„„„„„„„„„„„„(11)
3.2.2编码原则„„„„„„„„„„„„„„„„„„„„„„„„„„„„(13)
3.3个体适应度函数„„„„„„„„„„„„„„„„„„„„„„„„„(13)
3.3.1评价个体适应„„„„„„„„„„„„„„„„„„„„„„„„„„(13)
3.2.2适应度尺度变换„„„„„„„„„„„„„„„„„„„„„„„„„(14)
3.3算子选择„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(14)
3.3.1选择运算„„„„„„„„„„„„„„„„„„„„„„„„„„„„(14)
3.3.2交叉运算„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(16)
3.3.3变异运算„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(18)
3.4其他运行参数„„„„„„„„„„„„„„„„„„„„„„„„„„„(18)
第四章遗传算法求解复杂函数极值问题„„„„„„„„„„„„„„„„(20)
4.1遗传算法的求解步骤„„„„„„„„„„„„„„„„„„„„„„„„(20)
4.2算例验证„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(24)
第五章结论„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(28)参考文献„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(28)附录(程序)„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„(29)
第一章绪论
1.1遗传算法生物学背景
生物的进化是一个奇妙的优化过程,它通过选择淘汰,突然变异,基因遗传等规律产生适应环境变化的优良物种。
遗传算法是根据生物进化思想而启发得出的一种全局优化算法。
1.1.1遗传与变异
1、遗传
世间的生物从其亲代继承特性或性状,这种生命现象叫遗传,研究这种生命现象的科学叫做遗传学。
遗传信息是由基因组成的,生物的各种性状由其相应基因来控制,基因是遗传的基本单位。
细胞分裂具有自我复制的能力,在细胞分裂的过程中,其遗传基因也同时被复制到下一代,从而其性状也被下一代所继承。
2、变异
细胞在分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因,在进行细胞复制时,虽然概率很小,但也有可能产生某些复制差错,从而使DNA发生某种变异产生出新的染色体,从而表现出新的性状。
1.1.2进化
生物在其延续生存的过程中,逐渐适应于其生存环境,使得其品质不断得到改良,这种现象叫做进化。
新的基因依据其与环境的适应程度决定其增殖能力,有利于生存环境的基因逐渐增加,而不利于生存环境的基因逐渐减少,通过这种自然的选择,物种渐渐的向适应于生存环境的方向进化,从而产生优良的物种。
1.2本文主要内容
本文主要讨论遗传算法在实际数值函数优化问题中的应用,即对实际问题建模后求函数最大值的问题。
遗传算法通过对群体所施加的迭代进化过程,不断的将当前群体中具有较高适应度的个体遗传到下一代群体中,并且不断的淘汰掉适应度较低的个体,从而最终寻求出适应度最大的个体。
这个适应度最大的个体经解码处理之后所对应的个体表现型即为实际问题最优解或是最近似最优解
第二章遗传算法简介
2.1历史与发展
二十世纪六十年代,I.Rechenberg在他的《演化战略》中第一次引入了进化算法的思想(起初称之为Evolutionsstragegie)。
他的这一思想逐渐被其他一些研究者发展。
遗传算法(GeneticAlgorithms)是JohnHolland发明的,后来他和他的学生及他的同事又不断发展了它。
终于,在1975年JohnHolland出版了专著《自然系统和人工系统中的自适应》(AdaptionInNaturalandArtificialSystems)。
1992年,JohnKoza曾经使用遗传算法编出新的程序去做一些具体的工作。
他称他的这种方法为“进化规划”(GeneticProgramming,简称GP)。
其中使用了LISP规划方法,这是因为这种语言中的程序被表示为“分析树”(ParseTree),而这种遗传算法就是以这些分析树为对象的。
2.2遗传算法的基本原理:
遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。
并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。
然后,把这些假设解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制,再通过交叉,变异过程产生更适应环境的新一代“染色体”群。
这样,一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就是问题的最优解。
这里所指的某种结束准则一般是指个体的适应度达到给定的阀值;或者个体的适应度的变化率为零。
图2-1中表示了遗传算法的执行过程。
图2-1遗传算法基本原理
2.3遗传算法特点:
(1)遗传算法的操作对象是一组可行解,而非单个可行解;搜索轨道有多条,而非单条,
因此具有良好的并行性。
(2)遗传算法只需利用目标函数取值信息,而无须梯度等高价信息,因而实用用于大规
模高度非线形的不连续多峰值函数的优化以及无解析表达式的目标函数的优化,具有很强的通用性。
(3)遗传算法的择优机制是一种“软“策略,加上其良好的并行性使其具有良好的全局
优化性能和稳健性鲁棒性。
(4)遗传算法的可行解集是经过编码的,目标函数可解释为编码化个体的适应值因而具
有良好的可操作性与简单性。
2.4遗传算法的目的
典型的遗传算法CGA(CanonicalGeneticAlgorithm)通常用于解决下面这一类的静态最优化问题:
考虑对于一群长度为L的二进制编码bi,i=1,2,…,n;有bi∈{0,1}L
给定目标函数f,有f(bi),并且760
同时f(bi)≠f(bi+1)
求满足下式
max{f(bi)|bi∈{0,1}L}
的bi。
很明显,遗传算法是一种最优化方法,它通过进化和遗传机理,从给出的原始解群中,不断进化产生新的解,最后收敛到一个特定的串bi处,即求出最优解。
2.5遗传算法的应用
遗传算法已经在很多复杂问题(比如说NP-难题)、机器学习和简单的进化规划中得到了使用。
遗传算法在一些艺术领域也取得了很大成就,比如说进化图片和进化音乐。
遗传算法的优势在于他的并行性。
遗传算法在搜索空间中非常独立地移动(按照基因型而不是表现型),所以它几乎不可能像其它算法那样“粘”在局部极值点。
遗传算法更容易实现。
一旦你有了一个遗传算法的程序,如果你想解决一个新的问题,你只需要针对新的问题重新进行基因编码就行。
如果编码方法也相同,那你只需要改变一下适应度函数就可以了。
当然,选择编码方法和适应度函数是一件非常难的问题。
遗传算法的缺点是它的计算时间太长。
它们可能比其他任何算法需要的时间都长。
当然,对于今天的高速计算机来说,这已经不是个大问题了。
为了让读者更好地了解遗传算法所解决的问题,这里有一个关于遗传算法应用的小列表:
(1)非线性动态系统——预测,数据分析;
(2)神经网络的结构和权重设计;
(3)自动控制导弹的轨道设计;
(4)进化LISP规划(遗传规划);
(5)战略计划;
(6)蛋白质分子的形状的寻找;
(7)旅行商问题和时间序列排序问题;
第三章遗传算法的主要参数及算子选择
3.1遗传算法的数学理论
3.1.1模式定理
遗传算法中,在选择,交叉和变异算子的作用下,具有低阶,短的定义长度,并且平均适应度高于群体平均适应度的模式将按指数级增加。
其中:
(1)模式表示一些相似的模块,它描述了在某些位置上具有相似结构特征的个体编码串的一个子集。
(2)在模式H中具有确定基因值的位置数目叫做该模式的模式阶。
(3)模式H中第一个确定基因值的位置和最后一个确定基因值的位置之间的距离称为该模式的模式定义长度。
模式定理阐述了遗传算法的理论基础,它说明了模式的增加规律,同时也给遗传算法的应用提供了指导作用。
3.1.2积木块假设
模式定理说明了具有某种结构特征的模式在遗传进化过程中其样本数将按指数级增加,这种模式具有低阶,短的定义长度,且平均适应度高于群体平均适应度的模式。
这种模式被称为积木块。
模式定理说明了积木块的样本数呈指数级增长,也说明了用遗传算法寻求最优化样本的可能性,但它并未指明遗传算法一定能够寻求到最优样本而积木块假设却说明了遗传算法的这种能力。
定义:
个体的基因块通过选择,交叉,变异等遗传算子的作用,能够相互连接在一起,形成适应度更高的个体编码串。
作用:
积木块假设说明了用遗传算法求解各类问题的基本思想,即通过基因块之间的相互拼接能够产生出问题更好的解。
基于模式定理和积木块假设,就使得我们能够在很多应用问题中广泛的使用遗传算法的思想。
3.2编码
定义:
遗传算法中如何描述问题的可行解,即把一个问题的可行解从其解空间转换到遗传算法所能处理的搜索空间的转换方法就称为编码
作用:
编码是应用遗传算法时要解决的首要问题,也是设计遗传算法时的一个关键步骤。
编码方法除了决定了个体的染色体排列形式之外还决定个体从搜索空间的基因型变换到解空间的表现性时的解码方法,编码方法也影响到交叉算子和变异算子的遗传算法的运算方法。
由此看见,编码方法在很大程度上决定了如何进行群体的遗传化运算及遗传进化运算效率。
3.2.1编码方法
1、二进制编码方法
定义:
二进制编码方法是遗传算法中最常见的一种编码方法,它使用的编码符号集是由二进制符号0和1所组成的二值符号集{0,1},它所构成的基因型是一个二进制符号串。
在使用二进制编码时,每一个基因就是一个由0或者1组成的字符串。
表3-1二进制编码的基因
使用二进制编码时,即使等位基因的数量不大,我们也可以得到很多种可能的基因。
另一方面,这种方法对于很多问题来都很不自然,所以有时候在交叉和变异结束后还要做一些调整。
2、格雷码编码方法
定义:
格雷码是这样的一种编码方法,其连续2个整数所对应的编码值之间仅仅只有
一个码位是不相同的,其余码位都相同。
假设有一个二近制编码为B=bmbm-1…b2b1,其对应的格雷码为G=gmgm-1..g2g1。
由二进制编码到格雷码换算公式为:
gmbmgibi1,Im1,m2,....,1公式(3-1)
由格雷码到二进制转换公式为:
gmbmbigi1gi,Im1,m2......,1公式(3-2)
格雷码优点:
(1)便于提高遗传算法的局部搜索能力
(2)交叉,变异等遗传操作便于实现
(3)符合最小字符串编码原则
(4)便于利用模式定理对算法进行理论分析
3、浮点数编码方法
定义:
所谓浮点数编码方法是指个体的每个基因值用某一范围内的一个浮点数来表示,个体的编码长度等于其决策变量的个数。
例如:
若一个优化问题含有5个变量xi(I=1,2,…5)每个变量都有其对应的上下限
[Umin,Umax],则:
X:
5.806.903.503.805.00
就表示一个体的基因型。
其对应的表现型是:
X=[5.80,6.90,3.50,3.80,5.00]T浮点数编码方法有下面几个优点:
(1)适合于在遗传算法中表示范围较大的数。
(2)适合于精度要求较高的遗传算法
(3)便于较大空间的遗传搜索
(4)改善了遗传算法的计算复杂性,提高了运算效率
(5)便于遗传算法和经典油画方法的混合使用
(6)便于设计针对问题的专门知识的知识型遗传算子
(7)便于处理复杂的决策变量约束条件
4、值编码(ValueEncoding)
在很多问题中我们还可以采用直接的值编码,也就是说用一些比较复杂的数来编码,比如说实数。
因为二进制编码在这类问题中不好用。
在值编码中,每个基因就是一串取值。
这些取值可以是与问题有关任何值:
整数,实数,字符或者其他一些更复杂的东西。
表3-2值编码串
3.2.2编码原则
(1)应使用能易于产生所求问题相关的且具有低阶短定义长度模式的编码方案。
(2)应使用能使问题得到自然表示和描述的具有最小字符的编码方案。
3.3求适应度函数
3.3.1评价个体适应度
定义:
遗传算法中使用适应度这个概念来衡量群体中各个个体在优化计算中有可能达到或接近或有助于找到最优解的优良程度。
适应度较高的个体遗传到下一代的概率教大,反之遗传到下一代的概率相对小一些。
度量个体适应度的函数叫做适应度函数。
评价个体适应度的一般过程:
(1)对个体编码串进行解码处理后,可得到个体表现型。
(2)由个体表现型可计算出对应个体的目标函数值。
(3)根据最优化问题的类型,由目标函数值按一定的转换规则求出个体的适应度。
3.3.2适应度尺度变换
在遗传算法中各个个体被遗传到下一代群体中的概率由该个体的适应度来决定。
如何确定适应度对遗传算法的性能有很大的影响。
在遗传算法运行的初期阶段,算法能够对一
些适应度教高的个体进行控制,降低其适应度与其他个体适应度之间的差异程度,从而限制其复制数量,以维护群体的多样性。
我们希望在遗传算法运行的后期阶段,算法能够对个体的适应度进行适当的放大,扩大最佳个体适应度与其他个体适应度之间的差异程度,以提高个体之间的竞争性。
适应度尺度变换方法:
(1)线性尺度变换
公式为:
F’’=aF+b(3-2)其中,F为原适应度,F”为新适应度,a,b为系数。
线性尺度变换的选取条件:
a.尺度变换后全个体的新适应度的平均值F’avg要等于原适应度平均值Favg。
b.尺度变换后群体中新的最大适应度F’max要等于原平均适应度Favg的指定倍数。
(2)乘幂尺度变换
公式为:
F’=FK(3-3)幂指数K与所求解的问题有关,并且在算法的执行中需要不断对其进行修正才能使尺度变换满足一定的伸缩要求。
(3)指数尺度变换
公式为:
F’=exp(-βF)(3-4)其中β决定了选择的强制性,β越小,原有适应度较高的个体的新适应度就越与其他个体的新适应度相差越大,亦即越增加了选择该个体的强制性。
3.4算子选择
遗传算法中的选择操作就是用来确定如何从父代群体中按某种方法选取哪些个体遗传到下一代群体中一种遗传运算。
选择操作建立在对个体的适应度进行评价的基础之上,选择操作的目的是为了避免基因缺失,提高全局收敛性和计算效率。
3.4.1选择运算
(1)比例选择方法:
是一种回放式随机采样方法。
各个个体被选中的概率与其适应度大
小成正比。
设群体大小为M,个体I的适应度为Fi则个体被选种的概率Pis为:
pis=Fi/∑Fi(I=1,2….M)(3-5)
由此可见,适应度越高的个体被选种的概率也越大,反之适应度越低的个体被选种的概率也越小。
(2)最优保存策略:
当前群体中适应度最高的个体不参与交叉运算和变异运算,而是它来替代掉本代群体中经过交叉变异等遗传操作后所产生适应度最低的个体。
我们希望适应度最好的个体要尽可能保留到下一代群体中。
最优保存策略进化模型的具体操作过程是:
a.找出当前群体中适应度最高的个体和适应度最低的个体。
b.若当前群体中最佳个体的适应度比总的迄今为止的最好个体适应度还要高,则以当前群体中的最佳个体做为新的迄今为止的最好个体。
c.用迄今为止的最好个体替换掉当前群体中最差个体。
作用:
该策略的实施可保证迄今为止所得到的最优个体不会被交叉,变异等遗传运算所破坏,它遗传算法收敛性的一个重要保证条件。
(3)排序选择
主要思想是:
对群体中所有个体按其适应度大小进行排序,基于这个排序来分配各个个体被选中的概率,具体操作过如下:
a.对群体中的所有个体按其适应度大小进行降序排序。
b.根据具体问题,设计一个概率分配表将各个概率值按上述排列次序分配给各个个体。
c.以各个分配到的概率值做为其能够遗传到下一代的概率,基于这些概率值用比例选择(赌轮选择)的方法产生下一代群体。
(4)轮盘赌选择方法(RouletteWheelSelection)
父代的选择是根据他们的适应度做出的。
基因越是适应环境,那么它被选择到的机会就越大。
想像一个轮盘赌的机器上放置了种群中所有的基因。
每一个基因所占的地方的大小和它的适应度成正比。
如下图所示:
图3-1赌轮算法示意图
然后开始扔弹子,扔到那个地方就把对应的基因拿出来。
显然,适应度越大的基因被选到的机会就越大。
这个过程可以被下面的这个算法来模拟:
1.[求和]计算所有种群的适应度的和S;
2.[选择]在区间(0,S)上随机的产生一个数r;
3.[循环]从某个基因开始,逐一取出基因来,把它的适应度加到s上去(s开始为0),如果s大于r,则停止循环并返回当前基因;
当然,第一步在计算中只需要执行一次。
3.4.2交叉算子
遗传算法中的所谓交叉运算,是指对两个相互配对的染色体按某种方式相互交换其部分基因,从而形成2个新的个体,交叉运算是遗传算法区别其他进化算法的重要特征,它在遗传算法中起关键作用,是产生新个体的主要方法。
交叉算子的设计过程:
1如何确定交叉点的位置
2如何进行部分基因交换
最常用的交叉算子是单点交叉算子。
下面介绍集中适合于二进制编码个体或浮点数编码个体的交叉算子:
(1)单点交叉:
它是指个体编码串中只随即设置一个交叉点然后在该点相互交换2个配
对个体的部分染色体。
特点:
假如邻接基因座之间的关系能够提供比较好的个体性状和较高的个体适应度的话则这个单点交叉操作破坏这种个体性状和降低个体适应度的可能性最小。
(2)双点交叉和多点交叉:
是指定个体编码串中随机设置2个或多个交叉点然后进行部
分基因交换。
具体操作过程:
1在相互配对的两个个体编码串中随机设置2个交叉点
2交换2个个体在所设定的两个交叉点之间的部分染色体。
例如:
A:
xx|xxxxx|xxx------A’:
xx|yyyyy|xxx
B:
yy|yyyyy|yyy------B’:
yy|xxxxx|yyy
交叉点1交叉点2
双点交叉示意图
11001011+11011111=11011111图(3-2)
均匀交叉算子(UniformCrossover):
子代基因的每一个位点是随机地来自于两
个父代基因中的一个的;
均匀交叉示意图
11001011+11011101=11011111图(3-3)
3.4.3变异算子
遗传算法中所谓变异运算是指个体染色体编码串中某些基因座上的基因值用该基因座的其他等位基因替换,从而形成新个体。
位点转换算子(BitInversion):
选择一些位点然后将这些地方的0,1互换;
图(3-4)
在遗传算法中使用变异算子的目的:
1改善遗传算法局部搜索能力
2维持群体多样性,防止出现早熟现象
变异算子的常用方法:
a、基本位变异:
指对个体基因串以变异概率随机指定某一位或几位基因座上的基因值做变异运算
b、均匀变异:
指分别用符合某一范围内随机数,以某一较小概率来替换个体编码串中各个基因座上的原有基因值。
c、边界变异:
边界变异是上述均匀变异操作的一个变形遗传算法。
在进行边界变异操作时,随机的取基因座的2个对应边界基因值之一去替换原来的基因值。
d、非均匀变异:
对每个基因座都以相同的概率进行变异运算之后相当于整个解向量在解空间中,作了一个轻微的变动。
3.5遗传算法的其他运行参数
(1)编码串长度L:
使用二进制来表示个体时,编码串长度L的选取与问题所要求的
求解精度有关。
(2)群体大小M:
表示群体中所含个体的数量。
M取值越小可提运算速度但降低群体多样性。
容易引起遗传算法的早熟现象,而当M取值较大时降低了遗传算法的运行效率。
一般建议范围20-100。
(3)交叉概率Pc。
交叉操作是遗传算法中产生新个体的主要方法,一般建议范围是
0.4-0.99。
随着遗传算法在线性能的提高可以增大交叉概率的取值。
(4)变异概率Pm。
一般建议范围是0.0001~0.1,随着遗传算法在线性能的下降,可以减
小变异概率的取值
(5)终止带宽T它表示遗传算法运行到指定的进化代数之后就停止运行并将最佳个体作
为所求问题的最优解输出。
建议范围是100~1000
(6)代沟G:
表示每一代群体中被替换掉的个体在全部个体中所占的百分比。
第四章:
用遗传算法求解复杂函数极值问题
本课题采用遗传算法求解函数最大值问题,应用常规的二进度编码,利用赌轮算法选择最忧群体,进行交叉变异等遗传操作,最终求出所求函数最大值即最忧解,最后在MATLAB语言环境下进行调试,更改相关参数,得出几组最忧解图象并进行对比分析。
所求问题为f(x)=x+9*sin(4x)+8*cos(3x)的最大值,其中定义域为5<=x<=12,采用二进制编码,选取种群个体数目为20,设定二进制编码长度为10,交叉概率为0.8,变异概率是0.01。
4.1本算例的求解步骤
(1)确定决策变量和约束条件
【问题】求f(x)=11*sin(6*x)+7*cos(5*x)的最大值,其中0<=x<=2*pi
【分析】选择二进制编码,种群中的个体数目为20,二进制编码长度为10,交叉概率为0.8,变异概率为0.01
(2)确定编码方法
用长度为十的二进制编码串来分别表示两个决策变量Umax(2π)Umin(0)。
10位二进制编码串可以表示