编码是建立 基因型 与 表现型 的映射关系

 

编码原则

完备性(completeness):问题空间的所有解都能表示为所设计的基因型;

健全性(soundness):任何一个基因型都对应于一个可能解;

非冗余性(non-redundancy):问题空间和表达空间一一对应

 

二进制编码

解决常规问题最常用的编码方式

编码原则

二进制的位数由 解空间 大小决定,如 解空间为 0-10,则 编码位数为 3 位 111=12

 

优缺点

优点-简单

编码、解码操作简单;

交叉、变异便于实现;

缺点-变化剧烈且不连续

二进制编码,随机改变一个位置的数字,可能带来几十(2^4=16)甚至上百(2*10=128)的变化,这使得搜索过程变化剧烈,故而

变异过程不连续;

局部搜索(小范围搜索)能力较差;

不适合高精度问题;

一句话,个体长度较短时,无法满足精度要求;个体长度较长时,增加解空间的搜索难度

 

浮点数编码

编码原则

根据业务自行设定,一个个体可以是一个浮点数,也可以是多个,如 1.2-3.2-5.3-7.2-1.4-9.7

 

优点

适用于数值比较大的解

适用于精度较高的解

适用于解空间较大的情况

 

摘录他人

  1. 改善了遗传算法的计算复杂性,提高了运算交率
  2. 便于遗传算法与经典优化方法的混合使用
  3. 便于设计针对问题的专门知识的知识型遗传算子
  4. 便于处理复杂的决策变量约束条件

 

交叉变异的特点

如果是 多个浮点数,基本和二进制的 单点交叉、多点交叉 等雷同,

如果是 单个浮点数,有其方式,也很灵活,

  // 如交叉:随机产生介于 父亲和母亲 间的一个数,(5.5,7, 6.3),

  // 如变异:随机加上一个 (-1, 1)之间的一个数

 

符号编码

摘录他人

  1. 符合有意义积术块编码原则
  2. 便于在遗传算法中利用所求解问题的专门知识
  3. 便于遗传算法与相关近似算法之间的混合使用。

 

 

实值编码

根据实际情况编码

 




 

遗传算法中的编码方式是将问题的解(即个体或染色体)表示为计算机可以处理的数据结构的关键步骤。选择合适的编码方式对整个算法的性能和效率至关重要。

以下是遗传算法中主要和常见的编码方式,我将它们分为几大类进行介绍:

一、二进制编码

这是最经典、最模拟自然界遗传机制的编码方式。

  • 原理:将解空间的变量映射成一个二进制串(0和1的序列)。

  • 如何工作:对于一个实数优化问题,首先确定变量的上下界 [L,U][L,U] 和要求的精度,然后将这个区间划分为 2l2l 份(ll 是二进制串的长度)。解码公式通常为:
    x=L+(二进制串对应的十进制值)2l−1×(U−L)x=L+2l1(二进制串对应的十进制值)×(UL)

  • 优点:

    1. 简单通用:易于理解和实现。

    2. 符合模式定理:二进制编码使得算法的数学分析(如模式定理)更直接。

    3. 交叉、变异操作简单自然:单点交叉、多点交叉、位翻转变异等操作非常直观。

  • 缺点:

    1. 存在海明悬崖:对于某些相邻整数(如7:0111和8:1000),需要改变所有位才能实现,给进化带来困难。

    2. 精度与长度权衡:高精度需要很长的编码串,可能导致搜索空间爆炸。

    3. 对于某些问题不直观:比如旅行商问题,用二进制编码会很别扭。

适用场景:函数优化、参数优化等连续或离散问题。


二、实数编码 / 浮点数编码

特别适用于连续变量的优化问题。

  • 原理:直接用实数表示变量的值。每个基因就是一个实数。

    • 例如,求解函数 f(x,y,z)f(x,y,z) 的最大值,染色体可以直接表示为 [x, y, z],如 [1.23, -0.45, 6.78]

  • 优点:

    1. 表示自然:对于连续优化问题,无需复杂的编码和解码过程。

    2. 精度高:不存在量化误差。

    3. 搜索效率高:特别适合在大型、复杂的搜索空间中进行搜索,能更快地找到好解。

    4. 易于引入问题特定知识。

  • 缺点:

    1. 需要重新设计遗传算子(交叉和变异)。

常见的遗传算子:

  • 交叉:模拟二进制交叉、算术交叉、启发式交叉等。

  • 变异:均匀变异、高斯变异、边界变异等。

适用场景:数值优化、工程优化、机器学习超参数调优等连续问题。


三、排列编码 / 序列编码

专门用于顺序类问题。

  • 原理:染色体是一个序列,表示对象的一种排列顺序。

    • 最经典的例子是旅行商问题:城市列表的一个排列就是一条路径,如 [1, 4, 2, 5, 3]

  • 优点:

    1. 直观表示解:直接表达了问题的解。

    2. 能保证合法性:通过特殊设计的遗传算子,可以保证后代仍然是有效的排列。

  • 缺点:

    1. 标准交叉算子不适用:单点交叉等会产生非法解(重复或缺失城市)。

常见的遗传算子:

  • 交叉:部分映射交叉、顺序交叉、循环交叉等。

  • 变异:交换变异、插入变异、逆转变异等。

适用场景:旅行商问题、作业车间调度、车辆路径规划、DNA序列分析等任何与顺序相关的问题。


四、树形编码

主要用于遗传编程,目标是演化出计算机程序。

  • 原理:染色体是一个树形结构,节点代表操作符(如 +, -, *, /, sin),叶子节点代表操作数(如变量x, 常数5)。

    • 例如,表达式 (x+5)∗sin(y)(x+5)sin(y) 可以表示为一棵树。

  • 优点:

    1. 表达能力极强:可以表示复杂的程序、公式或决策树。

    2. 非常灵活。

  • 缺点:

    1. 结构复杂:实现难度大。

    2. 容易“膨胀”:树会变得非常大且复杂,影响效率。

    3. 需要专门设计的遗传算子。

常见的遗传算子:子树交叉、节点变异等。

适用场景:符号回归、自动程序设计、演化硬件、决策树学习。


五、其他编码方式

  • 值编码:更一般的编码,基因值可以是整数、实数、字符或更复杂的数据结构。实数编码和排列编码都可以看作是它的特例。

  • 矩阵编码:用于表示矩阵形式的问题,如图像处理、神经网络权重优化等。

总结与选择原则

编码方式核心思想优点缺点典型应用
二进制编码 用0/1串表示解 简单,符合模式定理 有海明悬崖,精度与长度矛盾 函数优化,开关问题
实数编码 用实数直接表示变量值 精度高,效率高,自然 需设计特殊算子 连续数值优化,工程设计
排列编码 表示一个序列或排列 直观,能保证解的合法性 标准交叉算子不适用 TSP,调度,路径规划
树形编码 用树结构表示程序或表达式 表达能力极强 结构复杂,易膨胀 遗传编程,符号回归

 

 

 

 

 

选择编码方式的原则:

    1. 完整性:编码空间必须包含所有可能的合法解。

    2. 闭合性:遗传算子作用于合法个体后,应能产生新的合法个体。

    3. 有效性:编码应与问题高度匹配,能自然地表达解。

    4. 模块性:编码应能构建有意义的“构建块”,以便遗传算子能有效地组合它们。

    5. 复杂性:在满足需求的前提下,尽量选择简单的编码,以降低实现和计算成本。

 

 

 

参考资料:

https://www.jianshu.com/p/ae5157c26af9  超详细的遗传算法(Genetic Algorithm)解析

https://blog.csdn.net/u010451580/article/details/51178225/