【问题标题】:Mapping two graphs in Networkx在 Networkx 中映射两个图
【发布时间】:2020-02-20 08:41:23
【问题描述】:

这些天我正在努力根据它们共同的节点来映射两个不同的图表。这是这两个图表的样子。节点的颜色表示蓝色的是priority1黄色的是priority2

共享同一节点的节点,我想将它们组合起来。这是我想要实现的目标。在这种情况下,10 和 190 分别是 31、130、204 和 240 的公共节点。

这是我尝试过的代码。

for node1, node2 in Graph2.edges():
    if Graph1.has_edge(node1, node2):
        for attr in Graph2.adj[node1][node2]:
            if (Graph1.node[node1]['priority']==1):

                name = str(node1) + '/' + str(node2)            
                mapping = {n1: name, node2: name}
                Graph2 =nx.relabel_nodes(Graph2, mapping)

    pos1 = nx.shell_layout(Graph2) 

    nodes = nx.draw_networkx_nodes(Graph2, pos1, node_size=2000, node_color = 'b' , alpha=0.3, with_labels = True) 
    nx.draw_networkx_edges(Graph2, pos1, width=1.5, alpha=0.3, edge_color='k')
    nx.draw_networkx_labels(Graph2, pos1, font_size=15, font_family='sans-serif')  

谁能帮我实现这一点,好吗?

非常感谢!!

【问题讨论】:

  • 你的图表有非常奇特的结构吗?您要解决的问题称为查找graph homomorphism,这对于大型图来说很难。此外,在您的特定情况下,映射很容易模棱两可。想象一下你的graph 1 有另一个节点,比如42,还有另外两条边,(10, 42)(42, 190)。您如何将graph 2 映射到此图,该图现在有两个三角形而不是一个。
  • 亲爱的@PaulBrodersen 感谢您的回复。我有一个特定的结构,我并不专注于节点号。相反,正如我上面所说,我专注于他们的优先事项。例如,蓝色的是priority 1,黄色的是priority 2。如果节点42priority 2 怎么办?你认为这样做也很模棱两可吗?还有一个问题,图同态是 np-complete 吗?
  • 关于你的第一个问题,我只想提出一个问题,首先可能没有明确的映射。这是否正确在很大程度上取决于图表的形状。您的“优先级”可能会或可能不会消除所有这些情况的歧义,但给出一个很难说的例子。如果我是你,我会看一堆例子,说服自己总是有一个正确的解决方案,然后可能会用更多的例子来扩展这个问题,或者更好:解释为什么映射总是明确的。
  • 关于你的秒问题:是的,一般情况是NP完全的,但是有很多特殊情况可以在多项式时间内解决。
  • 感谢您的时间和解释,先生!

标签: python graph networkx


【解决方案1】:

对于那些正在寻找类似解决方案的人,我尝试为优先级 1 解决上述问题,这意味着对于具有蓝色的节点。其余的优先事项也是如此。这里优先级和名称是我的图形属性。

    try:
        for n1, n2, attr in list(graph1.edges(data ='True')):
            for x1, x2, attr1 in list(graph2.edges(data ='True')):
                if ((graph1.node[n1]['priority'] ==1) & (graph1.node[n1]['name'] =='Start')):
                    if ((graph2.node[x1]['priority'] ==1) & (graph2.node[x1]['name'] =='Start')):

                        name1 = str(n1) + '/' + str(x1)
                        mapping1 = {n1: name1, x1:name1}
                        graph1 =nx.relabel_nodes(graph1, mapping1)
                        graph2 =nx.relabel_nodes(graph2, mapping1)


    except KeyError:
        print('')   

    try:
        for n1, n2, attr in list(graph1.edges(data ='True')):
            for x1, x2, attr1 in list(graph2.edges(data ='True')):
                if ((graph1.node[n2]['priority'] ==1) & (graph1.node[n2]['name'] =='End')):
                    if ((graph2.node[x2]['priority'] ==1) & (graph2.node[x2]['name'] =='End')):

                        name1 = str(n2) + '/' + str(x2)
                        mapping1 = {n2: name1, x2:name1}
                        graph1 =nx.relabel_nodes(graph1, mapping1)
                        graph2 =nx.relabel_nodes(graph2, mapping1)


    except KeyError: 
        print('')  

【讨论】:

    猜你喜欢
    • 2021-10-28
    • 2016-05-13
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多