-
1、则引擎的优点:
1.1 使用规则引擎可以通过降低实现复杂业务逻辑的组件的复杂性,降低应用程序的维护和可扩展性成本。 1.2 分离商业决策者的商业决策逻辑和应用开发者的技术决策。 1.3 能有效的提高实现复杂逻辑的代码的可维护性。 1.4 在开发期间或部署后方便修复代码缺陷。 1.5 应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内。 1.6 符合组织对敏捷或迭代开发过程的使用。
-
2、Rete算法
Rete算法是一种前向规则快速匹配算法,其匹配速度与规则数目无关。Rete算法通过形成一个rete网络进行模式匹配,利用基于规则的系统的两个特征,即时间冗余性(Temporal redundancy)和结构相似性(structural similarity),提高系统模式匹配效率。 -
2.1 网络关键字解释
2.1.1 **alpha网络**:过滤working memory,找出符合规则中每一个模式的集合,生成alpha memory(满足该模式的集合)。有两种类型的节点,过滤type的节点和其他条件过滤的节点。 2.1.2 **Beta网络**:有两种类型的节点Beta Memory和Join Node。前者主要存储Join完成后的集合。后者包含两个输入口,分别输入需要匹配的两个集合,由Join节点做合并工作传输给下一个节点。 2.1.3 **Fact(事实)**:对象之间及对象属性之间的关系。 2.1.4 **Rule(规则)**: 是由条件和结论构成的推理语句(表示:if…Then)。(LHS和RHS) 2.1.5 **module(模式)**:是指不能继续分割的最小原子条件(组成IF语句的条件)。 2.1.6 **root node**:所有对象进入网络的入口,在一个网络中只有一个根节点。 2.1.7 **input node(alpha node)**:可以分为ObjectTypeNode,AlphaNode等。 2.1.8 **object type node**:事实进入根节点进入rete网络后,会立即进入object type node节点。(该节点提供了按照对象类型过滤对象的能力)。 2.1.9 **alpha node**:alpha节点是规则的条件部分的一个模式。(是共享的) 2.1.10 **beta node**:拥有两个输入的节点。用于比较两个对象。(不是共享的) 2.1.11 **join node** : 用作连接操作的节点,相当于数据库的表连接操作。 2.1.12 **NotNode**:根据右边输入对左边输入的对象数组进行过滤。 2.1.13 **terminal node**:到达一个终端节点,表示单条规则匹配了所有的条件,网络中有多个终端节点。当单条规则中有or时,也会产生多个终端节点。
-
2.2 产生式系统的高效模式匹配算法概述:
产生式系统主要分为,working memory(被处理的数据),用于判定的规则两个部分,其中规则又分为LHS(left-hand-side 前提)和RHS(right hand side 结论)。主要流程: 1、 Match:找出符合LHS部分的working memory集合 2、 confilict resolution:选出一个条件被满足的规则 3、 act:执行RHS的内容 4、 返回1中的数据
-
2.3 Rete算法流程图
-
2.4 Rete网络创建过程解析:
2.4.1 创建root节点(根节点),推理网络的入口。 2.4.2 拿到规则1,从规则1中取出模式1(模式就是最小的原子条件)。 2.4.2.1 检查模式1中的参数类型,如果是新类型,添加一个类型节点。 2.4.2.2 检查模式1对应的Alpha节点是否存在,如果存在记录下节点的位置;如果没有,将模式1作为一个Alpha节点加入到网络中。同时根据Alpha节点建立Alpah内存表。 2.4.2.3 重复2.4.2.2,直到处理完所有模式。 2.4.2.4 组合Beta节点:Beta(2)左输入节点为Alpha(1),右输入节点为Alpha(2);Beta(i)左输入节点是Beta(i-1),右输入节点为Alpha(i),并将两个父节点的内存表内联成为自己的内存表。 2.4.2.5 重复2.4.2.4,直到所有Beta节点处理完毕。 2.4.2.6 将动作Then部分封装成最后节点做为Beta(n)。 2.4.3 重复2.4.2,直到所有规则处理完毕。
-
2.5 Rete网络运行过程解析:
2.5.1 导入需要处理的事实到facts集合中。 2.5.2 如果facts不是空,选择一个fact进行处理。否则停止匹配过程。 2.5.3 选择alpha网络的第一个节点运行(在建立网络的时候设定),通过该节点就进入alpha网的下一个节点,知道进入alpha memory 否则跳转到吓一跳判断路径。 2.5.4 将alpha memory的结果加入到beta memory中,如果不为Terminal节点,则检测另一个输入集合中是否存在满足条件的事实,满足则执行join,进入到下一个beta memory重复执行3。若另一个输入集合无满足条件的事实,返回到2。如果该节点为Terminal节点,执行ACT并添加到facts中。
-
2.6 Rete网络运行时解析:
-
2.6.1 推理引擎在进行模式匹配时,先对事实进行断言,为每一个事实建立WME(Working Memory Element)。 2.6.2 将WME从RETE鉴别网络的根结点开始匹配,因为WME传递到的结点类型不同采取的算法也不同,所以需要对alpha结点和beta结点处理WME的不同情况而分开讨论: 2.6.2.1 如果WME的类型和根节点的后继结点TypeNode(alpha结点的一种)所指定的类型相同,则会将该事实保存在该TypeNode结点对应的alpha存储区中,该WME被传到后继结点继续匹配,否则会放弃该WME的后续匹配; 2.6.2.2 如果WME被传递到alpha结点,则会检测WME是否和该结点对应的模式相匹配,若匹配,则会将该事实保存在该alpha结点对应的存储区中,该WME被传递到后继结点继续匹配,否则会放弃该WME的后续匹配: 2.6.2.3 如果WME被传递到beta结点的右端,则会加入到该beta结点的right存储区,并和left存储区中的Token进行匹配(匹配动作根据beta结点的类型进行,例如:join,projection,selection),匹配成功,则会将该WME加入到Token中,然后将Token传递到下一个结点,否则会放弃该WME的后续匹配: 2.6.2.4 如果Token被传递到beta结点的左端,则会加入到该beta结点的left存储区,并和right存储区中的WME进行匹配(匹配动作根据beta结点的类型进行,例如:join,projection,selection),匹配成功,则该Token会封装匹配到的WME形成新的Token,传递到下一个结点,否则会放弃该Token的后续匹配; 2.6.2.5 如果WME被传递到beta结点的左端,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照 4) 所示的方法进行匹配: 2.6.2.6 如果Token传递到终结点,则和该根结点对应的规则被激活,建立相应的Activation,并存储到Agenda当中,等待激发。 2.6.2.7 如果WME被传递到终结点,将WME封装成仅有一个WME元素的WME列表做为Token,然后按照 1.6.2.6 所示的方法进行匹配;
-
2.7 Rete算法分析:
2.7.1 rete算法优于普通代码逻辑 2.7.2 rete算法由于采用alphamemory和betamemory来存储事实,当事实集合变化不大时,保存的节点状态不需要太多变化。避免了大量的重复计算,提高了匹配效率。 2.7.3 rete匹配速度和规则数目无直接关系,因为只有满足类型节点才会沿着网络传播。 2.7.4 rete算法使用了存储区存储已经计算的中间结果,以空间换取时间,从而加快系统的速度。所以存储区会根据规则的条件和事实的数据成指数级增长,极端情况会耗尽系统资源。
-
2.8 Rete详细分析可以参考:https://www.jianshu.com/p/3e9afe9e0617
drools规则引擎分析研究
最新推荐文章于 2024-08-13 22:51:45 发布