Graph Mathematica中具有特定分支因子的随机树

Graph Mathematica中具有特定分支因子的随机树,graph,tree,wolfram-mathematica,Graph,Tree,Wolfram Mathematica,你知道有没有可能生成一个带有特定分支因子的随机树图?我不希望它是k元树 如果我能定义分支因子和最大深度,那也太好了。我想随机生成一组在分支因子和深度上不同的树 带有随机整数输入的TreePlot返回的内容几乎就是我想要的: TreePlot[RandomInteger[#] -> # + 1 & /@ Range[0, 100]] 但是我想不出一种方法来得到一棵具有特定分支因子的树 谢谢 我想我有点晚了,但我喜欢这个问题。而不是在表单中创建树 {0 -> 1, 0 -&g

你知道有没有可能生成一个带有特定分支因子的随机树图?我不希望它是k元树

如果我能定义分支因子和最大深度,那也太好了。我想随机生成一组在分支因子和深度上不同的树

带有随机整数输入的TreePlot返回的内容几乎就是我想要的:

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

但是我想不出一种方法来得到一棵具有特定分支因子的树


谢谢

我想我有点晚了,但我喜欢这个问题。而不是在表单中创建树

{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
,该函数提供随机数目的子节点,并在创建节点时调用。此外,我们还有一个depth
d
,它定义了(子)树可以具有的最大深度

  • [选择分支]定义一个分支函数
    f
    ,该函数可以像
    f[]
    一样调用,并返回随机数目的子函数。如果您想要一个包含2个或4个子树,您可以使用例如
    f[]:=RandomChoice[{2,4}]
    。将为树中创建的每个节点调用此函数

  • [选择树深度]选择树的最大深度
    d
    。在这一点上,我不确定您希望将随机性纳入到树的生成中。我在这里要做的是,当创建一个新节点时,它下面的树的深度是在其父节点的深度减1到0之间随机选择的

  • [创建ID计数器]创建一个唯一的计数器变量
    count
    ,并将其设置为零。这将增加节点ID。创建新节点时,它将增加1

  • [创建节点]增加
    计数
    并将其用作节点ID。如果当前深度
    d
    为零,则返回一个带有ID计数的叶,否则调用
    f
    以决定节点应获得多少子节点。对于每个新孩子,随机选择其子树的深度,可以是
    0,…,d-1
    ,然后调用4。为每一个新生的孩子。当所有递归调用都返回时,将构建树

  • 幸运的是,在Mathematica代码中,这个过程没有那么冗长,只包含几行。我希望您能在代码中找到我上面描述的内容

    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++);
    ]
    
    现在您可以创建一个随机树,如下所示

    branching[] := RandomChoice[{2, 4}];
    t = generateTree[branching, 6];
    TreeForm[t]
    

    或者,如果您愿意,可以使用下一个函数将树转换为
    TreePlot

    transformTree[tree_] := Module[{transform},
      transform[(n_Integer)[childs__]] := (Sow[
         n -> # & /@ ({childs} /. h_Integer[__] :> h)]; 
        transform /@ {childs});
      Flatten@Last@Reap[transform[tree]
    ]
    
    并使用它创建许多随机树

    trees = Table[generateTree[branching, depth], {depth, 3, 7}, {5}];
    GraphicsGrid[Map[TreePlot[transformTree[#]] &, trees, {2}]]