Verzweigungs- und Bindungsbaum in Tikz

Verzweigungs- und Bindungsbaum in Tikz

Ich versuche, einen Baum zu erstellen, der den Branch-and-Bound-Prozess für ein ganzzahliges Programmierproblem in Tikz zeigt. Ich habe es geschafft, einen Baum mit der ersten Ebene genau so zu erstellen, wie ich es wollte, aber Latex kann den Baum mit der zweiten Ebene nicht kompilieren, und ich bin mir nicht sicher. Mein Code ist sehr schlecht optimiert, da dies die einzige Möglichkeit war, wie ich es herausfinden konnte, und der chaotische Code macht es schwierig, genau zu bestimmen, wo ich einen Fehler mache.

Es wäre großartig, wenn mir jemand einen Weg zeigen könnte, den Code zu bereinigen, sodass die meisten Knotendetails in der Vordefinition sind, oder mir zeigen könnte, wo ich im zweiten Baum einen Fehler mache.

Code für die erste Ebene:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc, shapes}

\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[
scale = 1.5, transform shape, thick,
tree node/.style = {align=center, inner sep=0pt, text centered, font = 
\scriptsize},
S/.style = {draw, circle, minimum size = 8mm, top color=white, bottom 
color=blue!20},
grow = down,  % alignment of characters
level 1/.style = {sibling distance=3cm},
level 2/.style = {sibling distance=4cm}, 
level 3/.style = {sibling distance=2cm}, 
level distance = 1.25cm]

\node [S, label={[font = \scriptsize]10:950}, label={[font = 
\scriptsize]170:1055.56}] {$S$}
    child{node [S, label={[font = \scriptsize]10:950}, label={[font = 
    \scriptsize]170:1000}] {$S_1$}edge from parent node[above left, font = 
    \scriptsize] {$x \leq 5$}}
    child{node [S, label={[font = \scriptsize]10:950}, label={[font = 
    \scriptsize]170:1033}]
    {$S_2$} edge from parent node[above right, font = \scriptsize] {$x \geq 
    6$}};
\end{tikzpicture}
\end{figure}
\end{document}

Code für die erste und zweite Ebene, der nicht kompiliert werden kann:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc, shapes}

\begin{document}

\begin{figure}
\begin{tikzpicture}[
    scale = 1.5, transform shape, thick,
    tree node/.style = {align=center, inner sep=0pt, text centered, font = 
 \scriptsize},
    S/.style = {draw, circle, minimum size = 8mm, top color=white, bottom 
color=blue!20},
    grow = down,  % alignment of characters
    level 1/.style = {sibling distance=3cm},
    level 2/.style = {sibling distance=4cm}, 
    level 3/.style = {sibling distance=2cm}, 
    level distance = 1.25cm]
