drools指北——Rete算法

2,563 阅读5分钟

RETE算法是一种用于实现规则匹配的高效算法,它被广泛应用于人工智能、专家系统、机器学习等领域。rete 算法是实现产生式系统中正向推理的高效模式匹配算法,通过形成一个 rete 网络进行模式匹配,利用基于规则的系统的时间冗余性和结构相似性特征。提高系统模式匹配效率。Drools 引擎就是利用 rete 算法对规则进行分析,形成 rete 网络,对模式进行匹配。

其核心思想是将分离的匹配项根据内容动态构造匹配树,以达到显著降低计算量的效果。Rete 算法可以被分为两个部分:规则编译和规则执行。当 Rete 算法进行事实的断言时,包含三个阶段:匹配、选择和执行,称做 match-select-act cycle。

Rete 网络初识

Rete算法通过规则条件生成了一个网络,每个规则条件是网络中的一个节点分为两部分:

  • 规则编译,根据规则集生成推理网络的过程
  • 运行时执行,将数据送入推理网络进行筛选的过程

image.png

RootNode:Rete 网络的根节点,所有对象通过 Root 节点进入网络。

ObjectTypeNode:对象类型节点,就是我们的fact,也就是我们规则所用到的pojo,用于选择事实的类型

AlphaNode:Alpha 节点是规则的条件部分的一个模式,一个对象只有和本节点匹配成功后,才能继续向下传播。

LeftInputAdapterNodes:将单个对象转化成对象数组,主要为beta节点提供作用. JoinNode:用作连接(jion)操作的节点,相当于 and,相当于数据库的表连接操作,属于 betaNode 类型的节点。BetaNode 节点用于比较两个对象和它们的字段。两个对象可能是相同或不同的类型。我们将这两个输入称为左和右。BetaNode 的左输入通常是一组对象的数组。BetaNode 具有记忆功能。左边的输入被称为 Beta Memory,会记住所有到达过的语义。右边的输入成为 Alpha Memory,会记住所有到达过的对象。

NotNode:根据右边输入对左边输入的对象数组进行过滤,两个 NotNode 可以完成' exists '检查。

TerminalNode: 被用来表明一条规则已经匹配了它的所有条件(conditions)。

Rete 网络创建与运行

我们用一个drl文件来说明下rete网络构建的过程。以下有两个规则:

rulerule1when 
$i : Item( itemCode == “1100”)
$o : Order(amount > 30, items contains $item ) 
then 
System.out.println( “订单金额大于30,且包含商品1100" ); 
end 
rulerule2when 
$i : Item( itemCode == “1100”)
then 
System.out.println(“包含商品1100的订单 " ); 
end

那么他们构建的过程是什么呢?

image.png

创建

1.创建根节点
2.加入一条规则
  • a. 取出规则中的一个模式 ,检查模式中的参数类型,如果是新类型(也就是新的fact类型,item和order),则加入一个类型节点;
  • b. 检查模式 对应的 Alpha 节点是否已存在,如果存在则记录下节点位置,如果没有则将模式 作为一个 Alpha 节点加入到网络中,同时根据 Alpha 节点的模式建立 Alpha 内存表;
  • c. 重复 b 直到所有的模式处理完毕;
  • d. 组合 Beta 节点,Beta 左输入节点为 Alpha(1),右输入节点为 Alpha(2) , 并将两个父节点的内存表内联成为自己的内存表;
  • e. 重复 d 直到所有的 Beta 节点处理完毕;
  • f. 将动作(Then 部分)封装成子节点作为 Beta(n) 的输出节点;
3.重复步骤2直到所有规则处理完毕; 执行完上述步骤,建立的 rete 网络图

运行时:

Drools将规则评估阶段与规则执行阶段区分开来 从工作内存中取工作存储区元素WME(Working Memory Element)放入根节点进行匹配。

  • 1.遍历每个alpha节点(含ObjectType节点),如果alpha节点约束条件与该WME一致,则将该WME存在该alpha节点的匹配内存中,并向其后继节点传播。
  • 2.对alpha节点的后继结点继续匹配的过程,直到alpha内存所有通过匹配的事实保存在alpha内存中。
  • 3.对每个beta节点进行匹配,如果单个事实进入beta节点左部,则转换成一个元素的元组存在节点左侧内存中。如果是一个元组进入左部,则将其存在左内存中。
  • 4.如果一个事实进入右侧,则将其与左内存中的元组按照节点约束进行匹配,符合条件则将该事实对象与左部元组合并,并传递到下一节点。bate结点有left存储区和right存储,其中left存储区是beta内存,right存储区是alpha内存。
  • 5.重复(4)直到所有beta处理完毕,元组对象进入到Terminal节点。 对应的规则被触活, 建立相应的Activation,将规则后件加入议程(Agenda)等待执行。

优势和劣势

优势劣势
节点效率高集合的变化剧烈时,算法保存效果不理想
集合变化不大时,匹配效率高状态重复保存
匹配速度与规则数目关系不大规则与事实很多时, 会耗尽系统资源
不能处理缺失的数据及模糊的逻辑