组织介绍

速览

NSMRule,nested set model,基于嵌套集合模型的规则引擎实现方案

什么是规则引擎

规则引擎的核心是将复杂易变的业务逻辑从应用代码中剥离出来,使业务规则的定义和运行隔离开来,这样当业务需求改变时,只需要更改规则定义,而不需要修改代码,以及重新编译、部署整个项目,提高了应用的扩展性和可维护性。

规则引擎的组成部分

由事实对象、规则核心和结果对象三部分构成,结构示意图如下:
image.png

事实对象

用户输入的事实对象,作为决策因子使用。

规则核心

由语义存储模块和规则匹配模块构成的。

1 语义存储

处理业务方配置的规则转换成可以存储的格式并持久化。同分支规则是OR的关系,不同分支规则是AND的关系:
image.png

if [(A∧B)∨(C∧D)]∧F then O
[(A∧B)∨(C∧D)]∧F=(A∧B∧F)V(C∧D∧F): (O1=O2)
image.png
[(A∨B)∧(C∨D)]∨F then O
[(A∨B)∧(C∨D)]∨F=(A∨B∨F)∧(C∨D∨F):
image.png

2 规则匹配

根据外部传入的事实对象和存储的规则计算得到最终的结果对象。采用树形结构构建规则树,规则配置灵活,支持AND、OR任意组合,同分支规则是OR的关系,不同分支规则是AND的关系:
image.png
画外音

  • 为什么没有支持XOR,因为:A⊕B=(¬A∧B)∨(A∧¬B)=(¬A∨¬B)∧(A∨B)
  • 为什么设计成直线分支(为什么没有分叉),因为逻辑运算的分配定律:A∨(B∧C)=(A∨B)∧(A∨C)

2.1 规则运算

默认支持十种规则运算:

运算符 说明 支持类型
eq 等于 数值型/字符型
neq 不等于
gt 大于 数值型
egt 大于等于
lt 小于
elt 小于等于
btw 属于
nbtw 不属于
in 包含于 字符型
nin 不包含于

2.2 失败匹配

最坏失败匹配

image.png

最优失败匹配

image.png

2.3 成功匹配

最坏成功匹配

image.png

最优成功匹配

image.png
成功匹配和失败匹配的平均匹配效率均小于O(n)

结果对象

规则处理完毕后的结果。
输入

{
  "a":9,
  "b":1,
  "order":11
}

输出

{
    "hitList": [//命中列表
        {
            "name": "result_name1",
            "val": "result1",
            "ruleList": [//命中的规则,b在区间[1,9]内,且a大于8
                {
                    "name": "b",
                    "val": "[1,9]",
                    "op": "btw"
                },
                {
                    "name": "a",
                    "val": "8",
                    "op": "gt"
                }
            ]
        },
        {
            "name": "\b能力1",
            "val": "普通单",
            "ruleList": [//命中的规则,a在大于2,且order大于10
                {
                    "name": "a",
                    "val": "2",
                    "op": "gt"
                },
                {
                    "name": "order",
                    "val": "10",
                    "op": "gt"
                }
            ]
        }
    ],
    "missList": [//不命中列表
        {
            "name": "reward1",
            "val": "{\"bonus\":6000,\"type\":1}",
            "ruleList": [//没命中的规则,lowestOrderNum不在区[8100]
                {
                    "name": "lowestOrderNum",
                    "val": "[8,100]",
                    "op": "btw"
                }
            ]
        }
    ]
}

深度分层

image.png

扩展资料

Nested set model

Nested set model - Wikipedia

逻辑运算定律

逻辑运算交换律

  • 逻辑与交换律:A∧B=B∧A
  • 逻辑或交换律:A∨B=B∨A
  • 逻辑异或交换律:A⊕B=B⊕A

逻辑运算结合律

  • 逻辑与结合律:A∧(B∧C)=A∧B∧C
  • 逻辑或结合律:A∨(B∨C)=A∨B∨C
  • 逻辑异或结合律:A⊕(B⊕C)=A⊕B⊕C

逻辑运算分配律

  • (A∨B)∧C=(A∧C)∨(B∧C)
  • A∨(B∧C)=(A∨B)∧(A∨C)

逻辑运算吸收律

  • A∨(A∧B)=A
  • A∧(A∨B)=A
  • A∨(¬A∧B)=A∨B
  • A∧(¬A∨B)=A∧B

逻辑运算反演律

  • ¬(A∧B)=¬A∨¬B
  • ¬(A∨B)=¬A∧¬B

异或公式

  • A⊕B = (¬A∧B)∨(¬B∧A) = (¬A∨¬B)∧(A∨B)

利用逻辑运算规则可以简化设计,简化逻辑表达式

成就
5
Star
1
Fork
成员(1)
133372 zuitu 1578919045
zuitu

搜索帮助