Rete算法基本知识
一、 rete概述
1.Rete
Rete算法是一种前向规则快速匹配算法,是一个用于产生式系统的高效模式匹配算法,其匹配速度与规则数目无关。
注:Rete是拉丁文,对应英文是net,也就是网络。
2.产生式规则
产生式规则是一种常用的知识表示方法,它以"IF-THEN"的形式表现了因果关系。
例如
1 2 3 4 5 6 | R1: IF 某动物是有蹄类动物 AND 有长脖子 AND 有长腿 AND 身上有暗斑点 THEN 该动物是长颈鹿(问题解决) R2:IF 某动物是有蹄类动物 AND 身上有黑色条纹 THEN 该动物是斑马(问题解决) …… R8:IF 动物是哺乳动物 AND 嚼反动物 THEN 该动物是有蹄类动物 …… R10:IF 某动物有奶 THEN该动物是哺乳动物…… |
以上一些产生式规则,给出"有奶"、“嚼反”、“长脖子”、“长腿”、"身上有暗斑点"条件(也称为事实 facts),就可以求解出问题的答案是“长颈鹿”。
3.产生式规则系统结构
在介绍Rete算法之前,简单介绍以下产生式规则系统的结构。如图所示,规则存储于产生式内存(Production Memory),需要评估的事实(facts)被插入工作内存(Working Memory)中,在其中被修改或撤出。一个含有大量规则和事实的系统可能导致在一次事实评估中,多条规则为真,这种情形被称为冲突。代理(Agenda)将使用冲突解决策略管理冲突规则的执行顺序。

二、相关概念
2.1 事实(fact):
事实:对象之间及对象属性之间的多元关系。为简单起见,事实用一个三元组来表示:(identifier ^attribute value)
2.2 规则(rule):
由条件和结论构成的推理语句,当存在事实满足条件时,相应结论被激活。一条规则的一般形式如下:
(name-of-this-production
LHS /one or more conditions/
–>
RHS /one or more actions/
)
其中LHS为条件部分,RHS为结论部分。
2.3 模式(patten):
模式:规则的IF部分,已知事实的泛化形式,未实例化的多元关系。
三、RETE网络节点
RETE网络示意图,RETE网络主要分为两个部分,alpha网络和beta网络。

1.节点类型
- 根节点 Root Node:所有对象进入网络的入口,在一个网络只有一个根节点。
- 单输入节点:可分为ObjectTypeNode, AlphaNode, LeftInputAdapterNode等。
- 双输入节点:Beta节点。
- 终端节点 TerminalNode:到达一个终端节点,表示单条规则匹配了所有的条件。
2.ObjectTypeNode
从根节点进入Rete网络后,会立即进入ObjectTypeNode节点,ObjectTypeNode提供了按对象类型过滤对象的能力(用于选择事实的类型,将符合本节点类型的事实向后继的alpha节点传播)。如下图,Cheese类型的事实进入网络后,只需经过Cheese ObjectTypeNode之后的节点。

3.AlphaNode
alpha节点主要进行同对象类型内属性的约束或常量测试。如下图,评估了Cheese事实的name和strength属性值。AlphaNode之间是串行的,即只要其中一个节点不满足,事实就被过滤掉了。

4.LeftInputAdapterNode节点
LeftInputAdapterNode的作用是输入一个对象,传播为一个单对象列表(元组)。
5.BetaNode
beta节点主要根据不同对象之间的约束,如“p.name==c.friend”,“p.age>cat.age”等进行连接操作。beta节点又分为join节点、Not节点等。Join节点包括两种输入,左部输入事实列表,称为元组(Tuple),右部输入一个事实对象,对象与元组在Join节点按照类型间约束进行Join操作,将符合的事实加入元组中继续传入下一个beta节点。如图所示,JoinNode的左输入为一个经过LeftInputAdapterNode传播后的列表,右输入为一个Person对象

