私は少し遅れたと思いますが、私は質問が好きです。代わりに、フォームのツリーを作成するの
{0 -> 1, 0 -> 5, 1 -> 2, 1 -> 3, 1 -> 4}
私は、すべての引数が
0[1[2, 3, 4], 5]
どちらの形式が等価であるとすることができ、他のノードを表し、子、ネストされた呼び出し、次の形式を使用します。お互いに変身した。ここで
Row[{
TreeForm[0[1[2, 3, 4], 5]],
TreePlot[{0 -> 1, 0 -> 5, 1 -> 2, 1 -> 3, 1 -> 4}]
}]
アルゴリズムがどのように動作するかです:引数として、私たちは子どもたちの乱数を与え、我々はノードを作成するときに呼び出される関数f
を必要としています。さらに、深さはd
で、a(サブ)ツリーが持つことができる最大の深さを定義します。
[分岐選択]はf[]
のように呼ばれ、子供たちの乱数を返すことができる分岐機能f
を定義します。 2つまたは4つの子を持つツリーが必要な場合は、たとえばf[] := RandomChoice[{2, 4}]
。この関数は、ツリー内に作成されたノードごとに呼び出されます。
[ツリー深度を選択]ツリーの最大深さをd
から選択してください。この時点では、ツリーの生成にランダム性を組み込むことをあなたが何を望んでいるのかはわかりません。私がここで行うのは、新しいノードが作成されると、その下のツリーの深さが、親の深さから1を引いたものからゼロまでの間でランダムに選択されるということです。
[Create ID Counter]一意のカウンタ変数count
を作成してゼロに設定します。これによりノードIDが増加します。新しいノードを作成するときは、1だけ増加します。 count
をノードIDとして増加します。現在の深さがd
の場合は、IDカウントのリーフを戻します。それ以外の場合は、f
を呼び出して、ノードの数を決定します。すべての新しい子供は、サブツリーの深さをランダムに選択しました。その深さは0,...,d-1
となり、新しい子供のそれぞれについて4となります。すべての再帰呼び出しが返されると、ツリーが構築されます。
幸い、Mathematicaの -codeに、この手順はそれほど冗長ではなく、わずか数行で構成されています。私は
branching[] := RandomChoice[{2, 4}];
t = generateTree[branching, 6];
TreeForm[t]
それともあなたが好きな場合は、次を使用することができますが、次のように今、あなたはランダムなツリーを作成することができますが、私は
With[{counter = Unique[]},
generateTree[f_, d_] := (counter = 0; builder[f, d]);
builder[f_, d_] := Block[
{nodeID = counter++, childs = builder[f, #] & /@ RandomInteger[d - 1, f[]]},
nodeID @@ childs
];
builder[f_, 0] := (counter++);
]
前述してきたどのようなコードで見つけることができることを望みますツリーを受け入れられるものに変換する関数TreePlot
transformTree[tree_] := Module[{transform},
transform[(n_Integer)[childs__]] := (Sow[
n -> # & /@ ({childs} /. h_Integer[__] :> h)];
transform /@ {childs});
[email protected]@Reap[transform[tree]
]
と
trees = Table[generateTree[branching, depth], {depth, 3, 7}, {5}];
GraphicsGrid[Map[TreePlot[transformTree[#]] &, trees, {2}]]
多くのランダムなツリーを作成するために使用