用TikZ繪製專業流程圖:從入門到進階(基於D3QN訓練流程)
本文以 d3qn_training_process.tex 為案例,系統講解如何使用 TikZ 在 LaTeX 中繪製專業流程圖。內容循序漸進,覆蓋:環境配置、基礎語法(節點、箭頭、定位、樣式)、完整實戰復現(經驗回放-採樣-網絡-TD誤差-梯度-優先級-拷貝)、進階技巧(fit/background/calc)、常見問題與導出方法。讀完即可獨立繪製清晰、美觀、可複用的流程圖。
一、準備工作與環境配置
推薦使用 standalone 文檔類單獨編譯圖形,方便導入論文/幻燈片:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\usepackage{amsmath, amssymb, bm}
\usetikzlibrary{shapes,arrows,positioning,fit,backgrounds,calc}
- standalone:獨立產出 PDF/PNG,遷移方便
- shapes/arrows:提供矩形、菱形、箭頭等形狀
- positioning:基於相對位置的排版(
below of=等) - fit/backgrounds:羣組和背景層,適合高階佈局
- calc:座標運算,便於繪製拐角箭頭
編譯命令(以 PDFLaTeX 為例):
pdflatex d3qn_training_process.tex
二、基礎語法:節點、箭頭、定位與樣式
2.1 定義可複用樣式
樣式統一管理使圖形風格一致、修改方便:
\tikzstyle{process} = [rectangle, draw, fill=blue!20,
text width=3.5cm, text centered, rounded corners, minimum height=1.2cm]
\tikzstyle{network} = [rectangle, draw, fill=green!20,
text width=4cm, text centered, rounded corners, minimum height=1.2cm]
\tikzstyle{buffer} = [rectangle, draw=none, fill=none,
text width=3cm, text centered, minimum height=2cm, minimum width=4cm]
\tikzstyle{decision} = [diamond, draw, fill=yellow!20,
text width=2cm, text centered, minimum height=1cm, aspect=2.5]
\tikzstyle{arrow} = [thick,->,>=stealth]
\tikzstyle{copyarrow} = [thick,->,>=stealth,dashed,red]
process/network:流程框與網絡框,顏色區分語義decision:菱形判定框,aspect控制菱形比例arrow/copyarrow:主流程箭頭與“拷貝參數”虛線紅箭頭
2.2 放置節點(基於定位庫)
\begin{tikzpicture}[node distance=2cm, auto]
% 經驗回放“圓柱”容器:先佔位,再用普通繪圖命令畫造型
\node [buffer] (buffer) {};
% 基於相對定位
\node [process, below of=buffer, yshift=-0.5cm] (sampling) {Batch\\Sampling};
\node [network, below left of=sampling, xshift=-2cm] (current) {Current Network\\$\\bm{\\Theta} = \{\\bm{W}_V, \\bm{b}_V, \\bm{W}_A, \\bm{b}_A\}$};
\node [network, below right of=sampling, xshift=2cm] (target) {Target Network\\$\hat{\\bm{\\Theta}} = \{\hat{\\bm{W}}_V, \hat{\\bm{b}}_V, \hat{\\bm{W}}_A, \hat{\\bm{b}}_A\}$};
below of、below left of、below right of:不必手算座標xshift/yshift:微調位置,解決重疊或對齊問題
2.3 畫箭頭與拐角
\draw [arrow] (buffer) -- (sampling); % 直連
\draw [arrow] (sampling) -| (current); % 右角拐彎
\draw [arrow] (current) |- (tderror); % 左角拐彎
-| 與 |- 提供直角轉折,配合 calc 庫可自定義拐點路徑。
三、案例復現:D3QN訓練流程圖(逐步搭建)
目標流程:Experience Buffer → Batch Sampling → Current / Target Networks → TD Error → Gradient Update → Update Current Network → Update Buffer Priorities → 判定拷貝 → Copy → 參數回注與循環。
3.1 繪製“經驗回放”圓柱
圓柱更貼近“緩衝區/數據庫”語義:
\node [buffer] (buffer) {};
\begin{scope}[shift={(buffer.center)}]
\draw[fill=cyan!20, draw=cyan!60, thick] (-1.5,-1) rectangle (1.5,1);
\draw[fill=cyan!20, draw=cyan!60, thick] (0,1) ellipse (1.5cm and 0.3cm);
\draw[fill=cyan!20, draw=cyan!60, thick] (0,-1) ellipse (1.5cm and 0.3cm);
\node[text width=3cm, text centered] at (0,0) {Experience\\Buffer};
\end{scope}
scope+shift:局部座標偏移,便於以節點中心為參照繪製複雜形狀- 上下兩個橢圓 + 中間矩形 = 經典圓柱體視覺
3.2 主幹流程節點
\node [process, below of=buffer, yshift=-0.5cm] (sampling) {Batch\\Sampling};
\node [process, below of=sampling, yshift=-1.5cm] (tderror) {TD Error\\Calculation\\$\\delta = |y - Q(s,a)|$};
\node [process, below of=tderror] (gradient) {Gradient\\Update\\$\\nabla_\\theta \\bm{\\mathcal{L}}$};
\node [process, below of=gradient] (update_current) {Update Current\\Network Parameters};
\node [process, below of=update_current] (update_buffer) {Update Buffer\\Priorities\\$p_i = |\\delta_i|^\\alpha$};
\node [decision, below of=update_buffer, yshift=-0.5cm] (decision) {Every C\\Steps?};
\node [process, below of=decision, yshift=-0.5cm] (copy) {Copy Parameters\\$\hat{\\bm{\\Theta}} \leftarrow \\bm{\\Theta}$};
公式採用 amsmath/bm 宏包增強排版(粗體、帽子、向量等)。
3.3 分支:當前/目標網絡
左右分支體現“估計”和“目標”網絡:
\node [network, below left of=sampling, xshift=-2cm] (current) {Current Network\\$\\bm{\\Theta} = \{\\bm{W}_V, \\bm{b}_V, \\bm{W}_A, \\bm{b}_A\}$};
\node [network, below right of=sampling, xshift=2cm] (target) {Target Network\\$\hat{\\bm{\\Theta}} = \{\hat{\\bm{W}}_V, \hat{\\bm{b}}_V, \hat{\\bm{W}}_A, \hat{\\bm{b}}_A\}$};
\draw [arrow] (sampling) -| (current);
\draw [arrow] (sampling) -| (target);
\draw [arrow] (current) |- (tderror) node[pos=0.7, above] {$Q(s,a)$};
\draw [arrow] (target) |- (tderror) node[pos=0.7, above] {$y$};
node[pos=.., above]{...} 在箭頭上添加標籤,標明信息來源。
3.4 主流程箭頭與循環
\draw [arrow] (buffer) -- (sampling);
\draw [arrow] (tderror) -- (gradient);
\draw [arrow] (gradient) -- (update_current);
\draw [arrow] (update_current) -- (update_buffer);
\draw [arrow] (update_buffer) -- (decision);
\draw [arrow] (decision) -- node[right] {Yes} (copy);
拷貝參數的“回注”路徑(虛線紅色)
\draw [copyarrow] (copy.east) -| ++(4.5,0) |- (target.east) node[pos=0.2, above] {update};
copy.east/target.east:使用錨點控制連線端點- 先
-|向右,再|-向上折返,避開主幹
【逐段解釋】
- (copy.east):從節點
copy的東側錨點(右側中點)出發。 - -|:右角折線路由,幾何含義為“先橫後豎”。形式上
A -| B等價於A -- (x_B, y_A) -- B。 - ++(4.5,0):相對座標並“更新當前點”。從當前位置向右移動 4.5(單位缺省為 cm),新的位置被設為“當前點”。因此
- | ++(4.5,0)的效果是:先沿水平方向移到距copy.east右側 4.5 的位置,作為折角轉折點,拉開與主幹的間距。 - |- (target.east):左角折線路由,幾何含義為“先豎後橫”。對於當前點
C與目標點B,C |- B等價於C -- (x_C, y_B) -- B,即先豎直到與B同 y,再橫到B。 - node[pos=0.2, above]{update}:在“整條路徑”的 20% 處放置標籤,位置相對於路徑切線方向的上方。可用
pos=...(0~1)、near start、midway、near end、sloped等微調。如果想明確標註在最後一段上,更穩妥的寫法是將標籤緊跟在|- (target.east)之後或把路徑拆成兩條。
【等價寫法(更直觀)】
% 用 calc 顯式給出中間拐點:
\draw[copyarrow]
(copy.east) -- ($(copy.east)+(4.5,0)$)
|- (target.east)
node[pos=0.2, above]{update};
上述寫法與原語句效果一致:第一段水平右移 4.5 形成“讓路”的走線,再以 |- 豎直對齊後水平接入 target.east。
決策失敗與循環回到緩衝區
\draw [arrow] (decision.west) -| ++(-3.5,0) |- ($(buffer.west)+(0,-0.3)$);
\node [left of=decision, xshift=-1cm, yshift=0.25cm, font=\small] {No};
\draw [arrow] (copy.west) -| ++(-5.5,0) |- ($(buffer.west)+(0,0.3)$);
calc庫語法$(A)+(dx,dy)$:相對位移更直觀- 通過不同高度返回
buffer,避免線路重疊
四、進階技巧:佈局、分組與背景層
4.1 使用 fit 為子系統加外框
\node[draw=gray!60, rounded corners, inner sep=6pt, fit=(current)(target)] (netgroup) {};
\node[above=2pt of netgroup, font=\small, gray!70] {Networks};
fit 將多個節點打包為一個“羣組”,便於標註模塊邊界。
4.2 背景層統一渲染
\begin{scope}[on background layer]
\draw[fill=gray!5, draw=gray!20, rounded corners]
($(buffer.north west)+(-0.8,0.8)$) rectangle ($(update_buffer.south east)+(0.8,-0.8)$);
\end{scope}
背景層避免覆蓋前景節點/箭頭,適合大區域底色與分區。
4.3 對齊與等距技巧
- 使用
node distance控制默認間距 - 用
xshift/yshift精調 - 複雜場景可藉助隱式錨點(如不可見的對齊參考節點)
4.4 宏與樣式參數化
將顏色、圓角、間距參數集中定義,便於不同主題複用:
\tikzset{
flow/process/.style={rectangle, draw, rounded corners, fill=#1!18, text width=#2, minimum height=1.1cm, text centered},
flow/process/.default={blue}{3.6cm}
}
調用:\node[flow/process=red]{...}; 或 \node[flow/process]{...};
五、常見問題與排錯建議
- 箭頭穿幫/重疊:
- 調整
-|/|-轉折路徑 - 使用
calc的座標計算插入中間拐點
- 節點文本溢出:
- 增大
text width或縮小字體font=\small - 使用換行
\\明確分行
- 整體不居中/留白過大:
standalone的border控制邊距- 外圍再加一層
fit背景框裁定視野
- 顏色太豔:
- 用
color!x的淺色系(如blue!15、green!20)
- 可維護性差:
- 統一樣式、集中宏定義;模塊化分組;註釋到位
六、完整代碼與導出
將上述片段整合即可得到完整、可編譯的 d3qn_training_process.tex(您已提供)。若需導出 PNG:
pdflatex d3qn_training_process.tex
magick -density 300 d3qn_training_process.pdf -quality 95 d3qn_training_process.png
或使用 ghostscript/pdftoppm 實現高分辨率轉換。
七、小結與擴展
本文基於 D3QN 訓練流程,系統演示了 TikZ 繪製流程圖的全流程:從樣式定義、相對定位、箭頭拐角、到進階的 fit/background/calc。當圖逐漸複雜時,建議:
- 把“數據流”和“控制流”用不同顏色/線型區分
- 將模塊封裝成可複用樣式或宏
- 使用
scope管理局部座標與樣式,減少重複
在此基礎上,你可以快速構建訓練流水線、軟件架構、通信協議、任務調度等多類流程圖,並保持學術級排版質量。