游戏树 - 我的代码可以改进吗?

游戏树 - 我的代码可以改进吗?

我制作了这棵游戏树:

在此处输入图片描述

上述输出的 MWE:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}


    \tikzset{
        % Two node styles for game trees: solid and hollow
        solid/.style={circle,draw,inner sep=1,fill=black},
        hollow/.style={circle,draw,inner sep=1}
    }

    \begin{center}
        \begin{tikzpicture}[font=\scriptsize]
        \newcommand{\payoff}[4][below]{\node[#1]at(#2){$(#3,#4)$};}
        \tikzstyle{level 1}=[level distance=15mm,sibling distance=72mm]
        \tikzstyle{level 2}=[level distance=15mm,sibling distance=36mm]
        \tikzstyle{level 3}=[level distance=15mm,sibling distance=18mm]
        \tikzstyle{level 4}=[level distance=15mm,sibling distance=9mm]

        \node(0)[solid]{}
        child{node(1)[solid]{}
            child{node[solid]{} 
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[left]{C}}
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[right]{D}}
                edge from parent node[left]{C}}
            child{node[solid]{} 
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[left]{C}}
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[right]{D}}
                edge from parent node[right]{D}}
            edge from parent node[left,xshift=-3]{C}
        }
        child{node(2)[solid]{}
            child{node[solid]{} 
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[left]{C}}
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[right]{D}}
                edge from parent node[left]{C}}
            child{node[solid]{} 
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[left]{C}}
                child{node[solid]{} 
                    child{node[solid]{} edge from parent node[left]{C}}
                    child{node[solid]{} edge from parent node[right]{D}}
                    edge from parent node[right]{D}}
                edge from parent node[right]{D}}
            edge from parent node[right,xshift=3]{D}
        };
        \draw[rounded corners=7,dashed]($(1-1)+(-.2,.2)$)rectangle($(2-2)+(.2,-.2)$);
        \draw[rounded corners=7,dashed]($(0)+(-.2,.2)$)rectangle($(0)+(.2,-.2)$);
        \payoff{1-1-1-1}44
        \payoff{1-1-1-2}15
        \payoff{1-1-2-1}51
        \payoff{1-1-2-2}22
        \payoff{1-2-1-1}15
        \payoff{1-2-1-2}{-2}6
        \payoff{1-2-2-1}22
        \payoff{1-2-2-2}{-1}3
        \payoff{2-1-1-1}51
        \payoff{2-1-1-2}22
        \payoff{2-1-2-1}6{-2}
        \payoff{2-1-2-2}3{-1}
        \payoff{2-2-1-1}22
        \payoff{2-2-1-2}{-1}3
        \payoff{2-2-2-1}3{-1}
        \payoff{2-2-2-2}00
        \end{tikzpicture}
    \end{center}


\end{document}

使用这里演示的技术,我可以毫不费力地制作出类似的游戏树,但如果可能的话,我想知道是否有任何事情我做得不够高效,需要改进。

具体来说,是否有更简单的方法来:

  1. 生成多级游戏树(> 4 级),无需一系列极其深层的嵌套参数。
  2. 当我添加更多级别时自动处理sibling distance- 在这种情况下,每次我添加新级别时,我都必须手动扩大先前级别上的兄弟之间的距离。

非常感激!

答案1

这里有一种方法可以改善它:切换到森林。这样你就不太可能因为所有的嵌套而发疯。而且你可以用编程的方式设置边缘标签。你也可以用编程的方式设置最低行的数字如果有一个公式可以决定它们。我无法猜到。

\documentclass{article} 
\usepackage[edges]{forest}
\usepackage[outline]{contour}
\usetikzlibrary{fit,shapes.misc,arrows.meta}
\begin{document}
\begin{forest}
for tree={s sep=0cm,l sep=1.2cm,font=\scriptsize,
where n children=0{edge={thick,-{Circle}}}{circle,fill,inner sep=0pt,minimum size=2mm},
where n=1{edge label={node[midway,above left=0pt,font=\scriptsize]{C}}}{edge
label={node[midway,above right=0pt,font=\scriptsize]{D}}},
edge={thick}
}
  [,alias=T
   [
    [,alias=L
     [
      [{$(4,4)$}]
      [{$(1,5)$}]
     ]
     [
      [{$(5,1)$}]
      [{$(2,2)$}]
     ]
    ]
    [
     [
      [{$(1,5)$}]
      [{$(-2,6)$}]
     ]
     [
      [{$(2,2)$}]
      [{$(-1,3)$}]
     ]
    ]
   ]
   [
    [
     [
      [{$(5,1)$}]
      [{$(2,2)$}]
     ]
     [
      [{$(6,-2)$}]
      [{$(3,-1)$}]
     ]
    ]
    [,alias=R
     [
      [{$(2,2)$}]
      [{$(-1,3)$}]
     ]
     [
      [{$(3,-1)$}]
      [{$(0,0)$}]
     ]
    ]
   ]
  ]
\node[draw,dashed,rounded rectangle,fit=(L) (R)]{};  
\node[draw,dashed,circle,fit=(T)]{};  
\end{forest}
\end{document}

在此处输入图片描述

