【问题标题】:How to fix inconsistent labelling of edges/nodes in Python's networkx?如何修复 Python networkx 中边缘/节点的标签不一致?
【发布时间】:2020-06-23 15:21:23
【问题描述】:

我想为图上的最大切割问题定义一个目标函数。我使用以下表达式,0.5*sum([w[i,j]*(1-spin[i]*spin[j]) for i,j in G.edges]) 其中G 是networkx 图,w 是从该图(连接矩阵)生成的 numpy 矩阵,spin 是一个数组,其条目为 -1 或 1,表示哪个节点所在分区的一侧。

我认为很好,但事实证明边缘的标记与节点的标记不一致,请参见下面的代码。例如在图 G1 中,边权重w[1,5] 为 0,即使边 (1,5) 在图中。有关如何解决此问题的任何建议?

干杯

import networkx as nx

G1 = nx.random_regular_graph(3,6, seed = 1)
G2 = nx.random_regular_graph(3,6, seed = 1)

# labelling seems not to be conserved when transforming to matrix and back
G2 = nx.to_numpy_matrix(G2)
G2 = nx.from_numpy_matrix(G2)

print(nx.to_numpy_matrix(G1))
print(G1.edges)
print(nx.to_numpy_matrix(G2))
print(G2.edges)

输出

[[0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0.]] # matrix of G1

[(0, 1), (0, 4), (0, 3), (1, 2), (1, 5), (2, 3), (2, 4), (4, 5), (5, 3)] # edges of G1

[[0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0.]] # matrix of G2
[(0, 1), (0, 3), (0, 5), (1, 2), (1, 4), (2, 3), (2, 5), (3, 4), (4, 5)] # edges of G2

【问题讨论】:

  • 您能否将您的代码包含为文本而不是图形?此外,如果您添加代码来创建图表,则更容易重现并为您提供解决方案。

标签: python python-3.x networkx mathematical-optimization


【解决方案1】:

to_numpy_matrix 文档中所述,如果未使用参数nodelist,则该方法隐式使用G.nodes() 的排序。

使用以下代码应该可以解决排序问题

nx.to_numpy_matrix(G, nodelist=sorted(G))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 2023-04-05
    • 1970-01-01
    • 2021-01-02
    相关资源
    最近更新 更多