我正在尝试创建具有特定结构的 BDD。我有一个布尔变量 x_i 的一维序列,例如 x_1、x_2、x_3、x_4、x_5。如果没有孤立的一或零(可能在边缘除外),我的条件就满足了。
我已经使用pyeda实现了这一点,如下所示。该条件相当于检查连续的三元组 ([x_1, x_2, x_3]; [x_2, x_3, x_4]; ...) 并检查它们的真值是否为 [[1,1,1], [0, 0,0],[1,1,0],[0,1,1],[1,0,0],[0,0,1]]。
from functools import reduce
from pyeda.inter import bddvars
def possible_3_grams(farr):
farr = list(farr)
poss = [[1,1,1], [0,0,0], [1,1,0], [0,1,1], [1,0,0], [0,0,1]]
truths = [[farr[i] if p[i] else ~farr[i] for i in range(3)] for p in poss]
return reduce(lambda x, y: x | y, [reduce(lambda x, y: x & y, t) for t in truths])
X = bddvars('x', k)
Xc = [X[i-1:i+2] for i in range(1,k-1)]
cont_constraints = [possible_3_grams(c) for c in Xc]
cont_constr = reduce(lambda x, y: x & y, cont_constraints)
print(cont_constr.to_dot())
最终的图表如下所示:
这适用于短序列,但是当长度超过 25 时,最后的减少变得非常缓慢。我想要一些适用于更长序列的东西。
我想知道在这种情况下直接构建 BDD 是否更有效,因为问题有很多结构。但是,我找不到任何方法来直接在 pyeda 中操作 BDD。
有谁知道我怎样才能更有效地完成这项工作?