`
duyangsss
  • 浏览: 124207 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

规则引擎中常用的模式匹配算法

 
阅读更多

转载自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),即规则+满足该规则的事实,加到冲突集中等待处理。 通常采取如下过程:

  1. 从N条规则中取出一条r;
  2. 从M个事实中取出P个事实的一个组合c;
  3. 用c测试LHS(r),如果LHS(r(c))=True,将RHS(r(c))加入队列中;
  4. 如果M个事实还存在其他的组合c,goto 3;
  5. 取出下一条规则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算法的步骤如下:

  1. 将初始数据(fact)输入Working Memory。
  2. 使用Pattern Matcher比较规则(rule)和数据(fact)。
  3. 如果执行规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放入冲突集合。
  4. 解决冲突,将激活的规则按顺序放入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算法,使用的范围不是很广,这里不做过多的介绍。

 

分享到:
评论

相关推荐

    规则引擎研究-整理.docx

    Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关。Rete是拉丁文,对应英文是net,也就是网络。Rete算法通过形成一个rete网络进行模式匹配,利用基于规则的系统的两个特征,即时间冗余性...

    Rete算法的应用研究

    对专家系统和基于规则的专家系统进行了研究,尤其对基于规则的专家系统中的模式匹配算法进行了深入分析和理解。在此理论基础上,将一种高效的模式匹配算法——Rete算法引入到实际的故障的诊断系统中,以保证故障诊断...

    基于Flink框架的实时智能营销系统研究.pdf

    (1)提出了一种基于人工反馈强化学习的多规则模式匹配算法:本文引入了规 则引擎Drools 的同时利用规则匹配算法Rete,在此基础上本课题融合RLHF人工反 馈强化学习算法,改进了传统推荐算法的劣势,研究发现了人工...

    JESS简介与实例教程

    与一个程序中有一个只运行一次的循环的命令式编程语言不同,Jess使用的声明式编程通过一个名为“模式匹配”的过程连续的对一个事实的集合运用一系列规则。规则可以修改事实集合,或者运行任何Java代码。 Jess可以被...

    springdrools.rar

    最好使用的规则引擎之一,Drools是一个开源的业务规则引擎,速度快,效率高。它是由JBoss和Red Hat共同支持,是一个实现了Rete模式匹配算法的一个开源项目。

    基于Rete算法的几何自动推理系统 (2006年)

    为了提高推理引擎的推理效率,作者首次将Rete模式匹配算法整合到推理引擎中,构造了一种高效的几何自动推理引擎,称为几何自动推理网。几何自动推理网通过消除推理过程中的冗余匹配达到了提高系统推理效率的目的。...

    humble:Humble是一个简单的图形约简引擎

    规则使用我能想到的最简单的模式匹配算法,将其天真地转换为if语句。 规则可以延迟应用; 仅在最高级别,并且由规则决定,以减少他们的争论。 或杂乱无章从叶节点开始应用规则,直到根为止。 定义规则 (Compile ...

    一种基于Snort规则和神经网络的混合入侵检测模型 (2011年)

    先通过模式匹配算法对数据包进行初级检测和数据分流,然后将可疑数据送报高级检测引擎进行智能检测,再将结果反馈给初级检测引擎;相对单一的入侵检测技术,本模型提高了入侵检测系统的检测效率和准确率。

    大数据LBS.docx

    经典低采样率地图匹配算法:ST – Matching。将GPS点映射到路网中的相应的路段。 路径匹配:地图匹配工作可以把原始的GPS轨迹匹配到路网中相应的路段,然而在实际应用中,有时不仅需要知道轨迹中的GPS点所对应的...

    asp.net知识库

    常用的匹配正则表达式和实例 经典正则表达式 delegate vs. event 我是谁?[C#] 表达式计算引擎 正式发布表达式计算引擎WfcExp V0.9(附源码) 运算表达式类的原理及其实现 #实现的18位身份证格式验证算法 身份证15To18...

    机器:机器是.NET的自然语言处理库,专注于提供用于处理资源贫乏的语言的工具

    机器是自然语言处理库。 它专门致力于提供对处理资源非常匮乏的语言有用的工具和技术。 该库还可用作构建更高级的语言处理技术的基础。 该库当前仅提供一组基本算法,但目标是...机器包含一个类似regex的模式匹配引擎。

    智能问答系统调研.docx

    6 3.2.1中文分词 6 3.2.2关键词提取 9 3.2.3关键词扩展 11 3.2.4实体识别 11 3.2.5问句分类 13 3.3 信息检索模块 14 3.3.1模式匹配 14 3.3.2答案检索 14 3.3.3知识图谱 17 3.4答案抽取模块 22 智能问答系统调研全文...

    网站架构技术

    大型网站架构演化 大型网站软件系统的特点 大型网站架构演化发展历程 初始阶段 应用服务和数据服务分离 使用缓存改善网站性能 ... 规则引擎 统计模型 案例 网购秒杀系统架构 网购秒杀系统架构

    达内java培训目录

    Java语言基础 算法基础、常用数据结构、企业编程规范。 掌握常见的数据结构和实用算法;培养良好的企业级编程习惯。 Java面向对象 面向对象特性:封装、继承、多态等,面向对象程序设计,基础设计模式等。 掌握面向...

    java 面试题 总结

    assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    扩大 `IndexLookupJoin` 的使用范围,索引前缀匹配的场景也可以使用该算法 2.SQL 执行引擎 使用 Chunk 结构重构所有执行器算子,提升分析型语句执行性能,减少内存占用,显著提升 TPC-H 结果 支持 Streaming ...

    国内首家采用MS全新 MiniFilter架构的SEFS透明加密内核 V 2.0.0.1发布

    <br>2、特点 <br>  1、强制加密:客户端指定规则或匹配规则产生的任意文件均强制加密。所有的“文件另存”均为加密。不管是 <br> 怎么样的文件名称。SEFS是智能识别应用程序的行为. <br> 2、文件...

    vc++ 应用源码包_1

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

    vc++ 应用源码包_2

    精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 FreeBird2011最初版(模仿飞鸽,可...

Global site tag (gtag.js) - Google Analytics