`
zhb8015
  • 浏览: 390762 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Spring Roo杂谈
浏览量:0
社区版块
存档分类
最新评论

rete算法(drools 转)

阅读更多

rete算法简介  

        原文连接      

Rete算法是Charles Forgy在1979年的论文中首次提出的,针对基于规则知识表现的模式匹配算法。目前来说,大部分规则引擎还是基于rete算法作为核心,但都有所改 进,比如drool,jess等等,下面介绍rete算法的概念,一些术语,以及使用规则引擎需要注意的问题。

先来看看如下的表达式:

     (name-of-this-production
        LHS /* one or more conditions */
       -->
        RHS /* one or more actions */
       )

 

    name-of-this-production就是规则,LHS(left hand side)一系列条件,RHS(right hand side)这个是我们满足条件后应该执行的动作。

    

     

 

     

 

 

   结合该图介绍几个概念:

    production memory(PM)是由所有的production形成。

    working memory(WM)由外界输入根据匹配算法形成的,反映了运行中的规则引擎的状态,记录各种数据, WM中每一个item称为working memory element(WME) ,由外界的输入产生。

     agenda负责匹配,冲突解决,执行动作。

   

    rete是网络的意思(拉丁语),它将所有的规则最终解释(或编译)生成一个识别网络,其中包括了alpha网络,beta网络。alpha网络是根据 LHS生成的网络,它根据外界的输入快速识别是否存在condition成立,并且跟其beta网络交互更新整个网络的状态,如下图:

 

 

     

    最基本的alpha网络就如上图所示,类似于这样,所有的condition被parse到这样的网络,当外界输入wme时,该wme会进入这样一个网络 进行辨识,如果到达最底端,证明一个condition成立了,当然,如图这个网络算是最简单的实现了,实际规则引擎需要提供更快速的算法去辨识输入的 wme,比如将图中color的各种值存入hashtable,或者是jumptable,又或者是trie tree。整个alpha network是一个巨大的字符串匹配和过滤网络,需要将各种数据结构组合在一起去实现海量condition情况下的快速匹配。各种规则引擎的实现又是 不一致的,比如jess,如下图:

 

    (defrule done
       (TESTING)
       (number ?number)
       (TEST IS DONE)
      (INIT CREDIT 5)
      (CUSTOMER AGE ?age)
       (has ?type "PP"))
=>
      (assert (TEST COMPLETED)))

 

     


这 个production的解释后生成的网络,这里我们先注意红色的节点,这些节点就是alpha网络的节点,这个图只是描述了大致的过程,以第一列为例, 第一个红色node表示输入是否匹配TESTING这个字符串,第二个node匹配在TESTING后面的参数数量(slot)是否匹配0,如果我们 assert TESTING进入WM,那么这个fact是可以匹配到done这个rule的第一个condition的,其他可以依次类推,值得注意的是最后一个 condition,has是我们自定义的function,类似这样的function,jess没有单独生成一列,只是将它作为CUSTOMER AGE ?age这一列的最后一个node,这样的condition有个特点就是需要执行一段代码去判断某个事实是否成立(不仅仅只是做字符串的操作),这段代 码不仅仅是字符串的匹配,同时还具有实时性,类似这样的condition开发中需要注意,因为alpha network在运行期会不止一次去执行这个condition是否成立,这个是匹配算法的特性决定,所以,我们需要用cache或者规则语言的特性去避 免不必要的执行code以提高性能。

下面贴个比较复杂的例子:

   

  


   图太大,一个截不下来。。。。。。

   下面我们结合两个例子说说beta网络,当alpha网络过滤后condition成立,WME被传递到beta网络时,绿色的node就要发挥作用了, 这个node就是join node,它有两个input,一个join node ,一个alpha node(红色),join node是由多个WME组成的,对于初始的join node 我们称为left input adapter 如图中黄色的node,该node是空的,那么第一个把这个node作为left input的join node就只包含了一个WME,下一个join node则包含了两个WME,以此类推。图中天蓝色的node上方的join node 完全匹配了production执行需要的condition,所以这个rule就被激活等待执行了。

 

    假设我们需要编辑业务逻辑,那么最好的描述载体就是流程图,简单的流程图包含以下一些基本单元:起始节点,逻辑判断,执行动作,结束节点。这些节点可以完 成最简单的业务逻辑描述,那么我们把这些流程parse到规则的时候,我们会怎么去做,第一个逻辑判断单元返回true,于是我们执行某个动作,第二,三 个逻辑判断单元返回true我们执行某个动作,相当于会parse到两个规则,符合condition1,production1触发,符合 condition2,3,production2触发,有了beta网络,我们在触发production2时只需要判断condition2,3是否 成立,对于更复杂的情况,beta网络提高了速度,避免了重复匹配。

   

    开发中使用规则引擎也遇到些问题,总结如下:

    1)规则引擎中对于特殊condition的处理,由于condition会在部分production中重复出现,所以会造成condition的重复匹配问题,影响了程序的性能,这个要结合项目去优化rule脚本的parse或者使用cache去提升性能。

    2)内存消耗问题,rete算法是空间换时间,所以对于内存的消耗是比较大的,特别是加载rule的时候(生成网络),在运行期内存会缓慢增长,所以gc效率需要注意,同时单个服务器所能承受的压力(多个WM)也跟规则引擎息息相关。

    3)测试,对于使用规则去表达业务的系统,如何测试是必须解决的问题,对于这个问题,也只能保证基本的流程分支覆盖测试,对于复杂情况下的defect很 难发现,不过有些原则需要注意,如果要使用规则引擎,我们必须完全以规则引擎为核心,对于业务逻辑必须尽可能的抽取到规则引擎去实现,对于扩展实现的 function粒度必须小且简单,不要再代码中去实现业务逻辑。

    4)大部分的condition需要是不变的,也就是说基本信息需要保持稳定不变。比如某客户公司上属集团信用额度大于100w这样的condition,这个额度变化的频度不会很高,不需要去实时匹配。

    5),remove WME production是较复杂的操作,规则较复杂时,应该尽量少去做这样的操作。

  • 大小: 25.1 KB
  • 大小: 76.5 KB
  • 大小: 9.6 KB
  • 大小: 87.4 KB
分享到:
评论

相关推荐

    drools-rete算法简介.docx

    Drools-Rete 算法简介 Drools-Rete 算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关。Rete 算法通过形成一个 Rete 网络进行模式匹配,利用基于规则的系统的两个特征,即时间冗余性(Temporal redundancy...

    Rete 算法PPT

    Rete算法,作为高效模式匹配的核心技术,在IT领域尤其是规则引擎设计中占据着举足轻重的地位。本文将深入解析Rete算法的关键概念、工作原理及其在现代规则引擎中的应用。 ### Rete算法概述 Rete算法是一种公开领域...

    Rete算法的应用研究

    《Rete算法在故障诊断系统中的应用研究》 在信息技术高速发展的今天,复杂系统的故障诊断已成为保障设备稳定运行的关键。本文主要探讨了如何利用Rete算法优化专家系统,特别是基于规则的专家系统中的模式匹配效率,...

    drools-规则语言

    3. **快速的执行速度**:得益于Rete算法,Drools能够以非常快的速度执行规则。 4. **在Java开发者中的流行度**:由于其与Java的高度兼容性,Drools在Java开发者群体中非常受欢迎。 5. **与Java Rule Engine API (JSR...

    Drools手册译.pdf

    Drools采用了Rete算法,这是一种高效地处理模式匹配的算法,还有实验性的Leaps算法。Rete算法经过优化,特别是在面向对象系统中的表现,如Drools的ReteOO。需要注意的是,不同实现可能对Rete有各自的改进,但它们...

    drools 7.1中文文档pdf完整版本

    PHREAK算法是Drools中对Rete算法的进一步优化。这些算法都是为了提高规则引擎的性能,特别是当处理大量规则和数据时。 Drools提供了用户指南,引导用户如何从基础开始使用该规则引擎,包括执行控制、推理、使用逻辑...

    JBoss_Drools教程

    Drools 使用 Rete 算法作为其核心匹配引擎。Rete 算法是一种高效的模式匹配算法,用于匹配事实(Facts)和规则。它通过构建 RETE 网络来加速规则的评估,当新的事实被插入到 Working Memory 中时,算法能够迅速找到...

    Drools4中文使用手册

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

    5.6drools基础包

    Drools引擎采用rete算法来高效地处理大量的规则。 2. **Drools工作记忆(Working Memory)**: 工作记忆是Drools处理数据的地方,它可以看作是一个事实容器。用户可以向工作记忆中添加、修改或删除事实,引擎会根据...

    drools-7.10中文技术文档.pdf

    drools 最新文档 7.10 规则引擎中文文档,含 规则可视化操作说明,规则配置说明等;... Drools 实现和提供了 Rete 算法;也曾提供 Leaps,但因为它无人维护而撒销了。Drools Rete 实现也被称为 ReteOO

    Drools规则引擎介绍

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

    Drools应用.doc

    Drools,也被称为 JBoss Rules,是Red Hat公司下的一个开源项目,它是专为Java平台设计的、基于RETE算法的产生式规则引擎。Drools提供了一套完整的框架,包括规则定义、规则存储、规则执行以及规则生命周期管理等...

    drools6学习例子

    它的核心是基于Rete算法,这是一种用于推理和知识表示的高效算法,特别适合处理大量规则的场景。 2. **Drools 6的新特性** - **kie-ci**:Drools 6 引入了kie-ci(Continuous Integration)模块,支持Maven、...

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

    4. **混合推理**:Drools支持混合推理模型,整合了人工智能的多范式,包括Rete算法、ReteOO算法和PHREAK算法等。Rete是一种高效匹配算法,专门用于规则引擎,能够高效地处理复杂条件语句,而ReteOO是Rete算法的面向...

    Drools5规则引擎学习研究

    学习Drools不仅涉及语法和API的使用,还需要理解Rete算法的工作原理。Rete算法是一种高效的模式匹配方法,用于在大量模式和对象之间查找匹配。它分为规则编辑和运行时执行两部分,能够有效地减少计算复杂性。 总的...

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

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

Global site tag (gtag.js) - Google Analytics