algorithm - 优化大量基于二元谓词的规则的计算

标签 algorithm graph-theory decision-tree predicate boolean-logic

我有一组已知且有限的二元谓词:A、B、C、...

还有一大堆规则,包含带有 OR、AND、NOT 运算符的谓词。即

R1 = A AND B
R2 = NOT(C) OR B
R3 = ((A OR B) AND C) OR NOT(C)

当获得所有谓词的二元赋值时,我想优化规则的计算。

为此,我可以根据需要修改规则定义,只要逻辑不会改变(相同的谓词分配将在每个规则上给出相同的计算结果)。

我正在考虑创建某种联合决策树,但不知道如何判断什么是优化的安排。

注意:我不关心构建计算算法的复杂度,只关心计算复杂度。

最佳答案

对于少量谓词,您可以提前计算所有结果以创建缓存。请注意,您的缓存中将有 2 ^(谓词数量)条目。

对于大量谓词,您无法执行此操作。我想说这听起来像动态编程,因为规则可能有重叠的组件。为了增加这种重叠,您可以重写所有规则以使用单一类型的操作,例如与非。然后,您可以创建一个图表,其中谓词是输入,规则是输出。

所以你的规则看起来像:

R1 = (A NAND B) NAND (A NAND B)
R2 = (B NAND B) NAND C
R3 = (A NAND A) NAND (B NAND B) NAND C

您已经可以看到一些重叠。这将随着规则数量的增加而增加。您的图表将如下所示:

computation graph

一旦获得二进制分配,您就可以从左到右计算图表。或者在动态编程风格中,您从 R1 开始并缓存所有中间结果以供以后使用,然后对 R2 和 R3 执行相同的操作。

关于algorithm - 优化大量基于二元谓词的规则的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47649591/

相关文章:

python - 类型错误 : can only concatenate str (not "numpy.int64") to str while trying to plot the graph tree

python - 长时间运行的决策树模型

javascript - 具有约束的数据动态聚合

algorithm - 计算一百万个注释的 F 分数的最快方法是什么?

r - igraph:如何将图转换为二分图?

java - 图中两个节点之间的最短路径(Java)

python-3.x - 如何使用 graphviz 绘制 TreeMap ?

php - 从输入数组中查找数组中相关结果的最快方法

algorithm - 用于创建 Verilog 框图的程序

graph-theory - 如何确定两个节点是否连接?