グラフの作成を、各内部ノードの任意の深さと任意の数の子に一般化できます。
レベルの番号付けを0から開始すると(つまり、ルートノードはレベル0を表します)、各レベルにはn個のレベルノードが含まれます。
nは、各内部ノードの子の数です。
したがって、各レベルの最初と最後のノードのインデックスを識別できます。
たとえば、n = 10の場合、レベル0、1、2、3の最後のノードは
10 0 =
1、10 0 + 10 1 = 11、10
0 + 10 1 + 10 2 = 111、10 0 +10
です。 1 + 10 2 + 10 3 =1111。
特定のノードの子のインデックスを見つけるには、そのレベルの最後のノードのインデックスを取得し、オフセットを追加します。
指定されたノードがそのレベルの最初の(左端の)ノードである
場合、オフセットは0です。そのレベルの最後のノードである場合、オフセットは(nレベル-1)*nです。
その場合、(nレベル-1)は、そのレベルの先行ノードの数です。
一般に、オフセットは[そのレベルの先行ノードの数]*nとして計算されます。
この概念は、コードでとしてカバーされていますoffset = ulim + i * n + 1
。fromの代わりにfromでループできるように
追加しました。1
0 - (n-1)
1 - n
import networkx as nx
n = 10 # the number of children for each node
depth = 3 # number of levels, starting from 0
G = nx.Graph()
G.add_node(1) # initialize root
ulim = 0
for level in range(depth): # loop over each level
nl = n**level # number of nodes on a given level
llim = ulim + 1 # index of first node on a given level
ulim = ulim + nl # index of last node on a given level
for i in range(nl): # loop over nodes (parents) on a given level
parent = llim + i
offset = ulim + i * n + 1 # index pointing to node just before first child
for j in range(n): # loop over children for a given node (parent)
child = offset + j
G.add_node(child)
G.add_edge(parent, child)
# show the results
print '{:d}-{:d}'.format(parent, child),
print ''
print '---------'
depth = 3
とこれはn = 3
出力です:
1-2 1-3 1-4
---------
2-5 2-6 2-7
3-8 3-9 3-10
4-11 4-12 4-13
---------
5-14 5-15 5-16
6-17 6-18 6-19
7-20 7-21 7-22
8-23 8-24 8-25
9-26 9-27 9-28
10-29 10-30 10-31
11-32 11-33 11-34
12-35 12-36 12-37
13-38 13-39 13-40
---------