遗传编程中的多样性表征与复杂度分析
1. 遗传编程中的多样性问题
许多进化优化方法存在过早收敛和多样性丧失的问题,候选解决方案容易陷入局部最优,导致适应度难以进一步提升。为解决这一问题,提出了两种准确测量多样性的新方法:
-
改进伪同构测量
:通过表达式简化器消除非功能代码,改善伪同构测量,能更准确地指示人工蚂蚁问题中基因型的多样性。
-
更新标准熵测量
:针对回归问题等产生更连续适应度值的情况,将适应度聚类到有限数量的区间,再计算熵,相较于原始熵有显著改进。
在回归问题中,行为收敛现象较为明显,尽管比人工蚂蚁问题收敛速度慢。初始生成后,适应度值会分散到更多区间,直至达到最大熵,之后种群会向更高适应度值优化,熵开始下降。
| 方法 | 作用 |
|---|---|
| 改进伪同构测量 | 准确指示人工蚂蚁问题中基因型多样性 |
| 更新标准熵测量 | 解决回归问题等连续适应度值的多样性测量 |
2. 遗传编程中的表示方法
2.1 遗传编程概述
遗传编程(GP)通常使用树状图来表示解决方案,还可通过自动定义函数(ADFs)表达模块。研究表明,如果表示方法能够表达模块,函数的复杂度与原始集(函数集和终端集)无关,因为它能以恒定成本定义自己的原语。
2.2 笛卡尔遗传编程(CGP)
CGP 是进化计算中一种较新的表示方法,与基于树的表示不同,它将程序表示为有向无环图(DAGs),允许重用先前计算的输出,从而降低函数的复杂度。在 CGP 中,笛卡尔程序(CP)表示法通过在二维网格上排列函数节点来实现,输入从左进入,输出从右获取,信息从左向右流动。
其优点如下:
- 可能存在大量未连接部分,单个突变可能连接大的子程序,实现搜索空间的“大跳跃”。
- 计算输出可被右侧函数节点多次使用,而基于树的 GP 则无此重用特性。
2.3 相关工作
- Handley 方法 :使用 DAG 存储树的种群,相同子树只需表示一次,通过缓存子树值节省时间,提高了 GP 算法的空间利用率和运行时间。
- Keijzer 和 Roberts 的工作 :继续使用最小 DAG 存储种群,并应用于医学成像问题,研究了缓存子树的时间与评估子树时间的权衡。
graph LR
A[遗传编程] --> B[树状表示]
A --> C[ADFs]
A --> D[CGP]
D --> E[有向无环图(DAGs)]
E --> F[重用先前计算输出]
B --> G[无重用]
C --> H[可表达模块]
3. CGP 的具体实现
3.1 CP 的基因型表示
在 CGP 中,基因型是一个字符串,用户定义的参数设置网格的行数和列数。每个节点由 3 个整数描述,前两个是输入,第三个是要放置在该位置的函数。例如,函数集 {+, −, ∗, /} 分别由整数 {1, 2, 3, 4} 表示。
3.2 示例分析
以一个 3 行 3 列的 CP 为例,基因型为 “2 1 3, 3 2 1, 2 3 2, 6 6 3, 4 2 4, 2 6 3, 2 2 2, 7 8 1, 7 9 3”。每个函数节点的输出按顺序编号,从左上角节点的输出 4 开始,右下角节点的输出为 12。通过对基因型的解释,可以构建出相应的 CP 结构,其中部分节点可能未连接,且存在输出重用的情况。
4. 不同表示方法的重用特性对比
4.1 三种表示方法
- 基于树的表示 :不支持重用,每个节点在一次计算中最多执行一次,有自顶向下和自底向上两种执行方式。自底向上时,每个节点精确执行一次;自顶向下时,节点可能执行一次或不执行。
- CP 表示 :允许重用先前表达的子树(直至叶子节点),通过将信息流向调整为从下到上,并只显示连接节点,可将 CP 表示为具有重叠子树的树。
- ADFs 表示 :可任意重用子树,灵活性最高。
4.2 复杂度分析
当用不同原始集将函数表示为树时,深度受乘法常数限制,节点数量可能呈指数级增加。而对于 CP 表示,函数的复杂度与终端集无关(最多加一个常数),前提是不同终端集都能被模拟。这是因为如果表示方法能表达自动重用输出(AROs),就能以恒定成本定义自己的终端。
| 表示方法 | 重用特性 | 复杂度影响 |
|---|---|---|
| 基于树的表示 | 无重用 | 深度受乘法常数限制,节点数可能指数增加 |
| CP 表示 | 重用先前表达的子树 | 复杂度与终端集无关(最多加常数) |
| ADFs 表示 | 任意重用子树 | 灵活性高 |
graph LR
A[基于树的表示] --> B[无重用]
C[CP 表示] --> D[重用先前子树]
E[ADFs 表示] --> F[任意重用子树]
B --> G[复杂度受原始集影响大]
D --> H[复杂度与终端集无关(加常数)]
F --> I[灵活性高]
综上所述,遗传编程中的不同表示方法在重用特性和复杂度方面存在显著差异。CGP 作为一种新的表示方法,通过重用输出降低了函数复杂度,为解决复杂问题提供了新的思路。未来,可进一步研究如何利用文中提出的多样性测量方法,改进 CGP 中的局部优化算子,避免过早收敛问题。
5. 重用特性对计算过程的影响
5.1 基于树表示的计算过程
基于树的表示在计算过程中,由于没有重用特性,从叶节点到根节点只有一条路径。在自底向上的计算方式中,每个节点精确执行一次。例如,先给每个叶节点赋值,然后将值向上传递给上层节点进行计算,最终得到根节点的值。在自顶向下的计算方式中,节点可能执行一次或不执行。比如对于逻辑函数 AND,如果左子树的值为 false,就无需计算右子树;对于 IF - THEN - ELSE 函数,根据条件部分的计算结果,只需计算 THEN 或 ELSE 子树中的一个。
5.2 CP 表示的计算优势
CP 表示由于可以重用先前表达的子树,在计算时能够避免重复计算相同的子树。当一个子树的输出被多个其他节点使用时,只需计算一次该子树,后续使用该输出的节点可以直接获取结果,从而提高了计算效率。例如在一个复杂的函数计算中,某个子树的计算结果被多个不同位置的节点引用,使用 CP 表示就可以节省大量的计算资源。
5.3 ADFs 表示的灵活性体现
ADFs 表示可以任意重用子树,这使得它在处理复杂问题时具有极高的灵活性。可以根据需要定义不同的模块,这些模块可以在程序的不同位置被多次使用,极大地提高了代码的复用性和程序的可维护性。例如在一个大型的计算任务中,可以将一些常用的计算逻辑封装成模块,然后在不同的计算步骤中多次调用这些模块。
| 表示方法 | 计算方式 | 计算优势 |
|---|---|---|
| 基于树的表示 | 自底向上:节点精确执行一次;自顶向下:节点可能执行一次或不执行 | 逻辑清晰,路径唯一 |
| CP 表示 | 可重用子树输出 | 避免重复计算,提高效率 |
| ADFs 表示 | 任意重用子树 | 灵活性高,代码复用性强 |
graph LR
A[基于树的表示计算] --> B[自底向上]
A --> C[自顶向下]
D[CP 表示计算] --> E[重用子树输出]
F[ADFs 表示计算] --> G[任意重用子树]
B --> H[节点精确执行一次]
C --> I[节点可能不执行]
E --> J[提高效率]
G --> K[灵活性高]
6. 不同表示方法在实际问题中的应用
6.1 函数回归问题
在函数回归问题中,需要找到一个函数来拟合给定的数据点。基于树的表示可能需要大量的节点来表示复杂的函数,因为它不能重用子树,可能会导致复杂度较高。而 CGP 由于可以重用先前计算的输出,能够更高效地表示函数,减少节点数量,降低复杂度。例如,对于一个具有多个重复计算部分的函数,CP 表示可以将这些重复部分的计算结果进行重用,从而简化函数的表示。
6.2 布尔问题
布尔问题通常涉及逻辑运算,如 AND、OR、NOT 等。ADFs 表示可以将常用的逻辑运算封装成模块,然后在不同的布尔表达式中多次使用,提高了代码的可读性和可维护性。CP 表示也可以通过重用输出,减少逻辑运算的重复计算,提高计算效率。而基于树的表示在处理布尔问题时,可能会因为缺乏重用特性而导致代码冗余。
6.3 机器人控制问题
在机器人控制问题中,可能需要多个输出信号来控制机器人的不同动作。CP 表示可以很好地处理多个输出的情况,因为它可以将不同的计算部分进行复用,实现多个输出之间的协调控制。例如,一个具有两个轮子的机器人,CP 可以通过重用某些计算结果来同时控制两个轮子的运动。ADFs 表示则可以根据机器人的不同任务需求,定义不同的控制模块,提高机器人的适应性和灵活性。
| 问题类型 | 基于树表示的表现 | CGP 表现 | ADFs 表现 |
|---|---|---|---|
| 函数回归问题 | 复杂度高,节点数量多 | 高效表示,降低复杂度 | 可封装模块,但优势不明显 |
| 布尔问题 | 代码冗余 | 减少重复计算 | 提高可读性和可维护性 |
| 机器人控制问题 | 难以处理多输出协调 | 可复用计算结果,协调多输出 | 定义控制模块,提高适应性 |
graph LR
A[函数回归问题] --> B[基于树表示:复杂度高]
A --> C[CGP:高效表示]
A --> D[ADFs:可封装模块]
E[布尔问题] --> F[基于树表示:代码冗余]
E --> G[CGP:减少重复计算]
E --> H[ADFs:提高可读性]
I[机器人控制问题] --> J[基于树表示:难协调多输出]
I --> K[CGP:复用结果协调输出]
I --> L[ADFs:定义控制模块]
7. 总结与展望
遗传编程中的不同表示方法,包括基于树的表示、ADFs 和 CGP,各有其特点和优势。基于树的表示逻辑简单,但缺乏重用特性,在处理复杂问题时复杂度较高。ADFs 具有很高的灵活性,可以任意重用子树,适合处理需要高度模块化的问题。CGP 作为一种新的表示方法,通过将程序表示为有向无环图,允许重用先前计算的输出,降低了函数的复杂度,提高了计算效率。
在未来的研究中,可以进一步探索如何结合不同表示方法的优势,开发出更高效、更灵活的遗传编程算法。例如,可以将 ADFs 的模块化思想与 CGP 的重用特性相结合,创造出一种新的表示方法,既能提高代码的复用性,又能降低函数的复杂度。同时,利用文中提出的多样性测量方法,对 CGP 中的局部优化算子进行改进,避免过早收敛问题,提高算法的性能和稳定性,使其能够更好地应用于各种复杂的实际问题中。
超级会员免费看
41

被折叠的 条评论
为什么被折叠?



