Помогите мне сделать мою сеть Петри TikZ красивой!

Помогите мне сделать мою сеть Петри TikZ красивой!

Я пытаюсь нарисовать следующую диаграмму в TikZ:

Их образ

Моя попытка выглядит так (обратите внимание, что метки узлов немного отличаются, но это не моя проблема!):

моя попытка

Мой код следующий:

\documentclass[11pt,a4paper]{report}

\usepackage[USenglish]{babel} 
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern} 

\usepackage{tikz}

\usetikzlibrary{positioning,fit,backgrounds,arrows,shapes,automata,petri}

\tikzset{
    place/.style={
        circle,
        thick,
        minimum size=6mm,
                draw
    },
    transitionV/.style={
        rectangle,
        thick,
        fill=black,
        minimum height=6mm,
        inner xsep=1pt
    }
}

\begin{document}

\title{Test}
\author{Me}
\date{\today}
\begin{figure}[h!]
\centering
\begin{tikzpicture}[node distance=1cm and 2cm,>=stealth',bend     angle=45,thick]
        \node [transitionV,label=above:$q_1$] (q1) {};
        \node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {}
            edge[pre,bend right,overlay] (q1)
            edge[post,bend left,overlay] (q1);
        \node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {}
            edge[pre] (q1);
        \node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {}
            edge[pre] (p41);
        \node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {}
            edge[pre] (q4);
        \node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {}
                edge[pre] (p24);
        \node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {}
                edge[pre,bend right,overlay] (q2)
                edge[post,bend left,overlay] (q2);
        \node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {}
                edge[pre] (q1);
        \node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {}
            edge[pre] (p31);
        \node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {}
                edge[pre] (q3)
                edge[post] (q2);
        \node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {}
                edge[pre,bend left,out=45,in=45,looseness=1.2] (q2)
                edge[post,bend left,out=315,in=315,looseness=1.2] (q1);
\end{tikzpicture}
\caption{Event graph}
\end{figure}

\end{document}

Я исчерпал свои знания TikZ. Пожалуйста, кто-нибудь может мне подсказать, как сделать так, чтобы моя диаграмма выглядела красиво, как в примере выше? Спасибо!

решение1

Пожалуйста, задавайте конкретные вопросы о том, что вы хотите иметь, что вы пробовали и где вы не смогли этого достичь. В том виде, в котором он сейчас, он не представляет исследовательской ценности для этого сайта и просто пост типа «сделай это для меня».

Я исправил две основные проблемы, которые я видел. Остальное должно быть самоочевидно из кода, который у вас уже есть.

% arara: pdflatex

\documentclass[11pt,a4paper]{report}
\usepackage[USenglish]{babel} 
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern} 
\usepackage{tikz}
\usetikzlibrary{positioning,arrows,petri}

\tikzset{
    place/.style={
        circle,
        thick,
        minimum size=6mm,
        draw
    },
    transitionV/.style={
        rectangle,
        thick,
        fill=black,
        minimum height=6mm,
        inner xsep=1pt
    }
}

