【问题标题】:Finding all possible combinations of connections between nodes of a graph查找图节点之间所有可能的连接组合
【发布时间】:2020-06-05 07:29:16
【问题描述】:

假设我有一张图,比如pictured here,底部节点从左到右分别标记为 4、5、6、7、8。 我将底部节点分为三组:(4,5)、(6,7) 和 (8,9)。我们分别称它们为第 1 组、第 2 组和第 3 组。我需要将组1中的节点连接到组2和组3中的节点,并且我需要将组2中的节点连接到组3中的节点。同一组中的两个节点无法连接到同一组中的同一节点不同的组。例如,这是一个possible solution。我试图找出一个很好的代码来找到所有这些组合。理想情况下,我希望答案看起来像这样:

[[(4,6),(5,7),(4,8),(5,9),(6,8),(7,9)],
 [(4,6),(5,7),(4,8),(5,9),(6,9),(7,8)],
...etc]

其中的对代表连接。在这里,每一行代表一种可能的组合。我已经想出了几种方法(一种使用许多 for 循环,另一种使用 itertools.product),但是如果我有 25 个组,每组有 25 个节点,这些方法就不能很好地扩展。我还想,当我搞砸这个时,我可能正在做某事:

list1=[4,5]
list2=[6,7]
list3 = [8,9]
one_two = [list(zip(x,list2)) for x in permutations(list1,2)]
one_three = [list(zip(x,list3)) for x in permutations(list1,2)]
two_three = [list(zip(x,list3)) for x in permutations(list2,2)]

但我无法完全解决它。任何帮助,将不胜感激。谢谢!

澄清:我意识到解释我为什么这样做可能会有所帮助。我正在尝试找到一种快速更改邻接矩阵值的方法。在我上面的示例答案中,每一行都代表我想要对单个图表进行的所有更改。所以,例如,第一行说

[(4,6),(5,7),(4,8),(5,9),(6,8),(7,9)]

这意味着我将在节点 4 和 6、5 和 7、4 和 8、5 和 9、6 和 8、7 和 9 之间添加一条边。这就是我希望它们成对出现的原因(并且在很好的行中,所以我可以轻松地遍历它们以更改我的邻接矩阵)。我希望这有帮助!

【问题讨论】:

    标签: python combinations permutation graph-theory itertools


    【解决方案1】:

    我们知道:

    • 每个节点只连接到每个组的一个节点
    • 来自同一组的两个节点未连接到同一节点
    • 每组有两个节点

    这意味着如果我们知道 A 组中的一个节点与 B 组的连接,我们也知道 A 中的另一个节点与 B 组的连接。

    因此我们只需要找到一个节点的连接方式,所有其他节点的所有连接都给出。

    对于节点 4,按照上述规则,有 2*2 种可能的方式连接到其他组。我们可以通过

    找到它们
    from itertools import product
    to_group_2 = product([4], [6, 7])
    to_group_2 = product([4], [8, 9])
    all_possible_node_4_conns = product(to_group_2, to_group_3)
    
    print(list(all_possible_node_4_conns))
    

    输出:

    [((4, 6), (4, 8)), ((4, 6), (4, 9)), ((4, 7), (4, 8)), ((4, 7), (4, 9))]
    

    现在,由于所有尚未考虑的连接都已给出(如上所述),剩下要做的就是将那些缺失的链接添加到列表中,如果需要的话。

    【讨论】:

    • 感谢您的回复!这种方法确实适用于每个组只有 2 个节点的情况,但我认为我们不能进一步概括它。如果每个组有 5 个节点,分配单个节点的连接不会巩固其他 4 个节点的连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多