2013-06-19 7 views
5

特定の分岐ファクタを持つランダムツリーグラフを何らかの形で生成できるかどうか知っていますか?私はそれをk-aryツリーにしたくありません。Mathematicaの特定の分岐ファクタを持つランダムツリー

もし私が分岐因子と最大深さの両方を定義することができればそれは素晴らしいことかもしれません。分岐要素と深さが違う木々をランダムに生成したい。ランダムな整数を入力した

TreePlotは、私が欲しいほとんど何の何かを返します。

TreePlot[RandomInteger[#] -> # + 1 & /@ Range[0, 100]] 

TreePlot result

を私は特定の分岐率でツリーを取得する方法を把握することはできません。

ありがとうございます!

答えて

3

私は少し遅れたと思いますが、私は質問が好きです。代わりに、フォームのツリーを作成するの

{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}] 
    }] 

Tree

アルゴリズムがどのように動作するかです:引数として、私たちは子どもたちの乱数を与え、我々はノードを作成するときに呼び出される関数fを必要としています。さらに、深さはdで、a(サブ)ツリーが持つことができる最大の深さを定義します。

  1. [分岐選択]f[]のように呼ばれ、子供たちの乱数を返すことができる分岐機能fを定義します。 2つまたは4つの子を持つツリーが必要な場合は、たとえばf[] := RandomChoice[{2, 4}]。この関数は、ツリー内に作成されたノードごとに呼び出されます。

  2. [ツリー深度を選択]ツリーの最大深さをdから選択してください。この時点では、ツリーの生成にランダム性を組み込むことをあなたが何を望んでいるのかはわかりません。私がここで行うのは、新しいノードが作成されると、その下のツリーの深さが、親の深さから1を引いたものからゼロまでの間でランダムに選択されるということです。

  3. [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] 

Mathematica graphics

それともあなたが好きな場合は、次を使用することができますが、次のように今、あなたはランダムなツリーを作成することができますが、私は

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}]] 

Mathematica graphics

多くのランダムなツリーを作成するために使用
関連する問題