\node [S, label={[font = \scriptsize]10:950}, label={[font = 
\scriptsize]170:1055.56}] {$S$}
    child{node [S, label={[font = \scriptsize]10:950}, label={[font = 
    \scriptsize]170:1000}] {$S_1$} edge from parent node[above left, font = 
    \scriptsize] {$x \leq 5$}}
    child{node [S, label={[font = \scriptsize]10:950}, label={[font = 
    \scriptsize]170:1033}]
    {$S_2$} edge from parent node[above right, font = \scriptsize] {$x 
    \geq 6$}
        child{node [S, label={[font = \scriptsize]10:950}, label={[font 
             = \scriptsize]170:1033}]
            {$S_2,1$} edge from parent node[above right, font = \scriptsize] 
            {$x \leq 1$}
        child{node [S, label={[font = \scriptsize]10:950}, label={[font 
             = \scriptsize]170:1033}]
            {$S_2,2$} edge from parent node[above right, font = \scriptsize] 
            {$x \geq 2$}};
\end{tikzpicture}
\end{figure}
\end{document}

Dank im Voraus!

Bearbeiten: Ein Zweig- und gebundener Baum wie der, den ich zu erstellen versuche

Ein verzweigter und gebundener Baum wie der, den ich zu erschaffen versuche

Antwort1

Ich würde eines der spezialisierten Pakete zum Zeichnen von Bäumen verwenden. Genauer gesagt würde ich forestoder verwenden, falls das nicht geht tikz-qtree. Wenn Sie dies tun, können Sie Bäume sehr präzise und einfach angeben und problemlos sicherstellen, dass sie einheitlich formatiert sind.

Im Falle von Forest übernimmt das Paket auch einen Großteil der Layoutarbeit für Sie, obwohl Beschriftungen nicht auf diese Weise behandelt werden, sodass dieser besondere Vorteil für Bäume dieser besonderen Art möglicherweise nicht von großem Nutzen ist.

Hier ist ein Beispiel, das einen branch and boundStil für „Forest“ definiert. Bei Anwendung auf einen Baum passiert Folgendes:

  • tree node, Sund thickwerden auf alle Knoten im Baum angewendet und deren Inhalt wird im Mathematikmodus eingestellt;

  • die Kanten sind auch thick;

  • Dem Baum wird etwas Platz hinzugefügt, um die Äste und Ebenen zu verteilen.

  • nachdem der Baum analysiert wurde, wird der Inhalt jedes Knotens an jedem Doppelpunkt aufgeteilt: <left label>:<node content>:<right label>:<edge label>;

    • Der Teil vor dem ersten Doppelpunkt wird zur linken Beschriftung (bei 170). Der nächste Teil wird als Inhalt des Hauptknotens festgelegt (mit tree node, im Mathematikmodus usw.). Der dritte Teil wird als rechte Beschriftung (bei 10) festgelegt. Der letzte Teil wird zur Beschriftung des Zweigs: links vom Mittelpunkt für einen linken Zweig und rechts für einen rechten.
  • der Inhalt der Randbeschriftungen kann entweder im Textmodus ( text branch labels) oder im Mathematikmodus ( maths branch labels) eingestellt werden;

    • Präfixe und Suffixe können mit einem der folgenden

      • set branch labels={<left branch prefix>}{<left branch suffix>}{<right branch prefix>}{<right branch suffix>}

      • set maths branch labels={<left branch prefix>}{<left branch suffix>}{<right branch prefix>}{<right branch suffix>}

      • set text branch labels={<left branch prefix>}{<left branch suffix>}{<right branch prefix>}{<right branch suffix>}

  • Unter jedem Blatt des Baumes wird eine horizontale Linie gezeichnet.

Dann können wir Ihren zweiten Baum spezifizieren, der jetzt im Lichte der Kommentare bearbeitet wurde, um die Kantenbeschriftungen je nach Ebene zu variieren, mit

\begin{forest}
  branch and bound,
  where level=1{
    set branch labels={x\leq}{}{x\geq}{},
  }{
    if level=2{
      set branch labels={}{\geq y}{}{\leq y},
    }{},
  }
  [1055.56:S:950
    [1000:S_1:950:5
    ]
    [1033:S_2:950:6
      [1033:{S_2,1}:950:1]
      [950:{S_2,2}:1033:2]
    ]
  ]
\end{forest}

Das ist offensichtlich deutlich prägnanter und erzeugt

<code>Verzweigung und Begrenzung</code>-Baum

Ich kenne die Kriterien für diese Art von Baum nicht, daher muss dies möglicherweise ein wenig optimiert werden, damit es gut funktioniert. Beispielsweise haben die Kantenbeschriftungen möglicherweise nicht immer die Form x\leqund x\req, oder es gibt manchmal nur ein oder mehr als zwei untergeordnete Elemente. Dies sollte jedoch zumindest die potenzielle Leistungsfähigkeit dieses Ansatzes veranschaulichen.

Vollständiger Code:

\documentclass[border=10pt]{standalone}
\usepackage{forest}
\tikzset{
  tree node/.style = {align=center, inner sep=0pt, font = \scriptsize},
  S/.style = {draw, circle, minimum size = 8mm, top color=white, bottom color=blue!20},
  tree node label/.style={font=\scriptsize},
}
\forestset{
  declare toks={left branch prefix}{},
  declare toks={right branch prefix}{},
  declare toks={left branch suffix}{},
  declare toks={right branch suffix}{},
  tree node left label/.style={
    label=170:#1,
  },
  tree node right label/.style={
    label=10:#1,
  },
  maths branch labels/.style={
    branch label/.style={
      if n=1{
        edge label={node [left, midway] {$\forestoption{left branch prefix}##1\forestoption{left branch suffix}$}},
      }{
        edge label={node [right, midway] {$\forestoption{right branch prefix}##1\forestoption{right branch suffix}$}},
      }
    },
  },
  text branch labels/.style={
    branch label/.style={
      if n=1{
        edge label={node [left, midway] {\foresteoption{left branch prefix}##1\forestoption{left branch suffix}}},
      }{
        edge label={node [right, midway] {\forestoption{right branch prefix}##1\forestoption{right branch suffix}}},
      }
    },
  },
  text branch labels,
  set branch labels/.style n args=4{%
    left branch prefix={#1},
    left branch suffix={#2},
    right branch prefix={#3},
    right branch suffix={#4},
  },
  set maths branch labels/.style n args=4{
    maths branch labels,
    set branch labels={#1}{#2}{#3}{#4},
  },
  set text branch labels/.style n args=4{
    text branch labels,
    set branch labels={#1}{#2}{#3}{#4},
  },
  branch and bound/.style={
    /tikz/every label/.append style=tree node label,
    maths branch labels,
    for tree={
      tree node,
      S,
      math content,
      s sep'+=20mm,
      l sep'+=5mm,
      thick,
      edge+={thick},
    },
    before typesetting nodes={
      for tree={
        split option={content}{:}{tree node left label,content,tree node right label,branch label},
      },
    },
    where n children=0{
      tikz+={
        \draw [thick]  ([yshift=-10pt, xshift=-2.5pt].south west) -- ([yshift=-10pt, xshift=2.5pt].south east);
      }
    }{},
  },
}
\begin{document}
\begin{forest}
  branch and bound,
  where level=1{
    set branch labels={x\leq}{}{x\geq}{},
  }{
    if level=2{
      set branch labels={}{\geq y}{}{\leq y},
    }{},
  }
  [1055.56:S:950
    [1000:S_1:950:5
    ]
    [1033:S_2:950:6
      [1033:{S_2,1}:950:1]
      [950:{S_2,2}:1033:2]
    ]
  ]
\end{forest}
\end{document}

Antwort2

  • Fehler für den zweiten Code in Ihrem MWE hat Quelle in fehlt }nachedge from parent node
  • Lösung mittikz
  • Ihr Code wird bereinigt und verkürzt, indem neue Stile für Knoten- und Kantenbeschriftungen definiert werden
  • Kombinieren Sie beide Bäume in Ihrer Frage in einem (ähnlich wiecfrin seiner Antwort) werden wir:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{calc, shapes}

\begin{document}
    \begin{figure}
    \tikzset{thick,
         tree node/.style = {align=center, inner sep=0pt, font = \scriptsize},
every label/.append style = {font=\scriptsize},
                 S/.style = {draw, circle, minimum size = 11mm, inner sep=0pt,
                             top color=white, bottom color=blue!20},
               ENL/.style = {% edge node left
                             font=\footnotesize, left=1pt},
               ENR/.style = {% edge node right
                             font=\footnotesize, right=1pt},
                     grow = down,
         sibling distance = 2.8cm,
           level distance = 3cm
           }
    \newcommand\LB{% Lower bound
                    \tikz\draw[very thick] (-0.5,0) -- + (1,0);}

\centering
\begin{tikzpicture}
\node [S, label=10:950, label=170:1055.56] {$S$}
    child{node [S, label=10:950, label=170:1000, label=below:\LB] {$S_1$}
        edge from parent node[ENL] {$x \leq 5$}}
    child{node [S, label=10:950, label=170:1033] {$S_2$}
        child{node [S, label=10:950, label=170:1033, label=below:\LB] {$S_2,1$}
            edge from parent node[ENL] {$x \geq 6$}}
        child{node [S, label=10:950, label=170:1033, label=below:\LB] {$S_2,2$}
            edge from parent node[ENR] {$x \leq 1$}}
        edge from parent node[ENR] {$x \geq 6$}
            };
\end{tikzpicture}
\end{figure}
\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen