用TikZ绘制专业流程图:从入门到进阶(基于D3QN训练流程)

用TikZ绘制专业流程图:从入门到进阶(基于D3QN训练流程)

本文以 d3qn_training_process.tex 为案例,系统讲解如何使用 TikZ 在 LaTeX 中绘制专业流程图。内容循序渐进,覆盖:环境配置、基础语法(节点、箭头、定位、样式)、完整实战复现(经验回放-采样-网络-TD误差-梯度-优先级-拷贝)、进阶技巧(fit/background/calc)、常见问题与导出方法。读完即可独立绘制清晰、美观、可复用的流程图。


一、准备工作与环境配置

推荐使用 standalone 文档类单独编译图形,方便导入论文/幻灯片:

latex 复制代码
\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 为例):

bash 复制代码
pdflatex d3qn_training_process.tex

二、基础语法:节点、箭头、定位与样式

2.1 定义可复用样式

样式统一管理使图形风格一致、修改方便:

latex 复制代码
\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 放置节点(基于定位库)

latex 复制代码
\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 ofbelow left ofbelow right of:不必手算坐标
  • xshift/yshift:微调位置,解决重叠或对齐问题

2.3 画箭头与拐角

latex 复制代码
\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 绘制"经验回放"圆柱

圆柱更贴近"缓冲区/数据库"语义:

latex 复制代码
\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 主干流程节点

latex 复制代码
\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 分支:当前/目标网络

左右分支体现"估计"和"目标"网络:

latex 复制代码
\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 主流程箭头与循环

latex 复制代码
\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);
拷贝参数的"回注"路径(虚线红色)
latex 复制代码
\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 与目标点 BC |- B 等价于 C -- (x_C, y_B) -- B,即先竖直到与 B 同 y,再横到 B
  • node[pos=0.2, above]{update} :在"整条路径"的 20% 处放置标签,位置相对于路径切线方向的上方。可用 pos=...(0~1)、near startmidwaynear endsloped 等微调。如果想明确标注在最后一段上,更稳妥的写法是将标签紧跟在 |- (target.east) 之后或把路径拆成两条。

【等价写法(更直观)】

latex 复制代码
% 用 calc 显式给出中间拐点:
\draw[copyarrow]
  (copy.east) -- ($(copy.east)+(4.5,0)$)
  |- (target.east)
  node[pos=0.2, above]{update};

上述写法与原语句效果一致:第一段水平右移 4.5 形成"让路"的走线,再以 |- 竖直对齐后水平接入 target.east

决策失败与循环回到缓冲区
latex 复制代码
\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 为子系统加外框

latex 复制代码
\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 背景层统一渲染

latex 复制代码
\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 宏与样式参数化

将颜色、圆角、间距参数集中定义,便于不同主题复用:

latex 复制代码
\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]{...};


五、常见问题与排错建议

  1. 箭头穿帮/重叠
    • 调整 -| / |- 转折路径
    • 使用 calc 的坐标计算插入中间拐点
  2. 节点文本溢出
    • 增大 text width 或缩小字体 font=\small
    • 使用换行 \\ 明确分行
  3. 整体不居中/留白过大
    • standaloneborder 控制边距
    • 外围再加一层 fit 背景框裁定视野
  4. 颜色太艳
    • color!x 的浅色系(如 blue!15green!20
  5. 可维护性差
    • 统一样式、集中宏定义;模块化分组;注释到位

六、完整代码与导出

将上述片段整合即可得到完整、可编译的 d3qn_training_process.tex(您已提供)。若需导出 PNG:

bash 复制代码
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 管理局部坐标与样式,减少重复

在此基础上,你可以快速构建训练流水线、软件架构、通信协议、任务调度等多类流程图,并保持学术级排版质量。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习