美文网首页
Drools中RETE算法详解

Drools中RETE算法详解

作者: Tiger_Lam | 来源:发表于2021-11-10 16:34 被阅读0次

1.相关概念

  • Fact(事实):对象之间及对象属性之间的关系
  • Rule(规则):是由条件和结论构成的推理语句,一般表示为if…Then。一个规则的if部分称为LHS(left-hand-side),then部分称为RHS(right hand side)。
  • Module(模式):就是指IF语句的条件。这里IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。

2.RETE网络节点类型

image.png
  • Root Node:所有对象进入网络的入口,在一个网络中只有一个根节点。借用Rete算法经典的示例:

  • 1-input node:可分为ObjectTypeNode, AlphaNode, LeftInputAdapterNode等。

Object Type Node:事实从根节点进入Rete网络后,会立即进入Object Type Node节点。Object Type Node提供了按对象类型过滤对象的能力,通过此类节点可使规则引擎不做额外的工作。Cheese类型的事实进入网络后,只需经过类型为Cheese的Object Type Node之后的节点。如下图
image.png
Alpha Node:Alpha 节点是规则的条件部分的一个模式。通常用于评估字面的条件。如下图,两个Alpha Node 分别评估了Cheese事实的name和strength属性。
image.png
  • 2-input node(Beta Node): 拥有两个输入的节点。Beta Node 节点用于比较两个对象。两个对象可能是相同或不同的类型。Beta Node主要包含Join Node 和 Not Node两种类型。
    Join Node:用作连接(join)操作的节点,相当于数据库的表连接操作。
    NotNode:根据右边输入对左边输入的对象数组进行过滤,两个 NotNode 可以完成‘ exists ’检查。
  • Terminal Node:到达一个终端节点,表示单条规则匹配了所有的条件,网络中有多个终端节点。当单条规则中有or时,也会产生多个终端节点。

3.完整示例

  • 规则文件
rule1
when
Cheese($cheddar : name == "cheddar" )
$person : Person( favouriteCheese == $cheddar )
then
System.out.println($person.getName() + " likes cheddar" );
end
rule2
when
Cheese( $cheddar : name == "cheddar" )
$person : Person( favouriteCheese != $cheddar )
then
System.out.println($person.getName() + " does not like cheddar" );
end
Rete网络:
image.png

从图上可以看到,编译后的RETE网络中,AlphaNode是共享的,而BetaNode不是共享的。两条规则的BetaNode的不同。然后这两条规则有各自的Terminal Node。

为何RETE算法效率高

RETE算法优于普通代码逻辑

如:Segment,Hotel,ReservedLounge类型的产品分别有10个。按照一般的程序处理逻辑,我们要写三个For循环去处理三类产品的打包操作,计算次数为三类产品数目的笛卡尔积级别的,即:101010 =1000。

而RETE算法采用空间换时间的策略,将中间的计算结果缓存下来(Alpha Memory,Beta Memory)。计算次数为10+10+10(Alpha节点计算次数)加上2次join/projection操作(Beta节点计算次数)。基于内存中的数据做join/projection/selection操作效率很高。

RETE算法的缺点

RETE算法使用了存储区存储已计算的中间结果,以空间换取时间,从而加快系统的速度。然而存储区根据规则的条件于事实的数目成指数级增长,极端情况下会耗尽系统资源。

相关文章

  • Drools中RETE算法详解

    1.相关概念 Fact(事实):对象之间及对象属性之间的关系 Rule(规则):是由条件和结论构成的推理语句,一般...

  • 2.Rete

    Drools使用了Rete算法,Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关。Rete是拉丁文...

  • Drools介绍与使用

    Drools 是用 Java 语言编写的开放源码规则引擎,使用 Rete 算法对所编写的规则求值。Drools 允...

  • drools 入门(五) - RETE算法

    1. RETE 算法 RETE 算法是一种高效的模式匹配算法,用来实现产生式规则系统 它是高效的算法,通过缓存避免...

  • 高性能,易用的规则引擎

    规则引擎很多人都听过,实现方案有很多: 1、用开源的方案 drools 基于 RETE 决策算法 2、基于groo...

  • Drools详解

    Drools规则引擎的结构示意图 Drools相关概念 事实(Fact):对象之间及对象属性之间的关系 规则(ru...

  • RETE算法简述 & 实践

    1. 概述 Rete 算法是卡内基梅隆大学的 Charles L.Forgy 博士在 1974 年发表的论文中所阐...

  • HashMap中为什么数组的长度为2的幂次方

    Java中HashCode算法详解 Java中的集合,比如HashMap/HashSet/HashTable在实现...

  • 异步社区本周预售新书

    《算法详解(卷1)——算法基础》 Tim Roughgarden著 算法详解系列图书共有4卷,本书是第一卷——基础...

  • (转)KMP

    (原创)详解KMP算法

网友评论

      本文标题:Drools中RETE算法详解

      本文链接:https://www.haomeiwen.com/subject/nxcizltx.html