사이클 그래프를 그리는 방법

사이클 그래프를 그리는 방법

나는 다음과 같은 텍스 코드를 가지고 있습니다

 \documentclass{minimal}
 \usepackage{tikz}
 \usetikzlibrary{arrows,positioning} 
 \tikzset{
    %Define standard arrow tip
     >=stealth',
    %Define style for boxes
    punkt/.style={
       rectangle,
       rounded corners,
       draw=black, very thick,
       text width=6.5em,
       minimum height=2em,
       text centered},
% Define arrow style
pil/.style={
       ->,
       thick,
       shorten <=2pt,
       shorten >=2pt,}
}

\begin{document}
  \begin{tikzpicture}[node distance=1cm, auto,]
    %nodes
    \node[punkt] (agent) {Agent};
    \node[below=of agent] (dummy) {};
    \node[left=2.0 of dummy] (state) {$X_t$}
        edge[pil, bend left=45] (agent.west);
    \node[left=3.0 of dummy] (reward) {$R_t$}
        edge[pil, bend left=45] (agent.west);
    \node[punkt, inner sep=5pt,below=1.0cm of dummy]
        (environment) {Environment};
    \draw (environment.west) edge[pil, bend left=45] (state.south)                
                       edge[pil, bend left=45] (reward.south);
    % We make a dummy figure to make everything look nice.
    \node[right=2.0cm of dummy] (action) {$A_t$}
        edge[pil,bend right=45] (agent.east)
        edge[pil, bend left=45] (environment.east); % .east since we want
                                         % consistent 
\end{tikzpicture}
\end{document}

나는 원한다

  • 에이전트를 작업에 연결하기 위해
  • 환경 노드의 왼쪽 중앙에서 가장자리를 시작합니다(@marsupilam 덕분에 이미 수정되었습니다).

답변1

단계는 다음과 같습니다.

  1. 필요한 노드 정의
  2. 그들 사이에 가장자리를 그립니다.

다소 논리적으로 들리지 않습니까?

출력

여기에 이미지 설명을 입력하세요

코드

\documentclass[tikz]{standalone}
\usetikzlibrary{calc,positioning,arrows}
\begin{document}
\tikzset
{
  punkt/.style =
  {
    circle,
    draw,
  },
  pil/.style = 
  {
    red,
    -stealth',
    bend left=45,
  },
}
\begin{tikzpicture}[node distance=1cm, auto,]
  %nodes
  \node[punkt] (agent) {Agent};
  \node[below=of agent] (dummy) {};
  \node[left=2.0 of dummy] (state) {$X_t$} ;
  \node[left=3.0 of dummy] (reward) {$R_t$} ;
  \node[punkt, inner sep=5pt,below=1.0cm of dummy] (environment) {Environment}; 
  \node[right=2.0cm of dummy] (action) {$A_t$} ;

  % edges
  \path[every edge/.append style={pil}] 
  (environment.west) edge (state.south)                
                     edge (reward.south)
  (agent.east)       edge (action)  
  (action)           edge (environment.east)
  (state)            edge (agent.west)
  (reward)           edge (agent.west);
\end{tikzpicture}
\end{document}

답변2

여기에 이미지 설명을 입력하세요

주어진 MWE와마르수필람대답하지만 다음과 같이 변경됩니다.

  • 노드 위치 지정에 대한 다른 접근 방식, 사전 정의된 노드 거리만 사용됨
  • 가장자리는 사용되며 arrow.meta라이브러리 bending와 그 스타일은 개인적으로 약간의 손길을 주었습니다(귀하의 의견에 따라 쉽게 변경할 수 있음).
  • 가장자리 그리기를 위한 단순화된 코드

이러한 변경으로 인해 MWE가 약간 더 간결해졌습니다.

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows.meta, bending, positioning}

\begin{document}

    \begin{tikzpicture}[
every node/.append style = {inner sep=1.5pt}, 
node distance = 12mm and 9mm,
 punkt/.style = {circle, draw, very thick},
   pil/.style = {line width=1mm, red, -{Stealth[length=4mm,bend]},
                 shorten >=1pt, shorten <=2pt, bend left=#1},
 pil/.default = 30
                    ]
%nodes
\node (reward)                                  {$R_t$} ;
\node (state)   [right=of reward]               {$X_t$} ;
\node (env)     [punkt,
                 below right=of state]          {Environment};
\node (action)  [above right=of env]            {$A_t$} ;
%
\node (agent)   [punkt, 
                 above=of state.north -| env]   {Agent};
% edges
\draw[pil]  (agent)     edge    (action)
            (action)    edge    (env)
            (env)       edge    (state)
            (env)       edge[pil=40]    (reward)
            (state)     edge    (agent)
            (reward)    edge[pil=40]    (agent);
\end{tikzpicture}
\end{document}

관련 정보