首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从可用的数据结构生成二进制决策图

从可用的数据结构生成二进制决策图
EN

Stack Overflow用户
提问于 2020-04-22 23:33:00
回答 1查看 1.1K关注 0票数 2

这个问题有点长,请原谅我。

我有一个包含像这个{x1, x2, x3, x4, x5}这样的元素的数据结构

代码语言:javascript
运行
复制
{0 0 0 0 0, 0 0 0 1 0, 1 1 1 1 0,.....}

它们表示真值表中的所有TRUEs。当然,这个集合中不存在的5位字符串元素对应于真值表中的。但我没有对应于上述集合数据结构的布尔函数。

我看到了这个问题,但是这里所有的答案都假设布尔函数是给定的,这不是真的。

我需要构建一个ROBDD,然后从给定的集合数据结构到ZDD。最好使用可用的python包,如这些

专家有什么建议吗?我相信在这方面已经做了很多工作。

EN

回答 1

Stack Overflow用户

发布于 2020-05-12 17:02:08

使用package dd (可以使用带有pip install dd的包管理器pip安装),可以将布尔函数为TRUE的一组变量赋值转换为二进制决策图。

下面的Python示例假设函数为TRUE的赋值是一组字符串。

代码语言:javascript
运行
复制
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.cudddd.cudd_zdd

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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中添加的,因此上述安装需要从PyPIGitHub存储库下载dd >= 0.5.6发行版。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61376862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档