如何动态绘制搜索空间树

如何动态绘制搜索空间树

我正在可视化一组二进制变量的搜索空间。我之前已经对三个变量做过这个;现在我将其扩展到六个,但这似乎是一项繁琐的工作。因此,我想知道是否有任何系统/动态的方法来绘制搜索树。例如,我只需提供变量的数量,就会用虚拟名称绘制一棵树。有这样的工具吗?

这是我的三个二进制变量的代码。

\begin{figure}[htp]
\begin{center}
\begin{tikzpicture}[scale=.8,level/.style={sibling distance=40mm/#1},node distance=1cm]
\node [circle,draw] (root){$$}
    child {node (a)at (0,.5){$1$}
        child {node  (ab){$2$}
        child {node (abc){$3$}}
        child {node (abc2){$4$}}
        }
        child {node  (ab2){$5$}
            child {node (ab2c) at(0.3,0){$6$}}
            child {node (ab2c2){$7$}}
        }
    }
      child {node (a2)at (0,.5){$8$}
      child {node  (a2b){$9$}
                          child {node at (.2,0) (a2bc){$10$}}
            child {node at(-.2,0) (a2bc2){$11$}}
            }
        child {node  (a2b2){$12$}
                    child {node  (a2b2c){$13$}}
            child {node (a2b2c2){$14$}}
        }
    };
\end{tikzpicture}
\end{center}
\caption{search space}
\label{search_space}
\end{figure}

这将绘制这个

在此处输入图片描述

答案1

这个答案包括一个forest执行。

在一个forest环境中,我们只需要添加一个带有密钥的根节点ary Tree。三个参数是:

  1. 根的值(通常从不显示0)。
  2. 每个节点的子节点数量(在您的示例中2)。
  3. 最高级别(在您的示例中3);请注意根节点位于级别 0。

ary Tree样式会自动添加#2子项(参见repeat键),所有子项均使用该ary Tree选项,但以其父项的值作为第一个参数。

用于在content键中设置节点的值。公式为:

<value of the parent node> + 1 + (<i> - 1) * <Sum>

这里,<i>只是一个表示子节点的整数(第一个子节点是<i> = 1,第二个有<i> = 2,依此类推)。<sum>是当前级别节点的子节点和子节点的子节点之和。此总和是针对根节点的每个所需级别计算的ary Tree calc。(还存在一个\foreach-less 解决方案,它使用基本的 TeX 循环和计数器,并且没有任何全局宏。)

aryTree通过键定义的函数用于declare function使用构造level()中已评估的值来访问该总和值\csname …\endcsname

我在最后一个例子中添加了选项calign=first,在我看来,这更好地展示了树的算法。(不要问我为什么delay每个额外的级别都需要一个附加选项。)

代码

\documentclass[tikz]{standalone}
\usepackage{forest}
\tikzset{
  declare function={aryTree(\aryLevel)=\csname aryTree@level@\aryLevel\endcsname;}}
\forestset{
  ary Tree node/.style={node options={align=center}},
  setup ary Tree nodes/.style 2 args={
    ary Tree node/.append style={node options={text width={width("#1")},#2}}},
  ary Tree root/.style={node options={circle, draw, inner sep=+0pt, minimum size=+1em}},
  ary Tree calc/.code 2 args={%
    \expandafter\def\csname aryTree@level@\the\numexpr#2+1\relax\endcsname{0}%
    \foreach \aryLevel in {#2,...,1}{%
      \pgfmathparse
      {(#1)^(#2-\aryLevel)+\csname aryTree@level@\the\numexpr\aryLevel+1\relax\endcsname}%
      \global\expandafter\let\csname aryTree@level@\aryLevel\endcsname\pgfmathresult}},
  ary Tree/.style n args={3}{% #1 = parent value, #2 = children per node, #3 = level
    if={level()>0}{
      content/.pgfmath={int(#1 + 1 + (n() - 1) * aryTree(level()))},
      ary Tree node
    }{ary Tree calc={#2}{#3}},
    if/.expanded={level()<#3}{
      repeat={#2}{
        append={[,ary Tree={\forestove{content}}{#2}{#3}]}}}{}}}
\begin{document}
\begin{forest} setup ary Tree nodes={00}{}
[,ary Tree={0}{2}{3}, ary Tree root]
\end{forest}
\begin{forest} setup ary Tree nodes={00}{inner ysep=+2pt}, 
               ary Tree node/.append style={s sep=+0pt}
[,ary Tree={0}{3}{3}, ary Tree root]
\end{forest}
\begin{forest} setup ary Tree nodes={00}{inner ysep=+2pt},
               ary Tree node/.append style={s sep=+0pt},
               delay={for tree={calign=first}}
[,ary Tree={0}{4}{2}, ary Tree root]
\end{forest}
\end{document}

输出

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

ary Tree={0}{4}{4}

相关内容