6.Terminal节点
到达一个终端节点,表示单条规则匹配了所有的条件,网络中有多个终端节点。当单条规则中有or时,也会产生多个终端节点。
四、创建Rete网络
1.RETE算法通过构建一个网络进行匹配,具体过程如下:
- 创建root节点(根节点),推理网络的入口。
- 拿到规则1,从规则1中取出模式1(模式就是最小的原子条件)。
a) 检查模式1中的参数类型,如果是新类型,添加一个类型节点(ObjectTypeNode)。
b) 检查模式1对应的Alpha节点是否存在,如果存在记录下节点的位置;如果没有,将模式1作为一个Alpha节点加入到网络中。同时根据Alpha节点建立Alpah内存表。
c) 重复b,直到处理完规则1中的所有模式。
d) 组合Beta节点:Beta(2)左输入节点为Alpha(1),右输入节点为Alpha(2);Beta(i)左输入节点是Beta(i-1),右输入节点为Alpha(i),并将两个父节点的内存表内联成为自己的内存表
e) 重复d,直到所有Beta节点处理完毕
f) 将动作Then部分封装成最后节点做为Beta(n) - 重复2,直到所有规则处理完毕
2.举例
rule “规则1:账户余额小于100”
when
$account:Account(balance<100)
then
print(“账户余额小于100”);
end
rule “规则2:账户余额小于100的姓张的学生卡”
when
$account:Account(balance<100,type=Account.Type.学生)
$customer:Customer(firstName = ‘zhang’,accounts contains $account)
then
print(“账户余额小于100的姓张的学生卡”);
end
rule “规则3:账户余额小于100的北苑路姓张的学生”
when
$account:Account(balance<100,type=Account.Type.学生)
$customer:Customer(firstName = ‘zhang’,accounts contains $account)
$addr:Addr(street=“北苑路”,customers contains $customer)
then
print(“账户余额小于100的北苑路姓张的学生”);
end

3.运行时执行流程分析
推理引擎在进行模式匹配时,为每一个事实建立WME(Working Memory Element),然后将WME从Rete网络的Root Node开始匹配,因为WME传递到的结点类型不同采取的算法也不同,所以需要对alpha结点和beta结点处理WME的不同情况而分开讨论。
- 如果WME的类型和Root Node的后继结点TypeNode(alpha结点的一种)所指定的类型相同,则会将该fact保存在该TypeNode对应的alpha存储区中,该WME被传到后继结点继续匹配,否则会放弃该WME的后续匹配。
- 如果WME被传递到alpha结点,则会检测WME是否和该结点对应的module相匹配。若匹配成功,则会将该fact保存在该alpha结点对应的存储区中,该WME被传递到后继结点继续匹配,否则会放弃该WME的后续匹配。
- 如果WME被传递到beta结点的右端,则会加入到该beta结点的right存储区,并和left存储区中的Token进行匹配。若匹配成功,则会将该WME加入到Token中,然后将Token传递到下一个结点。
- 如果Token被传递到beta结点的左端,则会加入到该beta结点的left存储区,并和right存储区中的WME进行匹配。若匹配成功,则该Token会封装匹配到的WME形成新的Token,传递到下一个结点,否则会放弃该Token的后续匹配。
- 如果WME被传递到beta结点的左端,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照步骤4所示的方法进行匹配。
- 如果Token传递到Terminal Node,则和该Root Node对应的规则被激活,并存储到Agenda当中,等待激发。
- 如果WME被传递到Terminal Node,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照6所示的方法进行匹配。
注:工作存储区元素(Working Memory Element,简称WME):是存储区储存的最小单位,WME是为事实建立的元素,是用于和非根结点代表的模式进行匹配的元素;Token:是WME的列表,包含有多个WME。
五、Rete算法的不足
- 存在状态重复保存的问题,比如匹配过模式1和模式2的事实要同时保存在模式1和模式2的节点缓存中,将占用较多空间并影响匹配效率。
- rete的一个主要缺点就是不适合处理快速变化的数据和规则。
- rete算法使用了alpha内存存储已计算的中间结果, 以牺牲空间换取时间, 从而加快系统的速度。然而当处理海量数据与规则时,beta内存根据规则的条件与事实的数目而成指数级增长, 所以当规则与事实很多时, 会耗尽系统资源。
- 规则引擎不能处理缺失的数据及模糊的逻辑。这种场合下,算法变得很脆弱。
参考链接:
产生式规则和Rete算法解析
规则匹配——Rete 算法原理及实现