第一部分讲解了遗传算法的基本原理和框架,对遗传算法的主要工作流程和操作算子作了整体分析。第二部分结合Ackley函数优化问题,讲解了遗传算法中个体编码方式、适应函数的选取、父体选择策略、杂交算子、变异算子、参数设置以及演化终止条件等的具体实现过程。
1.遗传算法的基本原理和框架
遗传算法(Genetic Algorithm)是基于"适者生存"的一种高度并行、随机和自适应的优化算法,它将问题的求解表示成"染色体"的适者生存过程,通过"染色体"群的一代代不断进化,包括复制、交叉和变异等操作,最终收敛到"最适应环境"的个体,从而求得问题的最优解或满意解。
在遗传算法中,选择、杂交和变异是三个主要操作算子。从图1.1中的算法框架可知,遗传算法的主要操作步骤如下:1.在一定的编码方案下,随机产生一个初始种群(第3行);2.用相应的解码方法将编码后的个体转换成问题空间的决策变量,并计算初始种群中个体的适应值(第4行);3.按照个体适应值的大小,从种群中选出适应值较大的一些个体(第6行);4.由杂交和变异算子对挑选出的个体进行操作,并产生新一代的种群(第7-8行);5.对新产生的种群进行评估,计算适应值(第9行);6.反复执行步骤3-5,直至满足收敛判据为止。
遗传算法是一种通用的优化算法,其编码技术和遗传操作比较简单,优化不受限制性条件的约束,其搜索过程从问题解的一个集合开始,而不是从单个个体开始,具有隐含并行搜索特性,减小了陷入局部极值的可能。遗传算法主要应用在函数优化和组合优化问题中,在生产调度、自动控制、机器学习、图像处理、人工生命和遗传编码等方面也有着广泛应用。
2.遗传算法的设计与实现
在设计和实现遗传算法时,必须要考虑以下几个问题:个体编码方式、适应函数、父体选择策略、杂交算子、变异算子、参数设置以及终止条件。本文结合Ackley 函数优化问题,实例讲解了遗传算法的整个设计流程和实现过程,并在最后研究分析了目标函数的维数对遗传算法性能的影响。本算法采用C++实现,使用了C++中的类来表示个体和种群,用容器vector来存储和管理数据。
2.1. 问题实例
考虑下面的Ackley 函数优化问题,用遗传算法求解该函数的最小值,并分析维数对算法性能的影响。
2.2. 个体编码方式
采用实数向量编码。对于n维的目标函数,解的编码表示为 。
2.3. 适应函数
由于该问题是求解最小值问题,因此,不能直接用目标函数作为适应函数,必须要对目标函数做变换,以保证计算出的适应值为正值,并且越好的个体所对应的适应值越大。在此采用了如下的简单变换:
其中, 表示目标函数的上界,
是适应函数。通过对目标函数的分析发现,它的最大值不超过30,因此,取
的值为30。
2.4. 父体选择策略
父体选择策略采用随机通用采样(Stochastic Universal Sampling)的方法,该方法只用一次随机选择就可确定N 个父体,其实现步骤如下:
(1) 根据个体的适应值计算出每个个体的选择概率,计算公式如下:
其中, 表示第i 个个体的适应值,
表示计算出的第i个个体的选择概率。
(2) 计算每个个体被选择的期望个数,计算公式如下:
其中, 表示每个个体被选择的期望个数,N 表示种群的规模。
(3) 构造一个轮盘,该轮盘被划分为N 个扇形区域,每个扇形区域的面积分别与个体被选择的期望个数成正比,N 个指针平均分布在轮盘的中轴上(见图2.1)。将轮盘转动一次,当轮盘停止转动后,N 个指针所指向的个体被选中作为父体参与下一代的演化。
实现通用随机采样的算法代码如算法2.1 所示。