我正在可视化一组二进制变量的搜索空间。我之前已经对三个变量做过这个;现在我将其扩展到六个,但这似乎是一项繁琐的工作。因此,我想知道是否有任何系统/动态的方法来绘制搜索树。例如,我只需提供变量的数量,就会用虚拟名称绘制一棵树。有这样的工具吗?
这是我的三个二进制变量的代码。
\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
。三个参数是:
- 根的值(通常从不显示
0
)。 - 每个节点的子节点数量(在您的示例中
2
)。 - 最高级别(在您的示例中
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}