0

これは私の前の質問へのフォローアップです。

問題は、無向グラフの作成中にノードがエッジ リストに保存される順序です。以下のコードを使用して作成されたグラフがあります。単純なグラフが作成され、既存の 2 つのノード間に新しいノードとエッジが追加されます。

import networkx as nx
import matplotlib.pyplot as plt
from pprint import pprint

G = nx.OrderedGraph()
head_nodes = range(0, 9)
tail_nodes = range(1, 10)
edge_ls = list(zip(head_nodes, tail_nodes))
G.add_nodes_from(range(0, 10))
G.add_edges_from(edge_ls)

head = 0
tail = 1
G.remove_edge(head, tail)
Nnodes = G.number_of_nodes()
newnodes = [head, Nnodes+1, Nnodes+2, Nnodes+3, tail] # head and tail already exists
newedges = [(x, y) for x, y in zip(newnodes[0:len(newnodes)-1], newnodes[1:len(newnodes)])]
G.add_edges_from(newedges)
I = nx.incidence_matrix(G)
pprint(I)
pprint(G.edges())
nx.draw(G, with_labels=True)
plt.show()

無向グラフを使用した場合の出力は次のとおりです。

EdgeView([(0, 11), (1, 2), (1, 13), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13)])

出力から、G.add_edge(13,1) を使用して作成されたエッジが (1,13) として表示されていることがわかります。グラフが無向であるため、これが発生することを理解しています。

有向グラフ (G.OrderedDiGraph) を使用すると、出力は次のようになります。

EdgeView([(0, 11), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (12, 13), (13, 1)])

(13, 1) は、期待どおりの結果です。

ただし、Networkxがユーザー入力である (u,v) から (v,u) にノードを並べ替えるのを避けることができるように、ノードに名前を付けることができる特定の方法があるかどうかを知りたいです。無向グラフ。

編集:diGraphが次の結果をもたらす このような入力があるため、diGraphの使用を避けていますここに画像の説明を入力

この有向グラフでは、ノード 24 と 28 の入次数と出次数の合計が 1 になります。ただし、異なるルートが存在するトラフィック ネットワークの単方向フローと同様に、ノード 24 からノード 28 に矢印を向けたいと思います。ポイント 24 からポイント 28 に流れるトラフィック。Networkx の diGraph によって作成された方向は、私の実際のシステムを表していません。したがって、私は diGraph を使用したくありません。

4

2 に答える 2