遗传算法计算一元函数最大值,工具:matlab

其实现在网络上关于遗传算法求一元函数最大值的代码已经很多了,本文也是借鉴了他们的经验、算法思想、代码等撰写出来的,只是在一次讨论中听了别人对于其中算法的看法,认为其中基于轮盘赌法的非线性选择有局限性,并阐明了他本人改进后的算法逻辑,我自己也是受到他的启发后再改进了代码,在此感谢那位同学以及网络上分享资源的同学,好了,不多说,开始正题了。

题目:y=|sin(x)/x|,其中-10<=x<=10,求y的最大值,要求精确度0.0001,样本总数50,交叉个体数与变异个体数均为12,

贴代码前想说明几点:(1)根据精确度求染色体位数,在参考博客的代码中有一条语句是计算染色体位数的,在此是讲些通俗的理解,因为x的定义域有20个单位长度,精确度要求0.0001,将其离散化,考虑其所有可能点也仅有(20/0.0001=)200 000个(当然在此排除了x=0的点),而2的18次方(=262 144)是大于可能的点数的,我们便可认为18位的二进制数能保证精度要求;(2)可能有的题会给出交叉率、变异率,在此便认为交叉个体数/样本总数的比值便是交叉率,变异率同理,在下列粘贴的代码中交叉位数我是将其设置为二进制数的后九位,变异位也同样做了设置,因此交叉位与变异位是不同于交叉率、变异率的,在这里可能有人会认为自然选择的交叉、变异不应该是种群里相似个体基因都可能有交叉、变异行为,我在代码里仅设置部分个体有交叉、变异行为,在此我想说明的是,交叉个体起始位、变异个体起始位是做随机数选择的,这样还是比较符合自然选择学说的,也许会有人更细究参与交叉的两个个体在种群的位置数为什么要相差交叉数的一半(参与交叉的个体数当然一定是偶数了)以及二进制数的变异位为什么设置在后几位,这样会不会又偏离了自然选择学说,那么我的解释也是同上一步,这里不一定要相差一半交叉数,我是为了代码简单些设置了差值为一半,只要保证交叉个体数为12时,这12个二进制数不重复,又不会数组索引溢出即可,在变异位、交叉位的处理也是我的代码与参考博客略有不同的地方;(3)将交叉位、变异位设置在二进制数后几位在一定程度上也能改善算法。

主函数:

clc;clear;
gl

你可能感兴趣的:(遗传算法,matlab)