PythonでNetworkXをつかう

networkxのDiGraphの枝に対してデータを覚えておくためには,枝をキーとした辞書を使うことができる.がんばれば,DiGraphの枝自体に辞書としてデータを持たせることはできるけど,あえてDiGraphの外に辞書を用意して,枝をキーとして覚えておく方が便利なことを多いかもしれない.

MultiDiGraph - ループも並行枝もゆるす有向グラフ 参考ページ

>>>G=nx.MultiDiGraph()
>>>G.add_node(1);
>>>G.add_edge(1,2);
>>>G.add_edges_from([(4,5,dict(route=282)),(4,5,dict(route=37))])
>>>G[4]
  {5:{0:{'route':282},1:{'route':37}}}
枝を特定するには,キーを使う.キーは,デフォルトでは,未使用の整数で一番小さいもの.ノード4からノード5への枝は,G[4][5]で得られる.
>>>G[4][5]
   {0:{'route':282},1:{'route':37}}
これから,ノード4からノード5には二本の枝があって,最初の枝(キー0)にはrouteというキーで282という値が与えられており,二番目の枝(キー1)にはrouteというキーで37という値が与えられていることがわかる.G[4][5]は辞書だから,次のコードで辞書の要素を列挙できる
>>> for i in G[4][5]:
       print G[4][5][i]
    {'route':282}
    {'route':37}

G.add_edges_from()も使える,


edges=[]
edges+=[(1,2,dict(time=1,cost=5))]
edges+=[(1,2,dict(time=2,cost=7))]
edges+=[(1,3,dict(time=4,cost=2))]
edges+=[(2,3,dict(time=1,cost=2))]
edges+=[(2,3,dict(time=2,cost=3))]
edges+=[(2,4,dict(time=3,cost=2))]
edges+=[(3,4,dict(time=1,cost=5))]
G.add_weighted_edges_from(edges)
for n in G.nodes_iter():
    for m in G[n]:
        print "tail:"n," head:",m," G[n][m]:",G[n][m]
最後の3行は,ノードペアに対する枝を表示する.始点がn, 終点がmの枝はG[n][m]で得られる.例えば

>>> G[1][2]
   {0:{'weight':{'cost':5,'speed':1}},1:{'weight':{'cost':10,'speed':2}}}
となる.


有向枝(s,a)をグラフに追加し,その枝に付随する値cost=10.0, time=100.0を記憶させる
import networkx as nx
G=nx.Graph()
sedge=[]
sedge+=[ ("s","a",0.0 ) ]
G.add_weighted_edges_from(sedge)
G['s']['a']['cost']=10.0
G['s']['a']['time']=100.0

ノードを表示する
for n in G.nodes_iter():
     print n

ノードごとの枝を表示する
for n in G.nodes_iter():
    for d in G[n]:
            print "n:",n," d:",d