遗传算法

遗传算法(Genetic Algorithm,简称GA)起源于对生物系统所进行的计算机模拟研究,是一种随机全局搜索优化方法,它模拟了自然选择和遗传中发生的复制交叉(crossover)和变异(mutation)等现象,从任一初始种群(Population)出发,通过随机选择、交叉和变异操作,产生一群更适合环境的个体,使群体进化到搜索空间中越来越好的区域,这样一代一代不断繁衍进化,最后收敛到一群最适应环境的个体(Individual),从而求得问题的优质解。


基本概念:

  • 染色体
  • 基因
  • 个体
  • 种群
  • 适应度:用以评估个体好坏的函数,输入是某个体,输出是适应度
  • 选择:以一定的概率(一般依赖于适合度)选取种群内个体的过程
  • 交叉:将染色体交叉,重组
  • 变异

遗传算法的关键步骤

问题的输入——编码和结果的输出——解码

实际情况下,遗传算法并不能直接运用我们具有实际意义的数据,所以我们需要将具有实际意义的数据转化成无法直接理解的数据,来方便遗传算法迭代。

  • 二进制编码:
    优点:几乎任何问题都能用其表达
    缺点:数值优化时精度不高
  • 实数、自然数编码:
    精度高、适合大空间搜索
  • 矩阵编码:
    适用于组合情况
  • 树型编码:
    编码实际上是为后面的产生种群、适应度计算、变异的产生服务的,所以在选择编码方式时应着重考虑在后续步骤中是否足够便捷。

产生初始种群

产生初始种群主要有两个问题需要解决:种群中的个体如何选择?种群的规模要多大合适?

种群中个体类型的选择

  • 一般而言,我们采取随机选取的方式,因为只有随机选取的方式才能达到所以状态的遍历,才能最可能找到全局最优解。
  • 但是也有学者仍为种群个体应按照经验选取,这样可以在较短的迭代代数后就可以得到最优解,但是缺点是容易陷入局部最优解而非全局最优解,也就是“早熟现象”。

种群规模的选择

显而易见的,若种群规模过小,容易出现早熟现象,难以遍历所有状态找到全局最优解。但是种群规模过大,则容易使得收敛时间变长。经验结论是种群规模适宜为决策变量的4-6倍。


遗传操作

选择方法

一个合适的选择方法可以帮助我们快速收敛与全局最优解,常用的有:

  • 适合度比例法:根据适合度来确定子孙遗留的可能
  • 排位次法:按照适合度排序,特定的位置对应特定的子孙遗留概率
  • 精华保留法:无条件保留适应度大的个体,不受变异和交叉的影响
  • 轮盘赌法:按照个体的适应度比例转化为中选的对象

交叉方法

交叉概率大,可以帮助我们扩大搜索空间,避免陷入局部最优解,但是同时计算量会大大增加,经验规律是交叉率一般取0.6~0.9。可选方法有单点交叉和多点交叉,对应生物学中的交叉互换概念。

变异方法

变异方法一般是生成一个随机数rand(0,1), 与\(p_m\)比较大小,若pm较大则发生变异,否则则不发生变异。注意当\(p_m\)>0.5时遗传算法则退化为随即搜索。经验取值为p<0.05

遗传算法的数学基础——为什么总是可以收敛到最优解?

首先,我们要理解模式的概念,模式的定义是一个由字符集{0,1,*}组成的有序字符串,串中的*代表通用符。其中0,1的个数决定了一个模式的阶数O( ),末尾固定数的位置-首个固定数的位置定义为\(\delta()\), 定义长度。

模式 O( ) Defining Length
1011 4 3
10*1 3 3
101* 3 2

模式定理

\[m(H,t+l)\geq m(H,t)\frac{\overline{f(H)}}{\overline{f}}[1-p_c\frac{\delta(H)}{l-1}-O(H)*p_m] \]

说明了对于高适应度、长度短、阶数低的模式在后代中至少以指数增长
证明过程及推导:
当一个种群出在世代t 时,其中满足特定模式H的数量有m个,记为 \(m(H,t)\). 根据依赖适合度的抽取策略,则满足模式H的串传递到子代的概率为:
其中f为适合度
$$
p_i=\frac{f_i}{\sum f}

\[ 则对于下一世代有: 其中f(H)为H串的平均适应度,n为当前世代的个体总数(由于在遗传算法中需要保证收敛速度,故世代数一般是不变的,故为常数) \]

m(H,t+1) = m(H,t)\cdot n\cdot \frac{f(H)}{\sum f_i}

\[ 注意到: \]

n \cdot\frac{1}{\sum f_i} = \frac{1}{\overline{f}}
$$
故有:
$$
  m(H,t+) = m(H,t)\cdot \frac{f(H)}{\overline{f}}
$$


若从初始世代开始迭代,某一模式的适应度为\(c \overline{f}\), 有:

