Python 3.x 如何使用Python生成显示所有可能性的图形

Python 3.x 如何使用Python生成显示所有可能性的图形,python-3.x,matplotlib,graph,networkx,Python 3.x,Matplotlib,Graph,Networkx,我需要编写一个python代码,允许我生成相互依赖的可能性树。事实上,如果我们有两个向量:a=[0,1]和b=[0,1],我们可以构造4种不同的可能性: (0,0) (0,1) (1,0) (1,1) 如果我们将(0,0)作为父节点,我们可以从(0,0)到所有其他可能性生成3条边:(0,0)->(0,1)、(1,0)、(1,1) 然后,对于每个可能性,我们可以为其他可能性生成3条边,例如: (0,1)->(0,0)、(1,0)、(1,1) (1,0)->(0,0)、(1,1)、(0,1)

我需要编写一个python代码,允许我生成相互依赖的可能性树。事实上,如果我们有两个向量:
a=[0,1]
b=[0,1]
,我们可以构造4种不同的可能性:

  • (0,0)
  • (0,1)
  • (1,0)
  • (1,1)
如果我们将
(0,0)
作为父节点,我们可以从
(0,0)
到所有其他可能性生成3条边:
(0,0)->(0,1)、(1,0)、(1,1)

然后,对于每个可能性,我们可以为其他可能性生成3条边,例如:

  • (0,1)->(0,0)、(1,0)、(1,1)
  • (1,0)->(0,0)、(1,1)、(0,1)
  • (1,1)->(0,0)、(1,0)、(0,1)

我需要重复N次。结果应该是一棵树,其中每个非叶节点都有3个后续节点,除了当前节点之外,其他所有节点都有。Python的优秀图形处理库--
networkx
--具有生成此类图形的特殊功能:

编辑1:我为您构建了解决问题的工作流。您可以将其复制粘贴到Jupyter笔记本中,但请注意,您需要:

  • networkx
  • 格拉夫维兹
  • 派多特
待安装

import networkx as nx

# Set main parameters
items = {(0, 0), (0, 1), (1, 0), (1, 1)}
root = (0, 1)
N = 4

# Calculate the number of nodes for our tree
node_count = sum((len(items)-1)**i for i in range(N))

# Construct full r-rary tree
G = nx.full_rary_tree(len(items)-1, node_count, create_using=nx.DiGraph)

# Create LG-topologically sorted array of nodes
# NOTE THAT NODES' IDs AREN'T EQUAL TO YOUR ITEMS
lgts = list(nx.lexicographical_topological_sort(G))

# Get the first element to preset its label
first = lgts[0]

# Preset an empty label for all nodes
nx.set_node_attributes(G, '', 'label')

# Set the label for the root
G.nodes[first]['label'] = root

# For all nodes:
for node in lgts:
    # Get needed names
    s_labels = list(items - {G.nodes[node]['label']})
    # For all childs:
    for s_node in G.successors(node):
        # Set the child's label
        G.nodes[s_node]['label'] = s_labels.pop()

# Create dict for drawing labels
labels = {n: G.nodes[n]['label'] for n in G.nodes}

# And draw the final graph
nx.draw(
    G,
    pos=nx.nx_pydot.graphviz_layout(G, prog='dot'),
    with_labels=True,
    labels=labels
)
最后,您将得到以下图表:


欢迎来到stackoverflow!请拿起这本书,仔细阅读。特别是在解决方案方面表现出一些努力。你能详细说明一下(0,1)、(1,0)和(1,1)如何创建相同的三个集合吗?事实上,(0,1)在它的过程中会被视为父变量,考虑到第一个变量可以是0或1,第二个变量相同,我们可以说(0,1)是4个可能值(0,0),(0,1),(1,0),(1,1)的组合,但我们消除了它返回自身的情况,因此将省略情况(0,1),因此,我们有3个可能的后续情况((0,0),(1,0),(1,1))。其他的也一样。您知道如何实现这一点吗???感谢您的回答,这似乎是真的,但我希望在每次迭代中,系统生成新节点,即使它们已经存在于图中。所以从00->01,10,11可以,但是对于01,我想要新的节点呈现10,11,00我不明白。是否要构建可能路径的树?因为如果你想创建与图中现有节点相等的节点,它们将合并。是的,我想要一棵树。设想如下:我有4个组合(00,01,10,11),我从00开始,将其链接到其他三个节点,然后每次我将其中一个节点链接到其他三个节点,也许每次我都应该生成一个新标签,这样我就可以有新的节点,我重复了N次!我真的被卡住了,有什么想法请给你更新一个答案。非常感谢你,这是我期待的结果。再次感谢你