第 81 章 决策引擎中的 Phreak 规则算法
Red Hat Process Automation Manager 中的决策引擎使用 Phreak 算法进行规则评估。Phreak 从 Rete 算法发展,包括为面向对象的系统在以前的 Red Hat Process Automation Manager 版本中引入的增强 Rete 算法 ReteOO。总体而言,Phreak 比 Rete 和 ReteOO 更具扩展性,在大型系统中更快。
虽然 Rete 被视为 eager (即时规则评估)和数据面向数据,但 Phreak 被视为 lazy (延迟的规则评估)和目标导向。Rete 算法在插入、更新和删除操作过程中执行许多操作,以便查找所有规则的部分匹配。在规则匹配过程中,Rete 算法的强制性需要在最终执行规则前花费大量时间,特别是在大型系统中。使用 Phreak 时,规则的部分匹配会延迟,以便更有效地处理大量数据。
Phreak 算法在以前的 Rete 算法中添加以下一组改进:
- 上下文内存的三个层:节点、网段和规则内存类型
- 基于规则、基于段和基于节点的链接
- lazy (延迟)规则评估
- 带有暂停和恢复的基于堆栈的评估
- 隔离规则评估
- 面向集合的传播
81.1. Phreak 中的规则评估 复制链接链接已复制到粘贴板!
当决定引擎启动时,所有规则都将被视为从可触发规则的模式匹配数据中 取消链接。在这个阶段,决策引擎中的 Phreak 算法不会评估规则。插入、update 和删除操作已排队,Phreak 使用 heuristic (根据规则最可能导致执行)来计算并选择下一个评估规则。当为规则填充所有必需的输入值时,该规则将被视为与相关模式匹配数据的链接。然后,Phreak 创建一个代表此规则的目标,并将目标放置在按规则 salience 排序的优先级队列中。仅评估创建目标的规则,其他潜在的规则评估会延迟。在评估单个规则时,节点共享仍然通过分段的过程实现。
与面向元的 Rete 不同,Phreak 传播是面向集合的。对于正在评估的规则,决策引擎可以访问第一个节点,并处理所有排队的插入、更新和删除操作。结果添加到集合中,集合会传播到子节点。在子节点中,处理所有排队的插入、更新和删除操作,将结果添加到同一集合中。然后,该集合被传播到下一个子节点,并且同一进程会重复,直到它到达终端节点。此周期创建批处理进程效果,可为某些规则构造提供性能优势。
基于网络分段,通过分层位掩码系统进行链接和取消链接规则。构建规则网络时,会为由同一组规则共享的规则网络节点创建片段。规则由片段路径组成。如果规则没有与任何规则共享任何节点,则它将成为单个网段。
为片段中的每个节点分配一个位掩码偏移。根据以下要求,为规则路径中的每个片段分配另一个位掩码:
-
如果节点至少有一个输入存在,则节点位被设置为
on状态。 -
如果片段中的每个节点将位设置为
on状态,则片段位也会设置为on状态。 -
如果任何节点位被设置为
off状态,则片段也会设置为off状态。 -
如果规则路径中的每个片段都设置为
on状态,则该规则将被视为链接,并创建一个目标来调度规则进行评估。
相同的位掩码技术用于跟踪修改的节点、片段和规则。此跟踪功能可让已经链接的规则被修改自评估目标后取消调度。因此,任何规则无法评估部分匹配项。
在 Phreak 中,这种规则评估过程是可能的,因为与 Rete 中的单个内存相比,Phreak 具有三个有节点、片段和规则内存类型的上下文内存层。这种分层允许在规则评估过程中进行更多上下文了解。
图 81.1. Phreak 三层内存系统
以下示例演示了如何在这个三层内存系统中组织并评估规则。
示例 1: 单一规则(R1),它有三个模式:A、B 和 C。规则形成一个片段,位 1、2 和 4 用于节点。单个片段的偏移值为 1。
图 81.2. 示例 1:单一规则
示例 2: 添加规则 R2 和共享模式 A。
图 81.3. 示例 2:两个带有模式共享的规则
模式 A 放置在自己的片段中,为每个规则生成两个片段。这两个片段形成其各自规则的路径。第一个片段由两个路径共享。链接模式 A 时,片段将变为链接。然后,片段会迭代片段共享的每个路径,将位 1 设置为 on。如果稍后启用了模式 B 和 C,则路径 R1 的第二个片段链接,这会导致为 R1 打开位 2。为 R1 打开位 1 和位 2 后,该规则现已链接,并创建了目标来调度规则以便稍后评估和执行。
评估规则时,片段将启用共享匹配的结果。每个片段都有一个暂存内存来排队所有插入、更新和删除该片段。评估 R1 时,规则进程模式 A,这会导致一组元组。该算法检测到分段分割,为集合中的每个插入、更新和删除创建对等的元组,并将它们添加到 R2 暂存内存中。然后,这些元组将与任何现有的 stage 元组合并,并在最终评估 R2 时执行。
示例 3: 规则 R3 和 R4 被添加,共享模式 A 和 B。
图 81.4. 示例 3:带有模式共享的三三个规则
规则 R3 和 R4 有三个片段,R1 有两个片段。模式 A 和 B 由 R1、R3 和 R4 共享,而模式 D 则由 R3 和 R4 共享。
示例 4: 单一规则(R1),它带有一个数字且没有模式共享。
图 81.5. 示例 4:单一规则,没有模式共享
当 Not、Exists 或 Accumulate 节点包含多个元素时,将形成不同的活动。在本例中,元素 B not (C) 形成了数字。项 not (C) 是一个不需要归档的单个元素,因此在 Not node 内合并。数字使用专用片段。规则 R1 仍然有两个片段的路径,另一个内部路径。当关联被链接后,也会在外部段中链接。
示例 5: 规则 R1,其具有规则 R2 共享的数字。
图 81.6. 示例 5:两个规则,一个带有参与和模式共享
规则中的电池节点可以由没有销售的规则共享。此共享会导致将网段分成两个片段。
受限 Not nodes 和 Accumulate 节点永远不会取消链接片段,并且始终被视为打开其位。
Phreak 评估算法基于堆栈,而不是基于方法的递归。当使用 StackEntry 来代表当前正在评估的节点时,可以随时暂停并恢复规则评估。
当规则评估达到一次时,会为外部路径片段和子组创建一个 StackEntry 对象。最后段首先被评估,当集合到达销售路径的末尾时,片段将合并到分段源到的外部节点的暂存列表中。然后,前面的 StackEntry 对象已被恢复,现在可以处理相关的结果。这个过程具有增加的好处,特别是对于 Accumulate 节点,所有工作都在批处理中完成,然后再传播到子节点。
相同的堆栈系统用于高效的后向链。当规则评估到达查询节点时,评估将暂停,并将查询添加到堆栈中。然后,查询会被评估来生成结果集,该集合保存在恢复的 StackEntry 对象的内存位置,以获取并传播到子节点。如果查询本身称为其他查询,该过程会重复,而当前查询已暂停,并为当前查询节点设置新的评估。
81.1.1. 使用正向和后链的规则评估 复制链接链接已复制到粘贴板!
Red Hat Process Automation Manager 中的决策引擎是一个混合原因,它使用转发链和后链来评估规则。转发链规则系统是一种数据驱动的系统,它以决策引擎工作内存中的事实开始,并对这一事实做出更改。当对象插入到工作内存中时,因更改计划执行而满足的任何规则条件。
相反,反向链规则系统是一个目标驱动的系统,从决策引擎尝试满足的公式开始,通常使用递归。如果系统无法访问语音或目标,它会搜索子组,这是完成当前目标的一部分。系统会继续这个过程,直到满足初始目标或满足所有子状态为止。
下图演示了,决策引擎如何使用转发链和逻辑流中的向链段来评估规则:
图 81.7. 使用正向和后链的规则评估逻辑