转载自http://thinkinside.tk/2012/12/05/algorithm_of_pattern_match.html
规则引擎的核心是Pattern Matcher(模式匹配器)。不管是正向推理还是反向推理,首先要解决一个模式匹配的问题。
对于规则的模式匹配,可以定义为: 一个规则是一组模式的集合。如果事实/假设的状态符合该规则的所有模式,则称为该规则是可满足的。 模式匹配的任务就是将事实/假设的状态与规则库中的规则一一匹配,找到所有可满足的规则。
什么是模式匹配
对于模式匹配我们都应该不陌生,我们经常使用的正则表达式就是一种模式匹配。
正则表达式是一种“模式(pattern)”
编程语言提供的“正则表达式引擎”就是Pattern Matcher。比如python中的re模块
首先输入“知识”:re.compile(r'string')
然后就可以让其匹配(match)事实(字符串)
最后通过正则表达式引擎可以得到匹配后的结果
对于规则匹配,通常定义如下:
条件部分,也称为LHS(left-hand side)
事实部分,也称为RHS(right-hand side)
假设系统中有N条规则,平均每个规则的条件部分有P个模式,在某个时点有M个事实需要处理。则规则匹配要做的事情就是: 对每一个规则r,判断当前的事实o是否满足LHS(r)=True,如果满足,则将规则r的实例r(o),即规则+满足该规则的事实,加到冲突集中等待处理。 通常采取如下过程:
- 从N条规则中取出一条r;
- 从M个事实中取出P个事实的一个组合c;
- 用c测试LHS(r),如果LHS(r(c))=True,将RHS(r(c))加入队列中;
- 如果M个事实还存在其他的组合c,goto 3;
- 取出下一条规则r,goto 2;
实际的问题可能更复杂,在规则的执行过程中可能会改变RHS的数据,从而使得已经匹配的规则实例失效或者产生新的满足规则的匹配,形成一种“动态”的匹配链。
上面的处理由于涉及到组合,过程很复杂。有必要通过特定的算法优化匹配的效率。目前常见的模式匹配算法包括Rete、Treat、Leaps,HAL,Matchbox等。
Rete算法
Rete算法是目前使用最广泛的规则匹配算法,由Charles L. Forgy博士在1979年发明。Rete算法是一种快速的Forward-Chaining推理算法,其匹配速度与规则的数量无关。 Rete的高效率主要来自两个重要的假设:
- 时间冗余性
假设facts在推理过程中的变化是缓慢的, 即在每个执行周期中,只有少数的facts发生变化,因此影响到的规则也只占很小的比例。所以可以只考虑每个执行周期中已经匹配的facts.
- 结构相似性
假设许多规则常常包含类似的模式和模式组。
Rete算法
Rete算法的基本思想是保存过去匹配过程中留下的全部信息,以空间代价来换取执行效率 。对每一个模式 ,附加一个匹配元素表来记录WorkingMemory中所有能与之匹配的元素。当一个新元素加入到WorkingMemory时, 找出所有能与之匹配的模式, 并将该元素加入到匹配元素表中; 当一个无素从WorkingMemory中删除时,同样找出所有与该元素匹配的模式,并将元素从匹配元素表中删除。 Rete算法接受对工作存储器的修改操作描述 ,产生一个修改冲突集的动作 。
Rete算法的步骤如下:
- 将初始数据(fact)输入Working Memory。
- 使用Pattern Matcher比较规则(rule)和数据(fact)。
- 如果执行规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放入冲突集合。
- 解决冲突,将激活的规则按顺序放入Agenda。
使用规则引擎执行Agenda中的规则。重复步骤2至5,直到执行完毕所有Agenda中的规则。
Tread算法
在 Rete算法中 ,同一规则连接结点上的寄存器保留了大量的冗余结果。实际上, 寄存器中大部分信息已经体现在冲突集的规则实例中。因此 ,如果在部分匹配过程中直接使用冲突集来限制模式之间的变量约束,不仅可以减少寄存器的数量 ,而且能够加快匹配处理效率 。这一思想称为 冲突集支撑策略 。
考虑增删事实对匹配过程的影响,当向工作存储器增加一个事实时 ,冲突集中已有的规则实例仍然保留,只是将与该事实匹配的规则实例加入到冲突集中; 当从工作存储器删去一个事实时,不可能有新的规则实例产生, 只是将 包含该事实的规则实例从冲突集中删去。
基于冲突集支撑策略和上述观察, Treat算法放弃了Rete算法中利用寄存器保存模式之间变量约束中间结果的思想,对于每一个模式 ,除保留原有 a寄存器的外 ,增加两个新链来记录与该模式匹配的增删事实,一个叫做增链 (addlist),另一个叫做删链 (deletelist)。当修改描述的操作符为 “+”时,临时执行部分连接任务;当修改描述的操作符为 “一”时,直接删去冲突集中包含该事实的规则实例。
Treat算法的步骤如下:
行动 :根据点火规则的 RHS,生成修改描述表 CHANGES;
模式匹配:置每一模式的删链和增链为空,对 CHANGES的每一个修改描述 ,执行模式匹配。对于与修改描述中的事实匹配成功的模式,若修改描述的操作符为 “+”, 将该事实加入这一模式的增链;若修改描述的操作符为 “一”,将该事实加入这一模式的 删链。
删去事实的处理:对于任一模式链中的每一个事实,找到冲突集中所有包含该事实 的规则实例,并将这一规则实例从冲突集中删去。相应地修改该模式的 a寄存器 。
新增事实的处理:对 于 每 一 模 式 ,若 其 增 链 非 空 ,则 将 增 链 中 的 所 有 事 实 加 入 该 模 式的a寄存器 ,并对与新增事实相关的每一条规则临时执行部分匹配,寻找该规则新的实 例。具体做法为:首先将第一个模式增链中的事实集合与后一模式的 a寄存器进行连接 , 再将部分连接结果与第三个模式的a寄存器进行连接 ,一直到所有模式均连接完成为止。 其中 ,a寄存器 的内容包括新增 事实。若连接结果非空 ,则将找到 的规则 实例插入到冲突 集中。
Leaps 算法
前向推理引擎,包括LEAPS,都包括了匹配-选择-执行(match-select-action)循环。即,确定可以匹配的规则,选择某个匹配的元 组,此元组相应的规则动作被执行。重复这一过程,直到某一状态(如没有更多的规则动作)。RETE和TREAT匹配算法速度慢的原因是,它们把满足规则条 件的元组都实例化。Leaps算法的最大的改进就是使用一种"lazy"的方法来评估条件(conditions),即仅当必要时才进行元组的实例化。这 一改进极大的减少了前向推理引擎的时空复杂度,极大提高了规则执行速度。
Leaps算法将所有的 asserted 的 facts ,按照其被 asserted 在 Working Memory 中的顺序( FIFO ),放在主堆栈中。它一个个的检查 facts ,通过迭代匹配 data type 的 facts 集合来找出每一个相关规则的匹配。当一个匹配的数据被发现时,系统记住此时的迭代位置以备待会的继续迭代,并且激发规则结果( consequence )。当结果( consequence )执行完成以后,系统就会继续处理处于主堆栈顶部的 fact 。如此反复。
Leaps算法的效率可以比Rete算法和Tread算法高几个数量级。
其他算法
对于HAL算法和Matchbox算法,使用的范围不是很广,这里不做过多的介绍。
相关推荐
**AC-BM 多模式匹配算法** AC-BM(Aho-Corasick-BM)算法是一种结合了Aho-Corasick算法和Boyer-Moore算法的字符串匹配方法,主要用于在一个大文本串中高效地查找多个模式串。这种算法提高了在大量模式下搜索文本的...
模式匹配算法是计算机科学中一个重要的算法类别,主要用于在文本串中寻找特定模式的存在。它在文本处理、搜索引擎、生物信息学等领域有广泛应用。本文将深入探讨模拟匹配算法及其最新解法,并提供相关的代码实现。 ...
模式匹配算法是数据结构中一个核心的应用,特别是在文本处理、搜索引擎、生物信息学等领域有着广泛的应用。本文将深入探讨模式匹配算法及其在数据结构中的实现。 一、模式匹配的基本概念 模式匹配通常指的是在一个...
【高效模式匹配算法】文中提到的SSPBM(基于Boyer-Moore思想的多模式匹配算法)是一种旨在解决这个问题的方法。通过改进Boyer-Moore算法,SSPBM算法能够更有效地处理多个模式的匹配,从而提高NIDS的检测性能和效率。...
在信息检索系统、搜索引擎优化、病毒检测等场景中,高效的模式匹配算法是必不可少的。本文将深入探讨模式匹配算法的改进及其在实际应用中的价值。 模式匹配算法的基本任务是在一个大的文本串(主串)中查找是否存在...
字符串模式匹配算法是计算机科学中一个重要的研究领域,它在文本处理、搜索引擎、生物信息学等领域有着广泛应用。本文将深入探讨这一主题,并基于压缩包文件中的资料,提供一系列相关知识点。 1. **基本概念** - *...
Rete模式匹配算法是一种在人工智能和专家系统领域广泛使用的高效算法,用于动态地维护和更新大量规则库。这种算法能够快速地识别出哪些规则适用于给定的事实数据,并且随着新数据的输入或旧数据的修改,它能有效地...
1. 规则表示语言(Rete算法):Rete是一种高效的模式匹配算法,用于快速找出满足条件的规则。 2. Drools:这是一个开源的Java规则引擎,支持Java Rule Language (JRL) 和 Decision Table 格式的规则定义。 3. BRMS...
在计算机科学中,"串的模式匹配"是一个重要的算法主题,尤其在数据结构与算法分析领域。...在实际应用中,模式匹配算法被广泛应用于搜索引擎、文本编辑器、生物信息学等领域,是解决实际问题的重要工具。
本文旨在深入探讨SNORT入侵检测系统的规则匹配算法,重点分析单模式匹配算法和多模式匹配算法,并提出一种新的AC-BMtt算法,旨在提高检测匹配的效率。 #### 二、SNORT入侵检测系统概述 ##### 1. 发展历史 入侵检测...
最长模式匹配算法是计算机科学中用于字符串处理的一种重要方法,主要应用于文本编辑器、版本控制系统、数据比较等领域。它的核心目标是在两个字符串中找到最长的相同子串,这对于比较两段字符间的差别尤为关键。在...
在最原始的模式匹配算法中,通常采用的方法是朴素的线性搜索,即逐一比较主串和模式串的字符。例如,KMP(Knuth-Morris-Pratt)算法就是一种著名的原始模式匹配算法,它通过构建失配表避免了不必要的字符比较,提高...
Drools的一个核心概念是Rete算法,这是一种用于高效执行大量规则匹配的模式匹配算法,它能够减少在处理复杂规则集合时的重复计算。Drools使用Rete算法来提高规则匹配的性能,并且能够处理前向链(Forward Chaining)...
这篇学术论文主要探讨了在Web前端开发中,如何利用正则表达式的图模式匹配算法来处理社交网络数据的问题。在当前Web2.0时代,社交网络已经成为人们互动交流的重要平台,而这些网络中的数据结构复杂且庞大,对于信息...
其中,Rete算法是目前最高效的Forward-Chaining推理算法之一,广泛应用于各种规则引擎中。 #### 规则引擎的相关构件 规则引擎的关键在于其内部构件的设计与实现。以下是与规则引擎紧密相关的几个基本概念: 1. **...
Rete算法是一种高效的Forward-Chaining推理算法,被广泛应用于Java规则引擎中。 #### 规则引擎的相关构件 与规则引擎相关的四个基本概念包括: 1. **信息元(InformationUnit)**:封装了事件的详细信息,如消息...