Matlab遗传算法大纲
遗传算法简介
遗传算法,顾名思义,模拟自然界物竞天择,万物竞自由的种群迭代时在遗传基因方面的进化过程,无法适应环境的种群个体被淘汰,剩下的就是比较适合当下环境的个体 适应度较大,成为了最优解。
算法流程
种群初始化
对种群初始化分为两步实际也不是两步各有交叉:对基因进行编码、对初始种群结构进行设置。
- 设置种群结构与参数
种群的结构有:种群的数目(如非多种群遗传算法均为1),种群中个体的数目,个体中染色体的数目(实际为编码的个数,与你的变量个数或者变量的精度有关)。
种群的最大遗传数目(与你的问题计算复杂程度有关),染色体的交叉概率(通常设为0.7左右),基因的变异概率(通常为0.01左右),遗传代沟(不同的选择操作可能没有该参数)。 - 基因编码
基因编码常用的有很多种,但解决实际问题最最常用的有两大种:二进制编码和实数编码。
二进制编码常用于TSP问题,解决0-1规划等问题。可以使用谢菲尔德大学的Matlab遗传算法工具箱中bs2rv()
函数转化为十进制数,转化时需要设置变量范围。
实数编码可以设置范围与约束进行随机生成。
计算初始种群适应度
适应度是遗传算法的关键,是你成为上帝的决定因素。有的遗传算法是求最小值,如果需求是最大值需要对目标函数进行变换,相反数或者倒数均可。有的版本的遗传算法是求最大值,具体情况还需要观察具体程序中对最优适应度的选取(不能只观察最外层记录值中的min
或者max
,需要对每个操作进行检查)
下文中均取最大值
种群选择操作
对种群中优良个体进行选择,个体的适应度越高选取到的概率越大,常用轮盘赌法、锦标赛法,随机遍历采样法等。
染色体交叉
随机的从种群中选取两个个体,通过对染色体的交换组合,产生更优秀的个体。强强结合,小孩会更强?貌似在这里也有一定合理性。交叉概率即为每一轮发生交叉的概率。常采用单点交叉算子,两点交叉算子等。单点交叉算子中具体操作为选取一个个体的染色体
α
%
\alpha\%
α%与另一个染色体的
α
%
\alpha\%
α%进行交换产生的两个新染色体。
α
%
\alpha\%
α%为
[
0
,
1
]
[ 0,1 ]
[0,1]区间的随机数。
个体变异
个体变异,学过生物学的一定知道了,为了维持总群的多样性,也是在一定程度上避免困于极小值,变异产生更加优秀的个体加入种群。同样的,变异概率为每一轮发生变异的概率。值得注意的是,变异是对染色体上的基因也就是编码数进行操作的。常用的变异算子有离散变异,实值变异等。
记录种群适应度
在一轮进化过程中,经历了上述的选择,交叉,变异操作,对当前种群中个体重新进行适应度计算,找出这次进化后的种群最优个体,记录适应度,再重新对当前种群进行迭代进化。在不断的迭代中,若种群最优值收敛于某值,该值即为最优值。
遗传的不足
首先是参数的设定过于主观,经验化,算法的实际效率很低,无法解决很复杂的问题,最终解可能无法收敛,在使用时还是要看具体的进化过程,求解效果如何,并非也不可能适用于所有问题。
参考文章
本文内容参考下列文章,如有任何问题还请联系该账号
[1]史峰. MATLAB智能算法30个案例分析[M]. 北京航空航天大学出版社, 2011.