锁定老帖子 主题:drools:顺序的Rete算法
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-20
顺序的Rete算法 <o:p></o:p> 作者: Mark Proctor <o:p></o:p> 无状态和有状态Session
LeftInputAdapterNode不再去建立组元,增加对象然后传播这个组元,代替的是一个Command对象被建立并且增加到Working Memory内的一个列表中。这个Command对象保存了一个指向LeftInputAdapterNode的引用和要传播的对象。这在设置时停止了任何左输入的传播,因此我们知道一个右输入传播不再需要尝试与左输入进行合作(因为删除了左输入内存)。所有的节点内存被关闭,包括左输入组元内存,除了右输入对象内存——也就是说能够记住断言传播路径的节点只有右输入对象内存。一旦所有的断言完成并且所有的右输入内存配置完毕,我们就能遍历LeftInputAdatperNode Command对象列表,并按顺序调用;它们将通过网络向下传播,并尝试与右输入对象合作;而不需要再保存在左输入中,因为我们知道没有对象会再被设置并传播到右输入内存。<o:p></o:p>
<o:p> </o:p> 构造的网络中,每一个RuleTerminalNode被赋予了一个sequence数值,基于salience数值与它被加入到网络中的顺序。 右输入节点内存的典型结构是HashMap,为了更快的回收对象(我们知道事实上没有对象要回收),在对象的值没有索引时,我们可以使用列表。对于存在大量的对象情况,索引的HashMap提供性能的提升,如果我们已知对象只有很少的实例,那么对象列表的性能可能比HashMap索引要更好。<o:p></o:p>
有状态Rete可以新增或删除节点,为了最大化节点共享,我们趋向于每一个字符串约束有一个AlphaNode。无论怎样我们知道已经没有更多的规则加入时,我们可以压缩共享的节点到一个单独的评估中。如果我们有3个连续的AlphaNode:A,B和C。A和B是共享的,C不是。我们可以压缩A和B到一个单独的节点,并且产生代码来完成多个评估。节点排序可以让共享节点最大化。那里可能也会有一些beta node的级别可以进行压缩,但是我还没有更仔细的考虑它。<o:p></o:p>
Mark Proctor 说... <o:p></o:p> 相比于我们标准的Rete算法,顺序Rete算法带来了30%-350%的性能提升,依赖于规则和数据的复杂度以及数量。节点压缩也能推进性能的提升。在某一个发布版本中我们会为引擎增加一个激发限制,用一个整数值指明允许执行规则的数量,这样我们可以更早的退出网络评估的时间——因此用户可以指定是否当前的规则集的结果是激发1,3或者10个规则。<o:p></o:p> 7/06/2007 2:42 PM <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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 3431 次