发布于 2020-05-12 09:02:08
使用package dd
(可以使用带有pip install dd
的包管理器pip
安装),可以将布尔函数为TRUE
的一组变量赋值转换为二进制决策图。
下面的Python示例假设函数为TRUE
的赋值是一组字符串。
from dd import autoref as _bdd
# assignments where the Boolean function is TRUE
data = {'0 0 0 0 0', '0 0 0 1 0', '1 1 1 1 0'}
# variable names
vrs = [f'x{i}' for i in range(1, 6)]
# convert the assignments to dictionaries
assignments = list()
for e in data:
tpl = e.split()
assignment = {k: bool(int(v)) for k, v in zip(vrs, tpl)}
assignments.append(assignment)
# initialize a BDD manager
bdd = _bdd.BDD()
# declare variables
bdd.declare(*vrs)
# create binary decision diagram
u = bdd.false
for assignment in assignments:
u |= bdd.cube(assignment)
# to confirm
satisfying_assignments = list(bdd.pick_iter(u))
print(satisfying_assignments)
为了更快地实现BDD,以及使用C库卡德实现ZDD,可以按以下方式安装Cython模块扩展dd.cudd
和dd.cudd_zdd
:
pip download dd --no-deps
tar xzf dd-*.tar.gz
cd dd-*
python setup.py install --fetch --cudd --cudd_zdd
对于这个(小的)例子,纯Python模块dd.autoref
和Cython模块dd.cudd
之间没有实际的速度差别。
可以使用以下代码将上述二元决策图(BDD)复制到零抑制二进制决策图(ZDD):
from dd import _copy
from dd import cudd_zdd
# initialize a ZDD manager
zdd = cudd_zdd.ZDD()
# declare variables
zdd.declare(*vrs)
# copy the BDD to a ZDD
u_zdd = _copy.copy_bdd(u, zdd)
# confirm
satisfying_assignments = list(zdd.pick_iter(u_zdd))
print(satisfying_assignments)
模块dd.cudd_zdd
是在dd == 0.5.6
中添加的,因此上述安装需要从PyPI或GitHub存储库下载dd >= 0.5.6
发行版。
https://stackoverflow.com/questions/61376862
复制相似问题