rete可以分为编译和运行规则两部分。 规则编译是基于规则集生成推理网络的过程,而运行时运行是将数据发送到推理网络进行过滤的过程。
基本概念Rete算法的初衷是利用规则之间每个域的公共部分来减少规则存储,并存储匹配过程的临时结果以提高匹配速度。 为了达到这一效果,该算法对规则进行划分,将每个条件单元作为基本单元(节点)连接到一个数据判别网络,对事实(facts )进行网络过滤和传播,最终将事实与所有条件相匹配的规则
网络有五种类型的节点:根节点、类型节点、alpha节点(也称为单输入节点)、beta节点(也称为双输入节点)和终端节点。
根节点代表整个Rete网络的入口,可以通过所有事实,传递给ObjectType节点。 作为根节点的后继,
类型节点ObjectType Node是我们的fact,也就是我们的规则中使用的pojo,用于选择事实的类型,并将符合自身节点类型的事实传播到后续的alpha节点。
阿尔法节点(阿尔法节点)主要是“name==zhang”、“age>; 15”等,对同一对象类型内的属性进行约束和常量测试。
很简单的规则
rule '规则1 :帐户馀额小于100 ' when $ account : account (balance 100 ) then print (馀额小于100 ) ); 与end规则1对应的rete网络如下:
名为LeftInputAdapterNode节点的节点的作用是将事实对象转换为元组,主要为beta节点提供角色。
beta节点beta节点主要包括“p.name==c.friend”、“p.age>; 根据不同对象(如cat.age )之间的约束条件执行连接操作。 beta节点分为join节点、Not节点等。 连接节点有两种类型的输入,左侧输入一个称为元组的事实列表,右侧输入一个事实对象。 对象和元组在Join节点上根据类型之间的约束执行Join操作,并将匹配事实添加到元组中,然后中继到下一个beta节点。
在规则1中添加条件,形成其他规则
rule '规则2 :一张学生卡' when $ account : account (balance 100,type=Account.Type .学生) $ customer : cuscount 与end规则2对应的rete网络如下:
终端节点终端节点是规则的最后一个节点,表示规则匹配的结束,如果将事实或元组传递到终端节点,则表示与该终端节点对应的规则处于活动状态。
RETE网络的构建RETE算法的编译结果是创建与规则集相对应的RETE网络,事实在其中流动的图。 要创建rete网络,请执行以下操作:
制定路线。 取出一个规则r。 a .提取模式p,检查参数类型,对于新类型添加类型节点; b .检查模式p的条件约束,对于单一类型约束,检查对应的节点是否已经存在,如果不存在,则对于将该约束作为一个节点添加到链中的后续多态约束,创建对应的节点。 左输入是上一个节点(第一个节点的左输入是LeftInputAdapterNode节点),右输入是当前链的节点。 d .重复b-c直到模式p的所有约束处理完成; e .重复a-d直到处理了所有架构,然后创建终端节点。 每个架构链的末尾都连接到终端节点。 f .将动作(Then部分)封装为叶节点(Action节点)作为输出节点。 重复步骤2,直到处理完所有规则。 按照上述创建rete网络的算法,生成规则3
rule '规则3 :账户余额不足100的北苑路姓张的学生' when $ account : account (balance 100, type=Account.Type .学生) $customer3360customer ) ) ffalance.type .学生accounts contains $account ) $ addr 3360 addr (流customers contains $ customer (then print )参加账户余额不足100的北苑路姓张的学生end规则1、规则2、规则3后,对应的rete网络如下:
从运行时执行工作内存中检索工作区元素WME(workingmemoryelement,简称wme ),并将其放置在根节点上进行匹配。 WME是为事实而制定的要素,是用于与根以外的节点表示的模式匹配的要素。 遍历每个alpha节点(包括ObjectType节点),如果alpha节点约束与WME匹配,则该WME位于alpha节点的匹配内存中,然后传播到后续节点。 到alpha节点的后续节点继续处理(2),直到所有alpha存储器由于匹配的事实而存储在alpha存储器中为止。 如果匹配每个beta节点,并且一个事实位于beta节点的左侧,则已转换为元素的元组位于节点左侧的内存中。 元组进入左侧时
部,则将其存在左内存中。如果一个事实进入右侧,则将其与左内存中的元组按照节点约束进行匹配,符合条件则将该事实对象与左部元组合并,并传递到下一节点。bate结点有left存储区和right存储,其中left存储区是beta内存,right存储区是alpha内存。存储区储存的最小单位是WME。重复(4)直到所有beta处理完毕,元组对象进入到Terminal节点。对应的规则被触活,将规则后件加入议程(Agenda)。对Agenda里的规则进行冲突消解,选择合适的规则执行。 Rete算法的特点rete算法通过共享规则节点和缓存匹配结果,获得产生式推理系统在时间和空间上的性能提升。
1、状态保存事实集合中的每次变化,其匹配后的状态都被保存再alpha和beta节点中。在下一次事实集合发生变化时,绝大多数的结果都不需要变化,rete算法通过保存操作过程中的状态,避免了大量的重复计算。Rete算法主要是为那些事实集合变化不大的系统设计的,当每次事实集合的变化非常剧烈时,rete的状态保存算法效果并不理想。
2、节点共享另一个特点就是不同规则之间含有相同的模式,从而可以共享同一个节点。Rete网络的各个部分包含各种不同的节点共享。
3、节点索引索引方法是指对rete网络的节点建立当前节点对后继的索引,在事实断言时可以通过索引快速找到对应的后继节点而无需逐个查 找。drools在rete的面向对象版本rete-oo算法中对ObjectType节点增加后继alpha节 点的索引,以事实的属性为key,alpha节点为value,这样在事实通过类型节点验证后可以迅速找到对应的alpha节点进行断言。
同样,对beta节点也可以建立索引,beta节点的索引主要是针对节点左右内存的查询。当一个事实传递到beta节点的右内存中时,需要与该节点的左内存进行连接操作,即遍历左侧内存中的事实元组,找到符合节点约束的事实进行连接。该过程的遍历查找效率较低,将beta内存分成若干单元,每个单元分配一个id;对右侧的事实用哈希函数求索引,该索引就是某个单元的位置,通过索引快速找到相应单元进行匹配,如果不在该分区,则将该对象组成一个新的单元加入左内存。
参考:
基于Rete算法的规则引擎Drools的研究
Drools规则工作流引擎全面开发教程
Rete算法:研究现状与挑战