首页 > 编程知识 正文

soul匹配度算法,数据结构模式匹配算法

时间:2023-05-05 18:22:17 阅读:16379 作者:3249

最近正在学习与Rete算法相关的Drools规则引擎框架。 对Rete算法做了一些研究。 否则,在找新工作面试时,能做一个Drools规则引擎框架吗? 你说你能行! 然后面试官问你,你知道Rete算法吗? 你说你听说过。 然后面试官问你,你知道Rete算法的原理吗? 可以实现Rete算法吗?

追问了这么多,你可能答不上来。 面试官最喜欢的是一直追着问,直到回答不出来。 在追问的过程中,我会了解你的技术能力和学习能力。 蚂蚁面试官就是这种类型,会追问到底。

为了找份好工作,拿比同事高的工资,不仅要能用,还需要原理和实现。 在此基础上,本文详细介绍Rete算法。

RETE算法综述RETE算法是前向规则的快速匹配算法,匹配速度与规则数无关。 Rete是拉丁语,支持英语的是net,也就是网络。 Rete算法形成Rete网络进行模式匹配,利用基于规则的系统的两个特征:时间冗馀和结构相似性

单词“‘rete”来自拉丁语网络一词,发音为ri tiorree-tee。

RETE算法是一种用于生成系统的高效模式匹配算法。 在一个生成系统中,处理的数据被称为工作内存,用于判定的规则分为两个部分lhs (左手边)和RHS (右手边),分别给出前提和结论。

RETE算法的主要流程RETE算法的主要流程可分为以下几个步骤:

match :找到符合lhs部分的工作内存集合配置解决方案:选择符合条件的规则Act :执行RHS内容返回第一个RETE算法主要改进match的处理过程,使网络

RETE算法详细介绍了RETE网络主要分为alpha网络和beta网络两部分。 如下图所示(照片引用自其他网站。

alpha网络:过滤工作内存,为规则中的每个模式找到匹配的集合,生成alpha memory (满足该模式的集合)。 有两种类型的节点可以过滤type,也可以在其他条件下过滤。 贝塔网络:有两种节点:贝塔内存和连接节点。 前者主要记忆Join完成后的集合。 后者包含两个输入端口,分别输入需要匹配的两个集合,连接节点进行合并工作后转发到下一个节点。 匹配过程描述了导入到facts集合中需要处理的事实。 如果facts不为空,请选择fact进行处理。 否则就停止匹配过程。 选择并运行alpha网络的第一个节点,通过该节点进入alpha网络的下一个节点,进入alpha memory。 否则,跳转到下一个判断路径,将alpha映射的结果添加到beta map中,如果不是Terminal节点,则检测另一个输入集合是否存在满足条件的事实,如果满足,则执行join,前进到下一个beta map,重复3 如果另一个输入集合中没有满足条件的事实,则返回2。 如果节点是终端节点,请运行ACT将其添加到facts中。 再来看看另一个匹配例子。

规则的内容如下。

IF :

年级在三年级以上,

性别是男性,

年龄不到10岁,

身体结实,

身高170cm以上,

THEN :这个男孩是篮球苗,需要培养

规则的编译网络和匹配过程

匹配过程:

(1)、匹配过程中网络节点上的事实流向顺序为: abcdefghI )规则匹配通过

) 2、从工作内存中取出匹配的StudentFact对象,进入根节点进行匹配。 以下是各节点的fact的活动图

a节点:将StudentFact的年级值用于年级匹配,如果年级符合条件,将对该StudentFact的引用记录在a节点的alpha内存区域,结束年级匹配。

b节点:以StudentFact的性别内容进行性别匹配,如果性别满足条件,将该StudentFact的引用记录在b节点的alpha内存区域,然后找到b节点左引用的beta节点,即c节点。

c节点: c节点找到自己的左侧引用(即a节点),并检查a节点的alpha内存区域是否包含StudentFact引用。 如果已存储,则表示同时满足年级和性别条件,在c节点的beta内存区域存储StudentFact引用,并结束性别匹配。

d节点:取StudentFact的年龄值进行年龄条件匹配,如果年龄满足条件,将该StudentFact的引用记录在d节点alpha的内存区域中,然后找到d节点左引用的beta节点,即e节点。

e节点: e节点找到自己的左引用,即c节点,检查c节点的beta内存区域是否存储了StudentFact的引用,如果存储了,则表示满足年级、性别、年龄三个条件,e节点的beta内存区域存储stant fact

F节点:拿StudentFact的身体数值进行身体条件匹配,如果身体条件符合,则把该StudentFact的引用记录到D(是否有问题应为F?)节点的alpha的内存区中,然后找到F节点的左引用的Beta节点,也就是G节点。

G节点:G节点找到自己的左引用也就是E节点,看看E节点的Beta内存区中是否存放了StudentFact的引用,如果存放,说明年级,性别,年龄,身体四个条件符合,则在G节点的Beta内存区中存放StudentFact的引用,退出身体匹配

H节点:拿StudentFact的身高数值进行身高条件匹配,如果身高条件符合,则把该StudentFact的引用记录到H节点的alpha的内存区中,然后找到H节点的左引用的Beta节点,也就是I节点。

I节点:I节点找到自己的左引用也就是G节点,看看G节点的Beta内存区中是否存放了StudentFact的引用,如果存放了,说明年级,性别,年龄,身体,身高五个条件都符合,则在I节点的Beta内存区中存放StudentFact引用。同时说明该StudentFact对象匹配了该规则,形成一个议程,加入到冲突区,执行该条件的结果部分:该学生是一个篮球苗子。

 相关概念
