Drools中RETE算法详解

2021-11-10  本文已影响0人  Tiger_Lam

1.相关概念

2.RETE网络节点类型

image.png
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

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

上一篇 下一篇

猜你喜欢

热点阅读