我想显示算法中的某个部分是并行工作的。所以我想到了在算法中的行 S/state 周围加一个大括号之类的东西。
在下面的图片中我用 Photoshop 添加了支架:
有没有办法使用 Latex 中的算法/算法包来实现这一点?
源代码:
\begin{algorithm}
\caption{Parallele Tourkonstruktion}
\label{ParallelTour}
\textbf{Eingabe:} Datenobjekt mit $v$ Städten sowie einer Distanzmatrix $D$ und Pheromonmatrix $S$, \texttt{vector} $M$ mit $m$ Ameisen
\\\textbf{Ausgabe:} Route $r$ mit der kürzesten gefunden Distanz $d_s$
\begin{algorithmic}[1]
\State $j := 0$
\While{$j < v$}
\For{\textbf{each} Ameise $m_i \in M$}
\State Starte in einer zufälligen Stadt $v_0$
\State Ermittle die nächste Stadt $v_i$ und gehe dorthin
\State $r_{m_i} := v_i$
\State $d_m := d_m + D_{i-1,i}$
\State Aktualisiere Pheromonmatrix $S$
\EndFor
\State $j := j + 1$
\EndWhile
\State $d_s = \infty$
\For{\textbf{each} Ameise $m_i \in M$}
\If{Tourlänge $d_m < d_s$}
\State $d_s := d_m$
\EndIf
\EndFor
\end{algorithmic}
\end{algorithm}
答案1
您可以设置\smash
ed 数学构造来跨越对于每个:
\documentclass{article}
\usepackage{algorithm,mathtools}
\usepackage[noend]{algpseudocode}
\usepackage[utf8]{inputenc}
\newcommand{\isassigned}{\vcentcolon=}
\begin{document}
\begin{algorithm}
\caption{Parallele Tourkonstruktion}
\textbf{Eingabe:} Datenobjekt mit $v$ Städten sowie einer Distanzmatrix $D$
und Pheromonmatrix $S$, \texttt{vector} $M$ mit $m$ Ameisen \\
\textbf{Ausgabe:} Route $r$ mit der kürzesten gefunden Distanz $d_s$
\begin{algorithmic}[1]
\State $j \isassigned 0$
\While{$j < v$}
\For{\textbf{each} Ameise $m_i \in M$}
\State Starte in einer zufälligen Stadt $v_0$
\State Ermittle die nächste Stadt $v_i$ und gehe dorthin
\State $r_{m_i} \isassigned v_i$
\hspace{17em}\smash{$\left.\rule{0pt}{2.7\baselineskip}\right\}\ \mbox{in parallel}$}
\State $d_m \isassigned d_m + D_{i-1,i}$
\State Aktualisiere Pheromonmatrix $S$
\EndFor
\State $j \isassigned j + 1$
\EndWhile
\State $d_s = \infty$
\For{\textbf{each} Ameise $m_i \in M$}
\If{Tourlänge $d_m < d_s$}
\State $d_s \isassigned d_m$
\EndIf
\EndFor
\end{algorithmic}
\end{algorithm}
\end{document}
如果你想让建筑覆盖对于每个那么你就可以使用
% ...
\For{\textbf{each} Ameise $m_i \in M$}
\State Starte in einer zufälligen Stadt $v_0$
\State Ermittle die nächste Stadt $v_i$ und gehe dorthin
\State $r_{m_i} \isassigned v_i$
\hspace{17em}\raisebox{.5\baselineskip}[0pt][0pt]{$\left.\rule{0pt}{3.2\baselineskip}\right\}\ \mbox{in parallel}$}
\State $d_m \isassigned d_m + D_{i-1,i}$
\State Aktualisiere Pheromonmatrix $S$
\EndFor
% ...
答案2
这是一个快速的tikzmark
替代方法。
\documentclass{article}
\usepackage{algorithm}
\usepackage[noend]{algpseudocode}
\usepackage{tikz}
\usetikzlibrary{tikzmark,decorations.pathreplacing}
\begin{document}
\begin{algorithm}
\caption{Parallele Tourkonstruktion}
\textbf{Eingabe:} Datenobjekt mit $v$ St\"adten sowie einer Distanzmatrix $D$
und Pheromonmatrix $S$, \texttt{vector} $M$ mit $m$ Ameisen \\
\textbf{Ausgabe:} Route $r$ mit der k\"urzesten gefunden Distanz $d_s$
\begin{algorithmic}[1]
\State $j < 0$
\While{$j < v$}
\For{\textbf{each} Ameise $m_i \in M$}
\State Starte in einer zuf\"alligen Stadt \tikzmarknode{v0}{$v_0$}
\State Ermittle die n\"achste Stadt $v_i$ und gehe \tikzmarknode{dorthin}{dorthin}
\State $r_{m_i} < v_i$
%\hspace{17em}\smash{$\left.\rule{0pt}{2.7\baselineskip}\right\}\ \mbox{in parallel}$}
\State $d_m < d_m + D_{i-1,i}$
\State Aktualisiere Pheromonmatrix \tikzmarknode{S}{$S$}
\EndFor
\State $j < j + 1$
\EndWhile
\State $d_s = \infty$
\For{\textbf{each} Ameise $m_i \in M$}
\If{Tourl\"ange $d_m < d_s$}
\State $d_s < d_m$
\EndIf
\EndFor
\end{algorithmic}
\end{algorithm}
\begin{tikzpicture}[overlay,remember picture]
\draw[thick,decorate,decoration=brace] ([xshift=1mm,yshift=2mm]dorthin.east |- v0.north)
-- ([xshift=1mm,yshift=-2mm]dorthin.east |- S.south)
node[midway,right,align=left]{Working Parallel};
\end{tikzpicture}
\end{document}
让我提一下,它tikzmark
能做的远不止这些。它可以注释代码而无需输入任何命令,也就是说,您可以真正嵌入工作代码并对其进行注释。但这里不需要这样做。