首页 > 编程知识 正文

drools算法,drools教程

时间:2023-05-06 14:15:08 阅读:16411 作者:454

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 算法的不足 存在状态重复保存的问题,比如匹配过模式1和模式2的事实要同时保存在模式1和模式2的节点缓存中,将 占用较多空间并影响匹配效率。事实的删除与事实的添加顺序相同, 除了要执行与事实添加相同的计算外, 还需要执行查找, 开销很高。rete的一个主要缺点就是不适合处理快速变化的数据和规则。主要表现在: 1.数据变化引起节点保存的临时事实频繁变化,这将让rete失去增量匹配的优势。2.数据的变化使得对规则网络的种种优化方法如索引、条件排序等失去效果。 rete算法使用了alpha内存存储已计算的中间结果, 以牺牲空间换取时间, 从而加快系统的速度。然而当处理海量数据与规则时,beta内存根据规则的条件与事实的数目而成指数级增长, 所以当规则与事实很多时, 会耗尽系统资源。规则引擎不能处理缺失的数据及模糊的逻辑。例如规则“如果年级大则容易患中风”。产生式推理系统将不能精确表达“年级大”及“容易”这样的概念,相应的推理也不能得到精确的结果。这种场合下,算法变得很脆弱。

参考:

基于Rete算法的规则引擎Drools的研究

Drools规则工作流引擎全面开发教程

Rete算法:研究现状与挑战

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。