上記のアイデアに基づいて、20 ノードのラベル付きランダム ツリーを生成する方法を次に示します (図 3 python
)。
- セット {1,2,...,20} から選択された各要素を持つ、ランダムに生成された長さ 18 のシーケンスから開始します。
- 生成された文字列を 20 個の頂点上の完全なグラフ K20 のスパニング ツリーの Prufer シーケンスとして使用し、次のアルゴリズムを使用して対応するラベル付きツリーを生成します (常に 1 対 1 の対応があるため) (ここから)。
次のコード スニペットは、上記のアルゴリズムを実装して、(エッジを計算することにより) プルーファー シーケンスが与えられたラベル付きツリーを生成します。
def get_tree(S):
n = len(S)
L = set(range(1, n+2+1))
tree_edges = []
for i in range(n):
u, v = S[0], min(L - set(S))
S.pop(0)
L.remove(v)
tree_edges.append((u,v))
tree_edges.append((L.pop(), L.pop()))
return tree_edges
これで、常にプルファー シーケンス (長さ n-2) をランダムに生成し、続いて対応するスパニング ツリー (n 頂点上) を生成できます。これは、ランダム ツリーとして機能します ( n^(n-2) Kn のスパニング ツリー)。
n = 20 # Kn with n vertices
N = 25 # generate 25 random trees with 20 vertices (as spanning trees of K20)
for i in range(N):
S = np.random.choice(range(1,n+1), n-2, replace=True).tolist()
T_E = get_tree(S) # the spanning tree corresponding to S
# plot the tree generated (with `networkx`, e.g.,)
次のアニメーションは、このようにランダムに生成された 20 個のノードを持つラベル付きツリーをいくつか示しています。