RETE算法

最近面试的时候,经常被问及自己参加的项目中rete算法的原理,但是RETE算法是一个比较复杂的算法,在短时间内不能阐述的足够清晰,在这里做个简单的介绍 。转载请注明来自 http://chillwarmoon.iteye.com
RETE
算法是一个用来实现产生式规则系统的高效模式匹配算法。该算法是由卡内基美隆大学的 Charles L. Forgy 1974 年发表的论文中所阐述的算法。 RETE 算法提供了专家系统的一个高效实现。
规则推理引擎做为产生式系统的一部分,当进行事实的断言时,包含三个阶段:匹配、选择和执行,称做 match-select-act cycle RETE 算法可以对匹配阶段进行高效实现,下面从鉴别网络和模式匹配过程两个方面对该算法进行介绍。

鉴别网络(如下图所示):
RETE 算法在进行模式匹配时,是根据生成的鉴别网络来进行的。网络中非根结点的类型有 1-input 结点(也称为 alpha 结点)和 2-input 结点(也称为 beta 结点)两种。 1-input 结点组成了 Alpha 网络, 2-input 结点组成了 Beta 网络。
每个非根结点都有一个存储区。其中
1-input 结点有 alpha 存储区和一个输入口; 2-input 结点有 left 存储区和 right 存储区和左右两个输入口,其中 left 存储区是 beta 存储区, right 存储区是 alpha 存储区。存储区储存的最小单位是工作存储区元素( Working Memory Element ,简称 WME ), WME 是为事实建立的元素,是用于和非根结点代表的模式进行匹配的元素。 Token WME 的列表,包含有多个 WME ,(在 Forgy 的论文中,把 Token 看成是 WME 的列表或者单个 WME ,为了阐述方便,本文将把 Token 只看成 WME 的列表,该列表可以包含一个 WME 或者多个 WME ),用于 2-input 结点的左侧输入。事实可以做为 2-input 结点的右侧输入,也可以做为 1-input 结点的输入。
每个非根结点都代表着产生式左部的一个模式,从根结点到终结点的路径表示产生式的左部。
rete


规则匹配:
推理引擎在进行模式匹配时,先对事实进行断言,为每一个事实建立 WME ,然后将 WME RETE 鉴别网络的根结点开始匹配,因为 WME 传递到的结点类型不同采取的算法也不同,下面对 alpha 结点和 beta 结点处理 WME 的不同情况分开讨论。

1)如果WME的类型和根节点的后继结点TypeNodealpha结点的一种)所指定的类型相同,则会将该事实保存在该TypeNode结点对应的alpha存储区中,该WME被传到后继结点继续匹配,否则会放弃该WME的后续匹配;

2)如果WME被传递到alpha结点,则会检测WME是否和该结点对应的模式相匹配,若匹配,则会将该事实保存在该alpha结点对应的存储区中,该WME被传递到后继结点继续匹配,否则会放弃该WME的后续匹配;

3)如果WME被传递到beta结点的右端,则会加入到该beta结点的right存储区,并和left存储区中的Token进行匹配(匹配动作根据beta结点的类型进行,例如:joinprojectionselection),匹配成功,则会将该WME加入到Token中,然后将Token传递到下一个结点,否则会放弃该WME的后续匹配;

4)如果Token被传递到beta结点的左端,则会加入到该beta结点的left存储区,并和right存储区中的WME进行匹配(匹配动作根据beta结点的类型进行,例如:joinprojectionselection),匹配成功,则该Token会封装匹配到的WME形成新的Token,传递到下一个结点,否则会放弃该Token的后续匹配;

5)如果WME被传递到beta结点的左端,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照(4)所示的方法进行匹配;

6)如果Token传递到终结点,则和该根结点对应的规则被激活,建立相应的Activation,并存储到Agenda当中,等待激发。

7)如果WME被传递到终结点,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照(6)所示的方法进行匹配;

以上是RETE算法对于不同的结点,来进行WME或者token和结点对应模式的匹配的过程。

你可能感兴趣的:(算法,面试,Blog)