\begin{document}
    \begin{figure}[h!]
        \centering
        \begin{tikzpicture}[node distance=1cm and 2cm,>=stealth',bend angle=45,thick]
        \node [transitionV,label=above:$q_1$] (q1) {};
        \node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {}
        edge[pre,bend right=70] (q1)
        edge[post,bend left=70] (q1);
        \node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {}
        edge[pre] (q1);
        \node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {}
        edge[pre] (p41);
        \node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {}
        edge[pre] (q4);
        \node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {}
        edge[pre] (p24);
        \node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {}
        edge[pre,bend right=70] (q2)
        edge[post,bend left=70] (q2);
        \node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {}
        edge[pre] (q1);
        \node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {}
        edge[pre] (p31);
        \node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {}
        edge[pre] (q3)
        edge[post] (q2);
        \node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {}
        edge[pre,out=0,in=20,,looseness=1.2] (q2)
        edge[post,out=180,in=160,looseness=1.2] (q1);
        \end{tikzpicture}
        \caption{Event graph}
    \end{figure}    
\end{document}

введите описание изображения здесь

решение2

В своей попытке я изменил ваш код, отделив узлы от путей и используя arcпути для рисования маленьких узлов по бокам. Это потому, что я считаю, что лучше организованный код легче понять, и каждый раз, когда я пишу/заканчиваю какой-то код, я трачу пару минут на исправление его структуры и удаление избыточных опций.

Линии соединяются на разных путях с помощью якорей, и в этом случае мне пришлось добавить calc, чтобы вычислить другие позиции, чтобы достичь этого. Так, например, если у вас есть (q2.west)и (q2.south west), чтобы вычислить среднюю точку, вы должны написать ($(q2.west)!.5!(q2.south west)$), таким образом ваша стрелка может соединиться со средней точкой между западом и юго-западом определенного узла.

Все пути также были сокращены в соответствии с вашим желаемым примером. Библиотека bending также была добавлена ​​для того, чтобы кончики стрелок дуг были правильно выровнены.

Выход

Рисунок 1

Код

\documentclass[11pt,a4paper]{report}
\usepackage[USenglish]{babel}
\usepackage[T1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{lmodern}
\usepackage{tikz}

\usetikzlibrary{positioning,fit,backgrounds,arrows,shapes,automata,petri,calc,bending}

\tikzset{
    place/.style={
        circle,
        thick,
        minimum size=6mm,
                draw
    },
    transitionV/.style={
        rectangle,
        thick,
        fill=black,
        minimum height=6mm,
        inner xsep=1pt
    }
}

\begin{document}

\title{Test}
\author{Me}
\date{\today}

\begin{figure}[h!]
\centering
\begin{tikzpicture}[
    node distance=1cm and 2cm,
    >=stealth',
    bend angle=#1,
    thick,
  shorten >=2pt,
  shorten <=2pt
    ]

% Nodes
    \node [transitionV,label=above:$q_1$] (q1) {};
    \node [place,tokens=1,label=above:$\alpha_{11}(k)$] (p11) [below= of q1] {};
    \node [place,tokens=2,label=above:$\alpha_{41}(k)$] (p41) [below right=0.25cm and 2cm of q1] {};
    \node [transitionV,label=above:$q_4$] (q4) [below right=0.25cm and 2cm of p41] {};
    \node [place,label=above:$\alpha_{24}(k)$] (p24) [above right=0.25cm and 2cm of q4] {};
    \node [transitionV,label=above:$q_2$] (q2) [above right=0.25cm and 2cm of p24] {};
    \node [place,tokens=1,label=above:$\alpha_{22}(k)$] (p22) [below= of q2] {};
    \node [place,tokens=1,label=above:$\alpha_{31}(k)$] (p31) [above right=0.25cm and 2cm of q1] {};
    \node [transitionV,label=below:$q_3$] (q3) [above right=0.25cm and 2cm of p31] {};
    \node [place,label=above:$\alpha_{23}(k)$] (p23) [below right=0.25cm and 2cm of q3] {};
    \node [place,tokens=1,label=below:$\alpha_{12}(k)$] (p12) [above= of q3] {};

% Paths

  % left
    \draw ($(q1.north east)!.5!(q1.east)$) edge[bend left=15,->] (p31);
  \draw (q1.east) edge[bend right=15,->] (p41);
  % central
  \draw (p31) edge[bend left=10,->] (q3);
  \draw (q3) edge[bend left=10,->] (p23);
  \draw (p41) edge[bend right=10,->] (q4);
  \draw (q4) edge[bend right=10,->] (p24);
  % right
  \draw (p23) edge[bend left=15,->] ($(q2.north west)!.5!(q2.west)$);
  \draw (p24) edge[bend right=15,->] (q2.west);

% round arrows on the...

  % ...left
\draw[->] ($(p11.west)+(2pt,4pt)$) arc (240:105:1.8em);
\draw[<-] ($(p11.east)+(-2pt,4pt)$) arc (-60:75:1.8em);
  % ...right
\draw[->] ($(p22.west)+(2pt,4pt)$) arc (240:105:1.8em);
\draw[<-] ($(p22.east)+(-2pt,4pt)$) arc (-60:75:1.8em);

% huge round arrows from the top node
\draw[->] (p12) edge[out=180,in=145] ($(q1.north west)!.5!(q1.west)$);
\draw[->] (p12) edge[out=0,in=35] ($(q2.north east)!.5!(q2.east)$);

\end{tikzpicture}
\caption{Event graph}
\end{figure}
\end{document}

Связанный контент