OR谓词优化:多属性规则组合逻辑表达式最小化方法咨询
解决方案
完全可以从集合论角度处理该问题,核心思路是将每条规则视为属性取值集合的笛卡尔积,总规则R是所有规则对应笛卡尔积的并集,最小化目标就是用最少的笛卡尔积的并集表示这个总集合,每个笛卡尔积对应一条(A1 in S1) AND (A2 in S2) AND (A3 in S3)形式的子句。
具体操作步骤
- 规则结构化转换
将所有规则转换为属性取值集合的三元组(S_A1, S_A2, S_A3),示例中的三条规则转换后为:
- R1:
({1,2}, {20,40,50}, {100}) - R2:
({1,3}, {10,30}, {200}) - R3:
({1,2}, {10}, {100})
- 前置规则合并
如果两条规则仅有一个属性的取值集合不同,其余属性集合完全一致,直接合并该属性的取值集合。示例中R1和R3的A1、A3集合完全相同,合并A2集合后得到新规则:
- R1':
({1,2}, {10,20,40,50}, {100})
此时剩余待处理规则仅为R1'和R2两条。
- 单属性全匹配检测
遍历每个属性的所有可选取值,对取值v收集所有包含v的规则,判断这些规则中其余属性的约束并集是否覆盖其余属性的全取值空间:
- 示例中检测A1的取值
1,包含1的规则为R1'和R2,其余两个属性的约束并集为:(A2 in {10,20,40,50} AND A3=100) OR (A2 in {10,30} AND A3=200),刚好覆盖A2、A3的所有取值组合。 - 因此可以将
A1=1拆分为独立子句,再将原有规则中A1集合里的1删除,得到剩余规则:- R1'':
({2}, {10,20,40,50}, {100}) - R2'':
({3}, {10,30}, {200})
- R1'':
- 迭代终止
重复步骤2、3,直到没有新的可合并规则、也没有可拆分的独立子句为止。最终示例的最小化结果为:
R = (A1 = 1) OR (A1=2 AND A2 in (10,20,40,50) AND A3=100) OR (A1=3 AND A2 in (10,30) AND A3=200)
性能优化技巧
- 优先处理可选取值少的属性:比如示例中A3仅2个取值、A1有3个取值、A2有5个取值,优先处理取值少的属性可以快速剪枝,减少计算量。
- 每轮操作后先合并冗余规则:拆分独立子句后先合并属性集合相同的规则,避免规则数量膨胀。
- 启发式终止:如果连续两轮没有拆出任何独立子句,直接对所有规则做同属性合并后输出结果,不需要做全量遍历,适合规则量极大的场景。
该方案天然兼容属性的取值范围约束和属性内部取值的互斥关系,不需要引入冗余布尔变量,计算复杂度远低于传统布尔最小化算法,适合绝大多数业务规则场景的使用。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