\[ m(H,t+) = c^t \cdot m(H,t)\cdot \]

显然,当c大于1时意味着适应环境的模式将以指数速度增长数量,反之亦然。
当我们考虑变异和交叉时有
交叉(设发生交叉的概率为\(p_c\) ):则某个模式留存的概率为$$1-p_c \cdot \frac{\delta(H)}{l-1}$$
故有:

\[ m(H,t+) \geq m(H,t)\cdot \frac{f(H)}{\overline{f}}[1-p_c \cdot \frac{\delta(H)}{l-1}] \]

取大于等于是因为交叉也有可能不破坏当前模式(比如两个相同的模式交叉)
同理再考虑突变的情况,若突变发生在固定数上则破坏当前模式。则有:

\[ m(H,t+) \geq m(H,t)\cdot \frac{f(H)}{\overline{f}}[1-p_c \cdot \frac{\delta(H)}{l-1}-O(H)\cdot p_m] \]

Q.E.D.

算法的优缺点

优点

  • 全局最优
    在许多情况下,优化问题具有局部最大值和最小值。这些值代表的解比周围的解要好,但并不是最佳的解。
    大多数传统的搜索和优化算法,尤其是基于梯度的搜索和优化算法,很容易陷入局部最大值,而不是找到全局最大值。
    遗传算法更有可能找到全局最大值。这是由于使用了一组候选解,而不是一个候选解,而且在许多情况下,交叉和变异操作将导致候选解与之前的解有所不同。只要设法维持种群的多样性并避免过早趋同(premature convergence),就可能产生全局最优解。

  • 处理复杂问题
    由于遗传算法仅需要每个个体的适应度函数得分,而与适应度函数的其他方面(例如导数)无关,因此它们可用于解决具有复杂数学表示、难以或无法求导的函数问题。

  • 处理缺乏数学表达的问题
    遗传算法可用于完全缺乏数学表示的问题。这是由于适应度是人为设计的。例如,想要找到最有吸引力颜色组合,可以尝试不同的颜色组合,并要求用户评估这些组合的吸引力。使用基于意见的得分作为适应度函数应用遗传算法搜索最佳得分组合。即使适应度函数缺乏数学表示,并且无法直接从给定的颜色组合计算分数,但仍可以运行遗传算法。
    只要能够比较两个个体并确定其中哪个更好,遗传算法甚至可以处理无法获得每个个体适应度的情况。例如,利用机器学习算法在模拟比赛中驾驶汽车,然后利用基于遗传算法的搜索可以通过让机器学习算法的不同版本相互竞争来确定哪个版本更好,从而优化和调整机器学习算法。

  • 耐噪音
    一些问题中可能存在噪声现象。这意味着,即使对于相似的输入值,每次得到的输出值也可能有所不同。例如,当从传感器产生异常数据时,或者在得分基于人的观点的情况下,就会发生这种情况。
    尽管这种行为可以干扰许多传统的搜索算法,但是遗传算法通常对此具有鲁棒性,这要归功于反复交叉和重新评估个体的操作。

缺点

  • 需要特殊定义
    将遗传算法应用于给定问题时,需要为它们创建合适的表示形式——定义适应度函数和染色体结构,以及适用于该问题的选择、交叉和变异算子。

  • 超参数调整
    遗传算法的行为由一组超参数控制,例如种群大小和突变率等。将遗传算法应用于特定问题时,没有标准的超参数设定规则。

  • 计算密集
    种群规模较大时可能需要大量计算,在达到良好结果之前会非常耗时。
    可以通过选择超参数、并行处理以及在某些情况下缓存中间结果来缓解这些问题。

  • 过早趋同
    如果一个个体的适应能力比种群的其他个体的适应能力高得多,那么它的重复性可能足以覆盖整个种群。这可能导致遗传算法过早地陷入局部最大值,而不是找到全局最大值。
    为了防止这种情况的发生,需要保证物种的多样性。

  • 无法保证的解的质量
    遗传算法的使用并不能保证找到当前问题的全局最大值(但几乎所有的搜索和优化算法都存在此类问题,除非它是针对特定类型问题的解析解)。
    通常,遗传算法在适当使用时可以在合理的时间内提供良好的解决方案。

应用场景

  • 数学表示复杂的问题:由于遗传算法仅需要适应度函数的结果,因此它们可用于难以求导或无法求导的目标函数问题,大量参数问题以及参数混合问题类型。
  • 没有数学表达式的问题:只要可以获得分数值或有一种方法可以比较两个解,遗传算法就不需要对问题进行数学表示。
  • 涉及噪声数据问题:遗传算法可以应对数据可能不一致的问题,例如源自传感器输出或基于人类评分的数据。
posted @ 2025-03-02 20:45  黄骏  阅读(62)  评论(0)    收藏  举报