上一篇文章我们介绍了遗传算法的基本原理,本节我们介绍如何在matlab中实现遗传算法。
三、实验环境Matlab R2017b:
四、问题分析 4.1设定参数其中突变概率指的是某个个体的染色体发生突变的概率。因为实际中并不可能每一个个体都会发生变异,而是存在一定的概率,因此我们在这里定义每一个个体突变发生的概率为0.05。 同理,交叉概率指的就是某个个体与另一个个体发生染色体交叉的概率。 迭代次数指的是整个种群迭代2000多次。 其中的chrom_range指的是每个节点值的区间。在我们的这个模型中,x∈[0,10],y∈[0,10]x∈[0,10],y∈[0,10]。第一行放的是两个变量的区间下限,第二行放的是区间上限。 fitness_ave用来存放每一代的平均适应度,主要是用来最后画图,观察种群在每一次迭代中适应度的变化情况。fitness_best同理。 chrom_best用来存放最优适应度对应的最优染色体与适应度,可以回想一下上一章染色体变异中需要最优适应度,优胜劣汰中需要最优染色体,这个矩阵作用就是如此。
4.2初始化种群种群的初始化过程 Initialize函数用于初始化染色体。具体操作就是用一个for循环对每个个体的染色体进行随机赋值,并利用chrom_range将其限定在变量规定的区间之内。 CalFitness函数则是计算chrom内每个个体的适应度,并将其保存在fitness中。由于该函数由目标函数变换得到,描述所得到的染色体的优劣所以我们不妨设直接使用目标函数作为适应度函数评判所得到的染色体。 FindBest函数寻找出当前种群中的最优染色体,并将其保存在chrom_best。 CalAveFitness函数用于计算当前种群中的平均适应度。
4.3迭代开始初始化完以后就开始迭代,为了保证迭代次数和iter一致,这里我们就直接令t从2开始迭代。
再一次迭代过程中,一个种群执行操作顺序为:染色体变异,染色体交叉,计算适应度,寻找最优染色体,替换当前存储的最优染色体,优胜劣汰。
需要注意的是这里替换当前最优染色体。因为我们将这个种群的个个个体的染色体重新变异、交叉过了,所以最优染色体也会变化。但是这一代的最优染色体不一定比上一次迭代的最优染色体好,所以需要判定是否将最优染色体这个位置给换掉。
其中MutChrom函数用来对种群进行染色体变异操作。这里面的操作比较多,主要可以分为三步:
1.判断某节点是否变异; 2.判断变异是增加还是减少; 3.判断变异后的值是否越界。
越界函数IfOut函数我们看它是左越界还是右越界,如果是左越界,则 让节点值等于区间下限;如果是右越界,则让节点值等于区间上限。
4.4遗传操作AcrChrom函数是染色体交叉函数。逻辑相较染色体变异来说比较简单,大致可以分为以下几点:
1.判断该节点是否交叉; 2.随机寻找一个与其交叉的节点; 3.对两个节点进行交叉。
ReplaceWorse函数则是优胜劣汰这个过程,将种群中的最劣染色体替换掉。这里是直接用最优染色体替换,并且替换掉的是最后几个染色体,目的是加快收敛速度,但可能会陷入局部最优解。
4.5.迭代结果输出输出遗传算法迭代图
在这里我们只输出一个标准图为迭代过程中种群的平均适应度与最优适应度。在之前我们已经得到了每一代的平均适应度fitness_ave与最优适应度fitness_best,所以可以直接输出图像
最后我们希望将是用遗传算法求得的函数区间最值与真实的函数 图相对比,检查我们求得结果是否陷入局部最优解。利用MATLAB绘制二元函数的三维图形。
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:遗传算法(二):算法的实现 https://www.yhzz.com.cn/a/13330.html