`
VerRan
  • 浏览: 459172 次
  • 性别: Icon_minigender_1
  • 来自: 陕西.西安
社区版块
存档分类
最新评论

RETE 算法的描述(转)

阅读更多

转自:http://www.cnblogs.com/ipointer/archive/2006/11/16/246251.html

 

通过一周左右的研究,对规则引擎有了一定的了解。现在写点东西跟大家一起交流,本文主要针对 RETE 算法进行描述。我的文笔不太好,如 果有什么没讲明白的或是说错的地方,请给我留言。

首先申明,我的帖子借鉴了网上很流行的一篇帖子,好像是来自 CSDN ;还有一点,我不想做太多的名词解 释,因为我也不是个研究很深的人,定义的不好怕被笑话。

好现在我们开始。

首先介绍一些网上对于规则引擎比较好的帖子。

1、  来自 JAVA 视频网

http://forum.iteye.com/viewtopic.php?t=7803&postdays=0&postorder=asc&start=0

2、  RETE 算法的最原始的描述,我不知道在哪里找到的,想要的人可以留下 E-mail

3、  CMU 的一位博士生的毕业论文,个人觉得非常好,我的很多观点都是来自这里的,要的人也可以给我发 mail    mailto:ipointer@163.com

 

接着统一一下术语,很多资料里的术语都非常混乱。

1、  facts 事实,我们实现的时候,会有一个事实库。用 F 表示。

2、  patterns 模板,事实的一个模型,所有事实库中的事实都必须满足模板中的一个。用 P 表示。

3、  conditions 条件 , 规则的组成部分。也必须满足模板库中的一条模板。用 C 表示。我们可以这样理解 facts patterns conditions 之间的关系。 Patterns 是一个接口, conditions 则是实现这个接口的 类,而 facts 是 这个类的实例。

4、  rules 规则,由一到多个条件构成。一般用 and or 连接 conditions 。用 R 表示。

5、  actions 动作,激活一条 rule 执行的动作。我们这里不作讨论。

6、  还有一些术 语,如: working-memory production-memory ,跟这里的概念大同小异。

7、  还有一些, 如: alpha-network beta-network join-node ,我们下面会用到,先放一下,一会讨论。

 

引用一下网上很流行的例子,我觉得没讲明白,我在用我的想法解释一下。

 

假设在规则记忆中有下列三条规则

 

if A(x) and B(x) and C(y) then add D(x)

if A(x) and B(y) and D(x) then add E(x)

if A(x) and B(x) and E(x) then delete A(x)

 

RETE 算法会先将规则编译成下列的树状架构排序网络

 


而工作记忆内容及顺序为
{A(1) A(2) B(2) B(3) B(4) C(5)} ,当工作记忆依序进入网络后,会依序储存在符合条件的节点中,直到完全符合条件的推论规则推出推论。 以上述例子而言, 最后推得 D(2)

 

让我们来分析这个例子。

 

模板库:(这个例子中只有一个模板,算法原描述中有不同的例子 , 一般我们会用 tuple, 元组的形式来定义 facts,patterns,condition

P: (?A , ?x)  其 中的 A 可能代表一 定的操作,如例子中的 A,B,C,D,E ; x 代表操作的参数。看看这个模板是不是已经可以描述所有的事实。

 

条件库: ( 这里元组的第一项代表实际的操作,第二项代表形参 )

C1: (A , <x>)

C2: (B , <x>)

C3: (C , <y>)

C4: (D , <x>)

C5: (E , <x>)

C6: (B , <y>)

 

事实库:(第二项代表实参)

F1: (A,1)

F2: (A,2)

F3: (B,2)

F4: (B,3)

F5: (B,4)

F6: (C,5)

 

       规则库:

         R1: c1^c2^c3

         R2: c1^c2^c4

         R3: c1^c2^c5

 

      

       有人可能会质疑 R1: c1^c2^c3 ,没有描述出,原式中:

if A(x) and B(x) and C(y) then add D(x) A=B 的关系。但请仔细看一下,这一点已经在条件库中定义出来了。

 

       下面我来描述一下,规则引擎中 RETE 算法的实现。

       首先,我们要定一些规则,根据这些规则,我们的引擎可以编译出一个树状结构,上面的那张图中是一种 简易的表现,其实在实现的时候不是这个样子的。

       这就是 beta-network 出场的时候了,根据 rules 我们就可以确定 beta-network ,下面,我就画出本例中的 beta-network ,为了描述方便,我把 alpha-network 也画出来了。

      

 

 

上图中,左边的部分就是 beta-network, 右边是 alpha-network, 圆圈是 join-node.

从上图中,我们可以验证,在 beta-network 中,表现出了 rules 的内容,其中 r1,r2,r3 共享了许多 BM join-node, 这是由于这些规则中有共同的部分,这样能加快 match 的速度。

右边的 alpha-network 是根据事实库构建的,其中除 alpha-network 节点的节点都是根据每一条 condition, 从事实库中 match 过来的,这一过程是静态的,即在编译构建网络的过程中已经建立的。只要事实库是稳定的,即没有大幅 度的变化, RETE 算 法的执行效率应该是非常高的,其原因就是已经通过静态的编译,构建了 alpha-network 。我们可以验证一下,满足 c1 的事实确实是 w1,w2

下面我们就看一下,这个算法是怎么来运行的,即怎么来确定被激活的 rules 的。从 top-node 往下遍历,到一个 join-node, AM for c1 的节点汇合,运行到 match c1 节点。此时, match c1 节点的内容就是: w1,w2 。继续往下,与 AM for c2 汇合(所有可能的组合应 该是 w1^w3,w1^w4,w1^w5,w2^w3,w2^w4,w2^w5 ),因为 c1^c2 要求参数相同,因此, match c1^c2 的内容是: w2^w3 。再继续,这里有一个扇出( fan-out ),其中只有一个 join-node 可以被激活,因为旁边的 AM 只有一个非空。因此,也只有 R1 被激活了。

解决扇出带来的效率降低的问题,我们可以使用 hashtable 来解决这个问题。

RETE 算法还有一些问题,如: facts 库变化,我们怎么才能高效的重建 alpha-network ,同理包括 rules 的变化对 beta-network 的影响。这一部分我还没细看,到时候再贴出来吧。

分享到:
评论

相关推荐

    行业分类-设备装置-一种结合Rete算法的RDF数据分布式并行推理方法.zip

    Rete算法是一种用于快速匹配模式的算法,常用于规则引擎和专家系统,而RDF(Resource Description Framework)是描述和链接网络资源的数据模型,广泛应用于语义网和Linked Data。分布式并行推理方法则是指在多节点或...

    Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem*中文

    - **支持大规模数据集**:即使是处理成千上万的对象和模式,Rete算法也能保持良好的性能表现。 #### 六、结论 Rete算法是产生式规则系统中一个重要的突破,特别是在处理大规模数据集时表现出了极高的效率。通过对...

    PyPI 官网下载 | py_rete-0.0.7.dev5.tar.gz

    `py_rete`可能是一个基于Python实现的Rete算法的库,Rete算法是一种高效的规则引擎实现方式,常用于专家系统和业务规则管理系统。 描述中的"资源来自pypi官网。资源全名:py_rete-0.0.7.dev5.tar.gz"表明这个压缩...

    drools-规则语言

    - **Rete算法的核心思想**:Rete算法的核心在于构建一个匹配树结构,用于存储规则中的模式。当新的事实被加入到系统中时,这些事实会沿着匹配树向下传播,以确定哪些规则需要被触发。这种方法可以极大地减少计算量,...

    RETE网络的数据结构及动态匹配过程.pdf

    RETE算法是OPS5语言中用于执行模式匹配和推理的核心算法。OPS5是一种人工智能编程语言,主要用于专家系统的构建,它通过一系列的产生式规则(if-then规则)来表达知识并进行推理。OPS5通过RETE网络来处理复杂的模式...

    java源码编辑-drools:Drools是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声

    java 源码编辑 虫洞 · 技术栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 作者: 小傅哥,Java Developer, 本文档是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个较清晰详细...

    Drools4中文使用手册

    Drools是一个Java语言版本的基于Charles Forgy's Rete算法研究的规则引擎实现。结合Rete到一个面向对象接口中,允许业务对象处理业务表达式。Drools由Java语言开发,但是可以运行在Java环境和.NET环境下。 Drools被...

    Drools规则引擎介绍

    Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete算法;提供了强大的EclipsePlugin开发支持;通过使用其中的DSL(DomainSpecificLanguage),可以实现用自然语言方式来描述业务规则,使得业务分析人员也...

    Drools引擎的研究与应用

    其中,Rete算法是最常用的一种算法,它通过构建一个高效的网络结构来实现快速匹配。Rete算法通过预先构建好的网络来减少重复计算,从而大幅提高了匹配速度。尽管Leaps算法是一种实验性质的算法,但其设计理念旨在...

    drools-7.10中文(浏览器翻译文档)

    Rete是一种高效匹配算法,专门用于规则引擎,能够高效地处理复杂条件语句,而ReteOO是Rete算法的面向对象版本,PHREAK是Rete算法的进一步优化。 5. **用户指南**:这部分是Drools的实际使用手册,包括了如何使用...

    JBoss_Drools教程

    Rete 算法是一种高效的模式匹配算法,用于匹配事实(Facts)和规则。它通过构建 RETE 网络来加速规则的评估,当新的事实被插入到 Working Memory 中时,算法能够迅速找到匹配的规则并执行相应的动作。 **Drools ...

    通过自动云分析更有效地利用环境传感器数据.docx

    文章提到了Rete算法,这是一种在20世纪70年代末发展起来的模式匹配机制,特别适合处理大量模式数据与数据库的比较,避免数据迭代,提高处理速度。UrsaLeo公司的云分析软件就是利用这种算法,结合Silicon Labs的...

    Drools开发最全中文版技术指南

    Drools在JBoss应用服务器中作为规则引擎存在,并且是专门为Java语言定制的,基于CharlesForgy的RETE算法的实现。 RETE算法是专家系统领域内用于推理的一种高效算法,它能够高效地处理具有大量规则的系统。Drools...

    Drools规则引擎Drools规则引擎

    Drools是Jboss公司旗下一款开源的规则引擎,它完整的实现了Rete 算法;提供了强大的Eclipse Plugin开发支持; 通过使用其中的DSL(Domain Specific Language),可以实现用自然语言方式来描述业务规则,使得业务分析...

Global site tag (gtag.js) - Google Analytics