admin管理员组文章数量:1794759
遗传算法1(GA)
受到生物进化论的启发,遗传算法的出现为解决全局优化问题提供了全新的思路和路径,它基于生物遗传和进化机制,结合自适应的概率优化算法,使得我们能够在全局范围内找寻最优解。对于解决现实中的一系列非凸函数问题有较好的表现,作为目前较为经典并且常见的机器智能算法,GA不仅可以简化模型求解具体问题的复杂度,而且具有求解的通用性,使得其应用越来越广泛。
生物进化观点:试想一下高中生物学习的粘土矿物进化论,在一个由多个个体组成的种群当中,染色体作为DNA的载体,是重要的遗传信载体。而对于每个个体而言,其染色体都来源于其父亲和母亲(我们统称为父代)。考虑长时间的生物进化过程,父代向子代传递遗传信的过程当中,会发生染色体的复制,交叉,变异等现象,根据达尔文提出的“优胜劣汰”进化规则,最终会产生一群更适应环境的个体。遗传算法作为一种自调节的全局搜索最优解的算法,模仿了生物的进化过程,模拟自然选择和遗传中的“复制”、“交叉”、“变异”等现象。从代表问题可能潜在所有解集的一个初始化种群(该种群又是由经过基因编码的一定数量的个体小米音响组成)开始,对种群进行反复的“复制”、“交叉”、“变异”等操作,估计每个个体的适应值,根据“适者生存”的进化规则,获取本次进化过程中,该种群内最靠近最优解的个体,不断的进行上述操作,最终将末代种群中的最优个体解码获得满足要求的最优解。数学观点:实际问题的解决过程中,我们会发现很多问题均是非凸的,也即是说往往在全局范围之内会出现许多的局部最优解,那么如何在全局的范围内找到全局最优解便是优化问题的一个重要的问题,遗传算法便可以巧妙地解决该问题,它不需要内在复杂的机理,我们可将其当做一个黑箱,不断寻找潜在的解,通过一定的准则自适应的寻找全局最优解,在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。首先,我们将生物进化概念与遗传算法进行类比,从我个人的理解思路来讲,我建议大家在理解遗传算法的过程中充分类比生物的进化过程:
图1 生物进化与遗传算法的关系对照1. 自适应函数:遗传算法的适面试常见问题及回答技巧应度函数是用来判断群体中的个体的优劣程度的指标(越靠近最优解更优),一般的,它是根据所求问题的目标函数来进行评估的。所以我们可以将个体在目标函数的值视作自适应值。某个体的自适应值越大长河,那么其被遗传到下一代的概率就越大,所以自适应度函数的选择将直接影响到遗传算法收敛的速度以及能否找到全局最优解。
2. 染色体的编码与解码:为了在计算机中进行算法解的搜索,我们需要将解所在空间映射到基因型的空间,这样计算机才能有效的进行识别,解码则反之,是从基古早味因型到解所在肠粉的做法和配料区间的映射。一般地,我们采用二进制方式来进行编码,它采用一个二进制的字符串来表征解(包含0或1,即可视为染色体上的基因)在精度允许的前提条件下,二进制编码可以将区间内的无穷多个点用间隔足够小的有限个点来代替。在编码的过程当中,我们需要确定解的区间以及需要表示的解的精度:
初始种群的各个个体的基因可以用均匀分布的随机数产生,例如要在区间 x\\in[a,b] 内寻找最优解,那么此时染色体的编码长度,及x的精度rss源要求就至关重要了,假设需要编码的染色体长度为n,要求达到的精度维小数点后m和光堂奶粉位,那么高性能笔记本染色体编码长度和精度之间有如下关系:
2^{n-1}\\leq(b-a)10^{m}\\leq2^{n}-1\\\\
在相关精度要求之下,根据上述不等式就可以确定染色体的编码长度n,进而实现对自变量 x 的编码:
000...000=0\\\\ 000...001=1\\\\ 000...010=2\\\\ ...\\\\ 111...111=2^{n}-1
在求解个体的自适应函数值时,便需要对染色体编码进行解码(decode),对于一个长度为n的二进制字符串,解码后的 x 值为:
x=a+\\frac{b-a}{2^{n}-1}\\sum_{k=1}^{n}{b_{k}}2^{k-1}\\\\
其中的 b_{1},b_{2},...b_{n}为个体的二进制编码第k位(从右往左)上的编码数字(0或1),在上述的编码(encode)和解码(魁罡decode)定义便实现了解空间和基因空间元素之间的转化。在实际的应用中,二进制也会存在一些问题,比如 x 为15和16 时,二进制编码为01111和10000,在二进制格式下,两数的转化就需要改变所有位,那么在后续的交叉和变异操作中就会存在缺陷,所以在有的情况下会采用格雷码或其他的编码方式,文章指路:
在本文中,我们仍然采取二进制的编码和解码方式。
3. 选择操作轮盘赌:遗传算法的本质就是模拟生物进化“适者生存”的过程,而个体的适应度值就是评价个体“适应”程度的指标,考虑有N个个体的种群,每个个体有自己的自适应函数值 f_{i},i=1,2,...N ,定义该个体被选中的概率 p_{i}=\\frac{f_{i}}{\\sum_{k=1}^{N}{f_{k}}} ,那么个体的适应值越大其被选中的概率也就越大,在编程的过程当中,我们采用轮盘赌来实现该操作。所谓轮盘赌,想一想你去超市购物满金额之后的转转盘抽奖环节,轮盘可以被分为不相等的几部分扇形区域,指针落在面积更大的区域概率越大,同理,我们可以考虑前i个体适应度值的和: q_{i}=\\sum_{k=1}^{i}{p_{k}}\\\\
例如,此时有5个个体,我们知道了其自适应度值 f_{i} ,那么我们可以通过计算第i个个体的前i个适应度之和 q_{i} ,最终得到轮盘赌的各区域分界值:
\\begin{array}{c|c} \\text{个体} & 1 &2&3&4&5 \\\\ \\text{富通天下个体适应度值}f_{i} & 0.0975 &0.2785&0.5469&0.9575&0.9649 \\\\ \\text{累积适应度值}q_{i} & 0.0975 &0.3760&0.9229&1.8804&2.8453 \\\\ \\text{累计概率} & 0.0343 苏维埃宫&0.1322&0.3244&0.6609&1 \\\\ \\end{array}\\\\
轮盘赌注:累积适应度值即为上面定义的 q_{i} ,累积概率就是在 q_{i} 的基础之上除以全体适应度值之和:也就是 q_{N} ,该例中N取5,显然,个体的适应度值越大,其累计概率就越大,最终轮盘赌操作就按照累计概率为依据,随机产生一个0到1之间的随机数,假设是0.3,那么0.3恰好在累计概率[0.1322,0.3244]之间,那么该轮选择就选择出区间的右端点代表的个体3,反复进行该操作,最终选择出子代种群。
精英选择在每一代的选择过程中会产生一个适应度最高的个体,那么在每一代的选择过程中,可以将本代的最优个体保留,传给下一代,这样的选择方式我们称为精英选择,其目的是更好的使我们的结果收敛,尽快的找到全局最优解。
4. 交叉算子(crossover)遗传交叉算子发生在两条染色体之间,是遗传算法中常见的遗传操作,交叉操作将种群内个体随机配对,对每一个染色体随机产生一个交叉点(单点交叉,当然也可以是多点交叉,编程时会稍微增加难度,我们现阶段只考虑单点交叉),以某一概率交换其交叉点之后的染色体。交叉概率越大,那么可以使得各代的交叉越充分,同时个体重中的优良个体也有可能遭到破坏,所以合适的选择交叉概率才会起到较好的作用,一般的交叉概率在[0.4, 0.99]之间。在后续的编程中,我们选取相隔一个个体的两染色体进行交叉操作。
5. 变异算子(mutation)遗传变异操作就是选取种群中某一个体,以一定的概率随机的改变染色体中某一个或多个基因的值,由于之前的操作当中已经意象油画将染色体进行二进制编码,那么此时改变基因的值就是二进制的取反操作,一般的变异概率为[0.0001, 0.1]之间。变异算法是对遗传算法的改进,对交叉过程中可能丢失的某些遗传基因进行修复和补充,也可以防止遗传算法较快的收敛到局部最优解。和交叉概率相似,不合适的变异概率也会对算法的收敛性以及最终的最优解取值产生较大的影响,当变异概率较小时,解的稳定性较高,但是很容易陷入局部最优解,并且难以跳出局部最优解的区间;但是如果变异概率较大,可以使得解空间具有多样性,从局部最优解跳出来,最终找到全局最优解,所以在设计程序的时候应该较好的选取变异概率。
当然对于上述的各操作,其方法都不唯一。比如选择操作中除了轮盘赌算法,还有随机遍列采样等方法,交叉和变异操作中也有多点操作,洗牌交叉等等多种方式,在本文中我们都挑取较为简单并且容易理解的操作方式。上述的5点知识即为遗传算法中的核心,我将以流程图的形式来说明遗传算法的步骤。
遗传算法的操作步骤:
确定适应度函数的取值范围,确立精度及染色体编码长度。初始化操作:染色体编码,确立种群数量,交叉、变异概率等。初始化种群:随机生成第一代种群。利用适应度函数评价种群,判断是否满足停止条件,若是则停止,输出最优解;否则继续进行操作。对种群进行选择、交叉、变异操作,得到下一代种群,回到第4步。遗传算法流程图最终算法可以得到获得:1. 最佳适应值的个体染色体编码,通过解码操作获取自变量所对应的值;2. 最佳适应度值,也就是算法找到的全局最优解;3. 取得最优解的迭代次数(进化到第几代),遗传算法作为一个自搜索全局晨会互动小游戏最优解的方法在许多领域的应用都极其的广泛,当我们解决的问题较为复杂,常常都无法获取其最优解的情况不妨可以用遗传算法尝试一下,接下来,我们以一个一元函数的最优值问题来运用遗传算法:
例:求解函数 f=xcos(5\\pi*x)+3.5 在[-1, 2.5]上的最大值
首先,我们尝试用matlab画出该函数的图像:可以看出,该函数是非凸的,在局部区域有许多的局部最优解,利用matlab的指令我们可以知道该函数的最大值为5.9008,其对应的x值大概在2.4左右,接下来我们用遗传算法来求解该问题。
在我的程序设计中:我选取的种群的个体数量为80,染色体长度为15,最大进化代数为60,交叉概率和变异概率分别为0.6和0.01,在选择过程中运用了精英选择方式。
让我们来看看最终的结果:
Best performed individual(chromosome): 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1
Corre宠物猫有哪些品种sponding fitness value:5.9008
Corresponding variable value:2.4017
The time of evolution th get the best:1双蛋4
在经过了13次迭代,到第14代的时候就找到了最优解5.9008,其对应个体染色体经过解码即为自变量的取值,为2.4017。需要注意的是,遗传算法是一种概率优化算法,所以其每一次的结果可能会不一样,但是我们如何评价我们建立的模型的好坏,如何确定我们选取的各参数值较为合理呢人工挖孔桩?此时我们可以看看每一代种群的最大适应值,和个体的平均适应度值:
可以看到,算法教育学研究生在第14代找到了全局最优解,每一代种群的平均适应度函数值在前20次进化中在迅速的增大,并且在第30代左右趋于平缓,在第40代之后,种群的最大及平均适应度值都非常平我想建网站缓了,此时我们就可以说明该算法已经收敛,我们的参数设置较为合理。
这就是遗传算法的基本思路和基本步骤的一个介绍...这部分代码比较长,下一篇文章中,我将结合github上的代码结合自己对该算法的理解写一个总结,祝大家学习愉快。
参抹胸装考书目:
数学建模与数学实验(第四版)高等教育出版社,赵静,但琦.
版权声明:本文标题:遗传算法1(GA) 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686594004a85605.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论