`
hxpwork
  • 浏览: 111345 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

drools:顺序的Rete算法

阅读更多
 

顺序的Rete算法 <o:p></o:p>

作者: Mark Proctor <o:p></o:p>

无状态和有状态Session

使用Rete,你有一个有状态的Session,在那里对象可以随时被设置或修改,规则也可以随时被增加和删除。现在我们假设一个无状态Session会发生什么样的情况呢?在完成了初始数据集后,没有更多的数据可以被设置或修改(没有规则的重新评估),并且没有规则可以在被增加或删除。这意味着我们可以认为引擎在这种情况下所处理的工作量是最小的。<o:p></o:p>


算法<o:p></o:p>

  1. 使用salience和在规则集中的位置(只要仔规则终节点上设置一个sequence属性就可以)排序规则<o:p></o:p>
  2. 建立一个数组,每一个可能的激活规则对应一个数组元素,元素的位置象征着激发的顺序<o:p></o:p>
  3. 关掉除了右输入对象内存之外的所有节点内存<o:p></o:p>
  4. 切断LeftInputAdapterNode的传播,并且在一个Command对象中有这个对象(LeftInputAdapterNode)和节点的索引,Command对象被加入WorkingMemory的列表中随后执行。<o:p></o:p>
  5. 设置所有的对象,当完成断言后右输入节点内存检查Command列表并且按照顺序执行<o:p></o:p>
  6. 所有激活结果应当被放置在数组中,按照规则的Sequence编号所决定的顺序。记录第一个和最后一个元素的位置,以减少遍历范围。<o:p></o:p>
  7. 遍历激活规则的数组,按顺序执行元素<o:p></o:p>
  8. 如果我们有一个允许执行规则的最大数,就能够尽早的退出网络评估而去激发数组中的规则<o:p></o:p>

LeftInputAdapterNode不再去建立组元,增加对象然后传播这个组元,代替的是一个Command对象被建立并且增加到Working Memory内的一个列表中。这个Command对象保存了一个指向LeftInputAdapterNode的引用和要传播的对象。这在设置时停止了任何左输入的传播,因此我们知道一个右输入传播不再需要尝试与左输入进行合作(因为删除了左输入内存)。所有的节点内存被关闭,包括左输入组元内存,除了右输入对象内存——也就是说能够记住断言传播路径的节点只有右输入对象内存。一旦所有的断言完成并且所有的右输入内存配置完毕,我们就能遍历LeftInputAdatperNode Command对象列表,并按顺序调用;它们将通过网络向下传播,并尝试与右输入对象合作;而不需要再保存在左输入中,因为我们知道没有对象会再被设置并传播到右输入内存。<o:p></o:p>


Agenda
不再存在,不再用一个优先队列来组织这些组元,而是代替以一个规则数量长度的数组。RuleTerminalNodesequence数值代表激活规则在数组中的位置。一旦所有Command对象准备完成,就可以遍历数组,依次检查每个元素并激发存在的规则。为了增加数组处理性能,我们记录最初和最后的单元位置。<o:p></o:p>

<o:p> </o:p>

构造的网络中,每一个RuleTerminalNode被赋予了一个sequence数值,基于salience数值与它被加入到网络中的顺序。

数据结构

<o:p></o:p>

右输入节点内存的典型结构是HashMap,为了更快的回收对象(我们知道事实上没有对象要回收),在对象的值没有索引时,我们可以使用列表。对于存在大量的对象情况,索引的HashMap提供性能的提升,如果我们已知对象只有很少的实例,那么对象列表的性能可能比HashMap索引要更好。<o:p></o:p>


上面所提到的内容在JBoss Drools4.0中实现,接下来的内容是对未来的一些想法,在目前它仍然是含糊不清的。<o:p></o:p>


如果存在海量的规则,那么一个被分页索引的直接地址表可以用来取代保存结果激活规则的数组。在这里我们建立数组的分页,对拥有常规指针的页面,我们建立更深层的索引指针指向页面。页面可以显示是否它其中的任一元素被填充或没有填充,允许我们忽略这些元素的遍历。<o:p></o:p>


压缩节点,代码产生和节点排序

<o:p></o:p>

有状态Rete可以新增或删除节点,为了最大化节点共享,我们趋向于每一个字符串约束有一个AlphaNode。无论怎样我们知道已经没有更多的规则加入时,我们可以压缩共享的节点到一个单独的评估中。如果我们有3个连续的AlphaNodeA,BCAB是共享的,C不是。我们可以压缩AB到一个单独的节点,并且产生代码来完成多个评估。节点排序可以让共享节点最大化。那里可能也会有一些beta node的级别可以进行压缩,但是我还没有更仔细的考虑它。<o:p></o:p>


使用多线程<o:p></o:p>


在通常的Rete中使用多线程是困难的,因为你不会知道是否一个组元将要进入左输入,或者一个对象将要进入右输入——也就是说读和写可以同时进行,为此而增加锁定控制的花费是昂贵的,并且过去的研究表明,这样的花费要超过使用不需要锁定的单线程方法。但是在顺序方法中,我们知道写必然与读在不同的时间发生。所有写操作在对象最初被传播到右输入节点期间发生。所有读操作当组元从LeftInputAdapterNode传播过来时发生。我们可以利用这点来为每一个阶段执行并发的线程,使用并发的集合结构。我们只能处理两个阶段的同步,也就是说知道何时所有对象传播完成以及何时组元传播完成。以同步的方式执行规则是有点困难的,因为我们不容易知道用户对规则顺序的排列意图。一个属性可以用来执行可以同步执行的规则组,这些规则和分组必须按照时间顺序排列。也就是说如果组A在组B之前激发,那么所有组A的规则必须一开始指定好。或者这些组的执行顺序可以单独指定,这样允许规则可以有更多的灵活性。<o:p></o:p>

评论: <o:p></o:p>

Mark Proctor ... <o:p></o:p>

相比于我们标准的Rete算法,顺序Rete算法带来了30%-350%的性能提升,依赖于规则和数据的复杂度以及数量。节点压缩也能推进性能的提升。在某一个发布版本中我们会为引擎增加一个激发限制,用一个整数值指明允许执行规则的数量,这样我们可以更早的退出网络评估的时间——因此用户可以指定是否当前的规则集的结果是激发13或者10个规则。<o:p></o:p>

7/06/2007 2:42 PM   <o:p></o:p>

<o:p> </o:p>

Mark Proctor ... <o:p></o:p>

此时我们发现最好的情况是对于有许多fact(如5万)的情况,这种情况下带来350%的效率提升。少量fact大量规则的情况下提升的效率比较少,但也比标准算法高30%以上。对于这种情况,可能节点压缩和更多的代码产生能够有所帮助。<o:p></o:p>

7/06/2007 5:17 PM   <o:p></o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    Rete 算法PPT

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

    Drools:该存储库是关于Drools Rules Engine的

    - **rete算法**:Drools采用rete算法,这是一种优化的事实匹配算法,能够快速地处理大量的事实和规则。 2. **Drools的架构** - **KieSession**:这是与Drools交互的主要接口,负责加载规则、插入事实、触发规则...

    Drools手册译.pdf

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

    Drools的进一步研究

    - **Rete 网络**:Drools采用Rete算法作为其核心匹配机制,它是一种高效的记忆化网络,能快速识别并更新与规则匹配的事实。 - **前向推理过程**:Rete算法通过网络结构动态地与事实对象进行匹配,当新的事实加入或...

    Drools5规则引擎开发教程.rar

    5. **rete算法**:Drools5使用Rete算法来高效地匹配规则,该算法减少了规则匹配的复杂度,提高了性能。 6. **规则流**:对于需要按特定顺序执行的规则,可以使用规则流(RuleFlow)来定义执行顺序。 7. **知识会话...

    Drools规则引擎介绍

    Drools不仅仅处理单个规则的执行,还可以通过规则流(Drools Flow)来实现更复杂的流程控制,例如顺序执行、分支、循环等,使得规则可以按照特定的业务流程顺序执行。 6. **测试和调试**: Drools提供了一个名为...

    Drools-复杂事件处理

    Drools是JBOSS的一个开源项目,它提供了基于规则的业务逻辑执行框架,支持Rete算法,能够高效处理大量规则。Drools不仅适用于传统业务规则管理,还能在实时和复杂事件处理(Complex Event Processing, CEP)领域...

    Drools规则引擎开发实例+源码

    6. **rete算法**:Drools使用Rete算法进行规则匹配,这是一种高效的算法,能有效处理大量的事实和规则,避免了全量匹配的性能问题。 7. **事件处理(Event Processing)**:Drools支持复杂事件处理(CEP),可以...

    Drools5源码粗略研究

    - S1: 使用匹配算法(如Rete算法)将事实与规则进行匹配,如果事实满足规则条件,则将匹配结果存入冲突集。 - S2: 重复S1步骤直至所有事实与规则完成匹配。 - S3: 执行冲突集中的规则。 #### 二、Drools5介绍 1...

    Drools代码例子

    1. **Drools规则引擎**:Drools引擎是基于rete算法的,该算法允许快速匹配和更新大量事实。引擎由几个关键组件构成,包括规则库、工作内存、事件处理器等。规则库存储所有规则,工作内存则存放运行时的数据对象,...

    JBoss Drools培训.pptx

    Rete算法是Drools等规则引擎的核心,它是一种高效的模式匹配算法,用于快速匹配事实(Facts)和规则。Rete网络由不同类型的节点构成,如JoinNode和Agenda,当事实被插入Working Memory时,Rete网络会自动检测匹配的...

    规则引擎drools实例

    Drools 引擎内部采用rete算法,能快速匹配大量规则,提高处理效率。 3. **Drools 工作流程**:首先,开发者使用Drools提供的DSL编写规则,然后将规则加载到规则引擎中。接着,通过Facts(事实)对象将业务数据输入...

    Drools学习资料

    - **rete算法**: Drools采用Rete算法进行规则匹配,这是一种优化的算法,能高效处理大量的规则和事实。 ### 3. Drools工作流程 1. **规则加载**: Drools读取DRL文件,解析规则并加载到规则库。 2. **事实插入**: ...

    drools动态生成规则文件

    Drools是一款开源的规则引擎,它基于Rete算法,能够高效地处理大量的规则。drools提供了灵活的API和规则语言DRL(Drools Rule Language),使得业务规则可以与应用程序代码分离,便于管理和维护。 二、规则文件 ...

    Drools引擎的研究与应用

    Drools采用了两种主要的模式匹配算法:Rete算法和Leaps算法。其中,Rete算法是最常用的一种算法,它通过构建一个高效的网络结构来实现快速匹配。Rete算法通过预先构建好的网络来减少重复计算,从而大幅提高了匹配...

    drools的进一步研究

    4. **Rete算法** - **Rete网络**:是Drools的核心算法,通过建立一种高效的记忆结构,用于快速识别哪些规则与新加入的事实相匹配。 - **前向推理过程**:当新的事实被插入到工作内存时,Rete网络会自下而上地传播...

    drools文档详解

    4. **高效的性能表现**:Drools采用了高效的Rete算法,能够快速准确地匹配事实对象与规则,确保了系统的高性能和可扩展性。 #### 四、Drools的组成部分 Drools主要由以下几个组件构成: 1. **Guvnor**:一个基于...

    Drools5规则引擎开发教程

    4. **规则推理**:探讨Drools的推理机制,如rete算法,它是如何高效地匹配规则和事实的。 5. **规则流与流程控制**:详细说明如何设计和使用规则流,实现复杂的业务流程。 6. **事件处理与复杂事件处理(CEP)**:...

    Drools规则引擎小结

    Drools的核心是基于Rete算法的推理引擎,能够高效地处理大量规则的匹配和执行。 1. **Drools概述** Drools是由JBOSS社区开发的开源项目,属于Red Hat公司的一部分。它提供了全面的规则引擎解决方案,包括规则的...

Global site tag (gtag.js) - Google Analytics