[英]OR predicate optimization
假设我有一个具有 3 个属性的实体:A1、A2、A3,这样:
还有一些规则,例如:
R1: (A1 in (1, 2)) AND (A2 in (20, 40, 50)) AND (A3 IN (100))
R2: (A1 in (1, 3)) AND (A2 in (10, 30)) AND (A3 in (200))
R3: (A1 in (1, 2)) AND (A2 in (10)) AND (A3 in (100))
然后有一个谓词: R = R1 or R2 or R3
,我想最小化。 问题是A1=1
涵盖了A2
和A3
的所有可能变体,因此我们可以将其放入单独的子句中: R = (A1=1) or (the rest)
我通过将变量声明为a=(A1=1), b=(A1=2), ..., k=(A3=200)
尝试了 boolean 最小化方法,但是它似乎不起作用,因为:
我还尝试存储每个映射,如果其中一个具有另一个映射的所有值,请将其用作聚合锚,然后将其删除并重复,但这需要永恒和相当多的 RAM .
也许我们可以将属性值表示为一个集合,并从集合论的角度来解决它。
你有没有遇到过这样的问题? 你知道更好的方法来解决它吗? (启发式也可以)
优化评估表达式的一种方法可以是在具有最少值的属性上重复拆分规则。 在此扩展之后,您可以再次收集那些在最后一个子句中具有相同值的值。
制作 2 组,一组用于接受 A3 = 100 的规则,一组用于接受 A3 = 200 的规则。一个规则可以在两个组中结束。 然后修改组中的规则,使其只接受该组的值而不接受另一个值。
使用相同的逻辑将这些组再次分组到 A1 的值上。
你最终会得到一个像这样的扩展表达式:
A3 = 100 AND (
(A1 = 1 AND A2 IN (10, 20, 40, 50)) OR
(A1 = 2 AND A2 IN (10, 20, 40, 50)))
OR A3 = 200 AND (
(A1 = 1 AND A2 IN (10, 30)) OR
(A1 = 3 AND A2 IN (10, 30)))
基本上,我们正在构建一棵树,其中 A3 的值位于深度 1,A1 的值位于深度 2,A2 的值位于深度 3。如果使用属性值存在从根到叶的路径,则规则被满足,否则它不是。
之后,您可以合并具有相同子树和相同父级的所有节点。 为此,您可以将所有节点的叶子与相同的父节点进行比较,如果它们匹配,您可以合并节点。 之后,您将 go 向上一级并比较具有相同父级的节点,依此类推。
对于您的示例,您最终会得到以下表达式:
A3 = 100 AND A1 IN (1, 2) AND A2 IN (10, 20, 40, 50) OR
A3 = 200 AND A1 IN (1, 3) AND A2 IN (10, 30)
这个过程非常简单,还可以缩短表达式,不仅可以优化它以进行评估。 它可能并不完美,但它可能是一种开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.