如何为这棵树添加另一行?一种选择是垂直排列最后一行的整数。除其他外,这将允许您为数字添加解释,我只是用它,mystical number因为我不知道数字是如何从位置得出的,但答案当然可能很复杂或没有关系,所以请用mystical number更合适的东西替换。

\documentclass{article} 
\usepackage[edges]{forest}
\usepackage[outline]{contour}
\usetikzlibrary{fit,shapes.misc,arrows.meta,positioning}
\begin{document}
\begin{forest}
for tree={s sep=0.1cm,l sep=1.2cm,font=\scriptsize,
where n children=0{align=center,draw,edge={thick,-{Circle}}}{circle,fill,inner sep=0pt,minimum size=2mm},
where n=1{edge label={node[midway,above left=0pt,font=\scriptsize]{C}}}{edge
label={node[midway,above right=0pt,font=\scriptsize]{D}}},
edge={thick}
}
  [,alias=T
   [
    [,alias=L
     [
      [{$4$\\ $4$},alias=very left]
      [{$1$\\ $5$}]
     ]
     [
      [{$5$\\ $1$}]
      [{$2$\\ $2$}]
     ]
    ]
    [
     [
      [{$1$\\ $5$}]
      [{$-2$\\ $6$}]
     ]
     [
      [{$2$\\ $2$}]
      [{$-1$\\ $3$}]
     ]
    ]
   ]
   [
    [
     [
      [{$5$\\ $1$}]
      [{$2$\\ $2$}]
     ]
     [
      [{$6$\\ $-2$}]
      [{$3$\\ $-1$}]
     ]
    ]
    [,alias=R
     [
      [{$2$\\ $2$}]
      [{$-1$\\ $3$}]
     ]
     [
      [{$3$\\ $-1$}]
      [{$0$\\ $0$}]
     ]
    ]
   ]
  ]
\node[draw,dashed,rounded rectangle,fit=(L) (R)]{};  
\node[draw,dashed,circle,fit=(T)]{};  
\node[left=1mm of very left,align=right,font=\scriptsize]{mystical \# 1\\
mystical \# 2};
\end{forest}
\end{document}

在此处输入图片描述

此外,您可以考虑采用一些标准技巧,例如-1用替换\overline{1},这有时是为了节省水平空间。

您可能想知道是否可以用更简单的东西来代替所有这些。绘制树真正需要的只是层数。答案是:是的,有所谓的“Lindenmayer 系统绘图库”,它在 pgfmanual 的第 55 节中进行了描述。这允许您以更少的努力绘制自重复结构。但是,除非您就此提出(单独的)问题,否则我不会详细说明这一点。

答案2

编辑:

\xtInfosetO在版本 2 中得到增强istgame,从而产生更好的输出。因此在这次编辑中对生成的图像进行了更改。


这是另一种使用方法istgame包,利用它你可以简单地连接父子树来绘制整棵树。

在此处输入图片描述

\documentclass{standalone}

\usepackage{istgame}

\begin{document}

\begin{istgame}[font=\scriptsize]
\xtShowEndPoints
\def\mysibdist{72mm}
\xtdistance{15mm}{\mysibdist}
\istroot(0)
  \istb{C}[al] \istb{D}[ar] \endist
\xtInfosetO(0)(0)
\xtdistance{15mm}{\mysibdist/2}
\istroot(a)(0-1)
  \istb{C}[al] \istb{D}[ar] \endist
\istroot(b)(0-2)
  \istb{C}[al] \istb{D}[ar] \endist
\xtdistance{15mm}{\mysibdist/4}
\istroot(a1)(a-1)
  \istb{C}[al] \istb{D}[ar] \endist
\istroot(a2)(a-2)
  \istb{C}[al] \istb{D}[ar] \endist
\istroot(b1)(b-1)
  \istb{C}[al] \istb{D}[ar] \endist
\istroot(b2)(b-2)
  \istb{C}[al] \istb{D}[ar] \endist
\xtInfosetO(a1)(b2)
\xtdistance{15mm}{\mysibdist/8}
\istroot(a11)(a1-1)
  \istb{C}[l]{(4,4)} \istb{D}[r]{(1,5)} \endist
\istroot(a12)(a1-2)
  \istb{C}[l]{(5,1)} \istb{D}[r]{(2,2)} \endist
\istroot(a21)(a2-1)
  \istb{C}[l]{(1,5)} \istb{D}[r]{(-2,6)} \endist
\istroot(a22)(a2-2)
  \istb{C}[l]{(2,2)} \istb{D}[r]{(-1,3)} \endist
\istroot(b11)(b1-1)
  \istb{C}[l]{(5,1)} \istb{D}[r]{(2,2)} \endist
\istroot(b12)(b1-2)
  \istb{C}[l]{(6,-2)} \istb{D}[r]{(3,-1)} \endist
\istroot(b21)(b2-1)
  \istb{C}[l]{(2,2)} \istb{D}[r]{(-1,3)} \endist
\istroot(b22)(b2-2)
  \istb{C}[l]{(3,-1)} \istb{D}[r]{(0,0)} \endist
\end{istgame}

\end{document}

相关内容