1  事实(fact):
事实:对象之间及对象属性之间的多元关系。为简单起见,事实用一个三元组来表示:(identifier ^attribute  value),例如如下事实:
w1:(B1  ^ on B2)     w6:(B2  ^color blue)
w2:(B1  ^ on B3)     w7:(B3  ^left-of B4)
w3:(B1  ^ color red)   w8:(B3  ^on table)
w4:(B2  ^on table)    w9:(B3  ^color red)
w5:(B2  ^left-of B3)
2  规则(rule):
由条件和结论构成的推理语句,当存在事实满足条件时,相应结论被激活。一条规则的一般形式如下:
(name-of-this-production
LHS /*one or more conditions*/
–>
RHS /*one or more actions*/
)
其中LHS为条件部分,RHS为结论部分。
下面为一条规则的例子:
(find-stack-of-two-blocks-to-the-left-of-a-red-block
(^on)
(^left-of)
(^color red)
–>
…RHS…
)
3  模式(patten):
模式:规则的IF部分,已知事实的泛化形式,未实例化的多元关系。
(^on)
(^left-of)
(^color red)
 模式匹配的一般算法
规则主要由两部分组成:条件和结论,条件部分也称为左端(记为LHS, left-hand side),结论部分也称为右端(记为RHS, right-hand side)。为分析方便,假设系统中有N条规则,每个规则的条件部分平均有P个模式,工作内存中有M个事实,事实可以理解为需要处理的数据对象。
规则匹配,就是对每一个规则r, 判断当前的事实o是否使LHS(r)=True,如果是,就把规则r的实例r(o)加到冲突集当中。所谓规则r的实例就是用数据对象o的值代替规则r的相应参数,即绑定了数据对象o的规则r。
规则匹配的一般算法:
1) 从N条规则中取出一条r;
2) 从M个事实中取出P个事实的一个组合c;
3) 用c测试LHS(r),如果LHS(r(c))=True,将RHS(r(c))加入冲突集中;
4) 取出下一个组合c,goto 3;
5) 取出下一条规则r,goto 2;
RETE算法
Rete算法的编译结果是规则集对应的Rete网络,如下图。Rete网络是一个事实可以在其中流动的图。Rete网络的节点可以分为四类:根节点(root)、类型节点(typenode)、alpha节点、beta节点。其中,根结点是一个虚拟节点,是构建rete网络的入口。类型节点中存储事实的各种类型,各个事实从对应的类型节点进入rete网络。

1  建立rete网络
Rete网络的编译算法如下:
1) 创建根;
2) 加入规则1(Alpha节点从1开始,Beta节点从2开始);
a. 取出模式1,检查模式中的参数类型,如果是新类型,则加入一个类型节点;
b. 检查模式1对应的Alpha节点是否已存在,如果存在则记录下节点位置,如果没有则将模式1作为一个Alpha节点加入到网络中,同时根据Alpha节点的模式建立Alpha内存表;
c. 重复b直到所有的模式处理完毕;
d. 组合Beta节点,按照如下方式:
   Beta(2)左输入节点为Alpha(1),右输入节点为Alpha(2)
   Beta(i)左输入节点为Beta(i-1),右输入节点为Alpha(i)  i>2
  并将两个父节点的内存表内联成为自己的内存表;
e. 重复d直到所有的Beta节点处理完毕;
f. 将动作(Then部分)封装成叶节点(Action节点)作为Beta(n)的输出节点;
3) 重复2)直到所有规则处理完毕;
可以把rete算法类比到关系型数据库操作。
把事实集合看作一个关系,每条规则看作一个查询,将每个事实绑定到每个模式上的操作看作一个Select操作,记一条规则为P,规则中的模式为c1,c2,…,ci, Select操作的结果记为r(ci),则规则P的匹配即为r(c1)◇r(c2)◇…◇(rci)。其中◇表示关系的连接(Join)操作。

2 使用rete网络进行匹配
使用一个rete的过程:
1) 对于每个事实,通过select 操作进行过滤,使事实沿着rete网达到合适的alpha节点。
2) 对于收到的每一个事实的alpha节点,用Project(投影操作)将那些适当的变量绑定分离出来。使各个新的变量绑定集沿rete网到达适当的bete节点。
3) 对于收到新的变量绑定的beta节点,使用Project操作产生新的绑定集,使这些新的变量绑定沿rete网络至下一个beta节点以至最后的Project。
4) 对于每条规则,用project操作将结论实例化所需的绑定分离出来。

下面为的图示显示了连接(Join)操作和投影(Project)的执行过程。

3  Rete算法的特点
Rete算法有两个特点使其优于传统的模式匹配算法。
1、状态保存
事实集合中的每次变化,其匹配后的状态都被保存再alpha和beta节点中。在下一次事实集合发生变化时,绝大多数的结果都不需要变化,rete算法通过保存操作过程中的状态,避免了大量的重复计算。Rete算法主要是为那些事实集合变化不大的系统设计的,当每次事实集合的变化非常剧烈时,rete的状态保存算法效果并不理想。
2、节点共享
另一个特点就是不同规则之间含有相同的模式,从而可以共享同一个节点。Rete网络的各个部分包含各种不同的节点共享。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。