编码是建立 基因型 与 表现型 的映射关系
编码原则
完备性(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
优点
适用于数值比较大的解
适用于精度较高的解
适用于解空间较大的情况
摘录他人
- 改善了遗传算法的计算复杂性,提高了运算交率
- 便于遗传算法与经典优化方法的混合使用
- 便于设计针对问题的专门知识的知识型遗传算子
- 便于处理复杂的决策变量约束条件
交叉变异的特点
如果是 多个浮点数,基本和二进制的 单点交叉、多点交叉 等雷同,
如果是 单个浮点数,有其方式,也很灵活,
// 如交叉:随机产生介于 父亲和母亲 间的一个数,(5.5,7, 6.3),
// 如变异:随机加上一个 (-1, 1)之间的一个数
符号编码
摘录他人
- 符合有意义积术块编码原则
- 便于在遗传算法中利用所求解问题的专门知识
- 便于遗传算法与相关近似算法之间的混合使用。
实值编码
根据实际情况编码
遗传算法中的编码方式是将问题的解(即个体或染色体)表示为计算机可以处理的数据结构的关键步骤。选择合适的编码方式对整个算法的性能和效率至关重要。
以下是遗传算法中主要和常见的编码方式,我将它们分为几大类进行介绍:
一、二进制编码
这是最经典、最模拟自然界遗传机制的编码方式。
-
原理:将解空间的变量映射成一个二进制串(0和1的序列)。
-
如何工作:对于一个实数优化问题,首先确定变量的上下界 [L,U][L,U] 和要求的精度,然后将这个区间划分为 2l2l 份(ll 是二进制串的长度)。解码公式通常为:
x=L+(二进制串对应的十进制值)2l−1×(U−L)x=L+2l−1(二进制串对应的十进制值)×(U−L) -
优点:
-
简单通用:易于理解和实现。
-
符合模式定理:二进制编码使得算法的数学分析(如模式定理)更直接。
-
交叉、变异操作简单自然:单点交叉、多点交叉、位翻转变异等操作非常直观。
-
-
缺点:
-
存在海明悬崖:对于某些相邻整数(如7:0111和8:1000),需要改变所有位才能实现,给进化带来困难。
-
精度与长度权衡:高精度需要很长的编码串,可能导致搜索空间爆炸。
-
对于某些问题不直观:比如旅行商问题,用二进制编码会很别扭。
-
适用场景:函数优化、参数优化等连续或离散问题。
二、实数编码 / 浮点数编码
特别适用于连续变量的优化问题。
-
原理:直接用实数表示变量的值。每个基因就是一个实数。
-
例如,求解函数 f(x,y,z)f(x,y,z) 的最大值,染色体可以直接表示为
[x, y, z],如[1.23, -0.45, 6.78]。
-
-
优点:
-
表示自然:对于连续优化问题,无需复杂的编码和解码过程。
-
精度高:不存在量化误差。
-
搜索效率高:特别适合在大型、复杂的搜索空间中进行搜索,能更快地找到好解。
-
易于引入问题特定知识。
-
-
缺点:
-
需要重新设计遗传算子(交叉和变异)。
-
常见的遗传算子:
-
交叉:模拟二进制交叉、算术交叉、启发式交叉等。
-
变异:均匀变异、高斯变异、边界变异等。
适用场景:数值优化、工程优化、机器学习超参数调优等连续问题。
三、排列编码 / 序列编码
专门用于顺序类问题。
-
原理:染色体是一个序列,表示对象的一种排列顺序。
-
最经典的例子是旅行商问题:城市列表的一个排列就是一条路径,如
[1, 4, 2, 5, 3]。
-
-
优点:
-
直观表示解:直接表达了问题的解。
-
能保证合法性:通过特殊设计的遗传算子,可以保证后代仍然是有效的排列。
-
-
缺点:
-
标准交叉算子不适用:单点交叉等会产生非法解(重复或缺失城市)。
-
常见的遗传算子:
-
交叉:部分映射交叉、顺序交叉、循环交叉等。
-
变异:交换变异、插入变异、逆转变异等。
适用场景:旅行商问题、作业车间调度、车辆路径规划、DNA序列分析等任何与顺序相关的问题。
四、树形编码
主要用于遗传编程,目标是演化出计算机程序。
-
原理:染色体是一个树形结构,节点代表操作符(如 +, -, *, /, sin),叶子节点代表操作数(如变量x, 常数5)。
-
例如,表达式 (x+5)∗sin(y)(x+5)∗sin(y) 可以表示为一棵树。
-
-
优点:
-
表达能力极强:可以表示复杂的程序、公式或决策树。
-
非常灵活。
-
-
缺点:
-
结构复杂:实现难度大。
-
容易“膨胀”:树会变得非常大且复杂,影响效率。
-
需要专门设计的遗传算子。
-
常见的遗传算子:子树交叉、节点变异等。
适用场景:符号回归、自动程序设计、演化硬件、决策树学习。
五、其他编码方式
-
值编码:更一般的编码,基因值可以是整数、实数、字符或更复杂的数据结构。实数编码和排列编码都可以看作是它的特例。
-
矩阵编码:用于表示矩阵形式的问题,如图像处理、神经网络权重优化等。
总结与选择原则
| 编码方式 | 核心思想 | 优点 | 缺点 | 典型应用 |
|---|---|---|---|---|
| 二进制编码 | 用0/1串表示解 | 简单,符合模式定理 | 有海明悬崖,精度与长度矛盾 | 函数优化,开关问题 |
| 实数编码 | 用实数直接表示变量值 | 精度高,效率高,自然 | 需设计特殊算子 | 连续数值优化,工程设计 |
| 排列编码 | 表示一个序列或排列 | 直观,能保证解的合法性 | 标准交叉算子不适用 | TSP,调度,路径规划 |
| 树形编码 | 用树结构表示程序或表达式 | 表达能力极强 | 结构复杂,易膨胀 | 遗传编程,符号回归 |
选择编码方式的原则:
-
完整性:编码空间必须包含所有可能的合法解。
-
闭合性:遗传算子作用于合法个体后,应能产生新的合法个体。
-
有效性:编码应与问题高度匹配,能自然地表达解。
-
模块性:编码应能构建有意义的“构建块”,以便遗传算子能有效地组合它们。
-
复杂性:在满足需求的前提下,尽量选择简单的编码,以降低实现和计算成本。
参考资料:
https://www.jianshu.com/p/ae5157c26af9 超详细的遗传算法(Genetic Algorithm)解析
https://blog.csdn.net/u010451580/article/details/51178225/
浙公网安备 33010602011771号