范叶亮写智能体、模型和数据系统时,习惯先把定义和边界钉死。把「网络算法」整理成可落地的中文笔记:问题在哪、默认做法会踩什么坑、该怎么选。原站导航和广告已去掉。

网络基础算法

最短路径 (shortest path)算法是寻找两个顶点之间的最短路径,寻找网络中最短路径的标准算法称为 广度优先搜索 (breadth-first search)。算法的基本思想如下图所示:

根据广度优先搜索的基本思想,不难证明距 $s$ 最短距离为 $d$ 的每个顶点都有一个到 $s$ 的最短距离为 $d – 1$ 的邻居顶点。一个简单的实现方式是,创建一个有 $n$ 个元素的数组存储从源顶点 $s$ 到其他所有顶点的距离,同时创建一个距离变量 $d$ 来记录当前在搜索过程中所处的层数,算法的具体流程如下:

最短路径

这种方法在最坏的情况下时间复杂度为 $O \left(m + n^2\right)$ ,考虑多数网络的直径只随 $\log n$ 增长,算法运行的时间复杂度为 $O \left(m + n \log n\right)$ 。

上述算法中步骤 1 是最耗时的部分,通过使用 队列 的数据结构我们可以避免每次都遍历列表来找到距离源顶点 $s$ 距离为 $d$ 的顶点。构造一个队列,一个指针指向下一个要读取的元素,另一个指针指向要填充的空位,这样距离为 $d + 1$ 的顶点就会紧跟在距离为 $d$ 的顶点后面,队列如下图所示:

最大流和最小割

通过队列可以将算法的时间复杂度降至 $O \left(m + n\right)$ ,对于 $m \propto n$ 的稀疏网络而言, $O \left(m + n\right)$ 相当于 $O \left(n\right)$ ,所以算法的时间复杂度同顶点数量成正比。

通过对算法进行进一步修改则可以得到源顶点 $s$ 到其他任何顶点的最短路径。方法是在原来的网络上构建一个新的有向网络,该网络代表最短路径,称为 最短路径树 (shortest path tree),通常情况下,该网络是一个有向非循环网络,而不是树。

图划分和社团发现

对于加权网络,利用广度优先搜索无法找到最短路径,这里需要用到 Dijkstra 算法 2 进行求解。算法将图中的顶点分成两组 $S$ 和 $U$ ,整个算法过程如下:

Dijkstra 算法的时间复杂度为 $O \left(m + n^2\right)$ ,通过二叉堆的数据结构可以将时间复杂度优化至 $O \left(\left(m + n\right) \log n\right)$ 。

图划分

Dijkstra 算法虽然能够处理加权网络,但不能处理存在负权重的网络,需要利用 Floyd-Warshall 算法 3 进行求解。更多 Floyd-Warshall 算法的细节请参见之前的博客 计算复杂性 (Computational Complexity) 与动态规划 (Dynamic Programming) 。

对于连接给定顶点 $s$ 和 $t$ 的两条路径,若没有共享边,则这两条路径是 边独立 的;若除 $s$ 和 $t$ 外不共享任何其他顶点,则这两条路径是 顶点独立 的。顶点之间的 边连通度 和 顶点连通度 分别是顶点之间边独立路径数和顶点独立路径数。连通度是度量顶点之间连通鲁棒性的简单参数。假设一个网络是一个管线网络,其中每个管线的容量均为单位流量,那么边连通度等于从 $s$ 流向 $t$ 的 最大流 。

社团发现

增广路径算法 (Ford-Fulkerson Algorithm,FFA)是计算最大流最简单的算法。基本思想是:首先利用广度优先搜索算法找到一条从源 $s$ 到目标 $t$ 的路径。该步骤“消耗”了网络中的一些边,将这些边的容量填充满后,它们不再承载更多流量。之后在剩余边中找到从 $s$ 到 $t$ 的另一条路径,重复该过程直到找不到更多的路径为止。

但这还不是一个有效的算法,如下图中的 (a) 所示,如果在 $s$ 和 $t$ 之间运用广度优先搜索,可以发现黑色标记的路径。一旦这些边的容量被填充满,就不能在剩余边中找到从 $s$ 到 $t$ 的更多路径,但很明显,从 $s$ 到 $t$ 有两条边独立路径(上下各一条)。

值得单独记下的点

  • 遍历距离数组,查找到 $s$ 的距离为 $d$ 的所有顶点。
  • 查找上述顶点的所有邻居顶点,如果同 $s$ 的距离未知,则距离置为 $d + 1$ 。
  • 如果距离未知的邻居顶点数量为零,则停止算法,否则将 $d$ 的值加一并重复上述过程。
  • 初始状态, $S$ 仅包含源顶点,即 $S = \left\{v\right\}$ , $U$ 包含其余顶点。如果 $v$ 与 $U$ 中的顶点 $u$ 为邻居,则距离为边的权重,否则为无穷大。
  • 从 $U$ 中选择一个距离 $v$ 最短的顶点 $k$ ,并把 $k$ 加入到 $S$ 中。
  • 若从源点 $v$ 经过顶点 $k$ 到达 $u$ 的距离比之前 $v$ 到 $u$ 的距离短,则将距离修改为这个更短的距离。
  • 重复步骤 2 和 3,直至所有顶点都包含在 $S$ 中。
  • 计算图拉普拉斯矩阵的第二小特征值 $\lambda_2$ ,称为网络的 代数连通度 (algebraic connectivity),及其对应的特征向量 $\mathbf{v}_2$ 。

落地时建议先做的 5 件事

  1. 先写清任务能不能被自动验证:能验证的交给系统和评测,不能验证的留给人审。
  2. 本地部署先算显存、延迟和失败回滚,不要只看能跑通一次。
  3. 多智能体只在单智能体触到上下文或专业边界时再拆。
  4. Token、微调和压缩都要有对照数字,避免口号式优化。
  5. 结论写成可检查清单:接口、超时、评测集、回滚版本。

和智能体产品怎么接

龙虾PRO做 OpenClaw 落地时,最该拿走的是「单智能体先做好工具和提示,再谈编排」。数字员工、技能市场和网关应共用同一套评测与权限,而不是各写一套角色人设。

本文侧重全链路风控方法论。落地时请用自身业务单据做回放验证,不要把示例阈值直接当生产策略。 相关:风控体检 · 方案资源

常见问题 FAQ

什么是AI智能系统?

「AI智能系统」可概括为:最短路径 (shortest path)算法是寻找两个顶点之间的最短路径,寻找网络中最短路径的标准算法称为 广度优先搜索 (breadth-first search)。算法的基本思想如下图所示: 本文从定义、方法与实践要点展开说明。

为什么要关注AI智能系统?

关注AI智能系统,是因为它直接影响效率、风险与可复制性。文中指出:最短路径 (shortest path)算法是寻找两个顶点之间的最短路径,寻找网络中最短路径的标准算法称为 广度优先搜索 (breadth-first search)。算法的基本思想如下图所示:

如何落地AI智能系统?有哪些关键步骤?

建议按以下路径推进AI智能系统:1) 遍历距离数组,查找到 $s$ 的距离为 $d$ 的所有顶点。;2) 查找上述顶点的所有邻居顶点,如果同 $s$ 的距离未知,则距离置为 $d + 1$ 。;3) 如果距离未知的邻居顶点数量为零,则停止算法,否则将 $d$ 的值加一并重复上述过程。;4) 初始状态, $S$ 仅包含源顶点,即 $S = \left\{v\right\}$ , $U$ 包含其余顶点。如果 $v$ 与 $U$ 中的顶点 $u$ 为邻…;5) 从 $U$ 中选择一个距离 $v$ 最短的顶点 $k$ ,并把 $k$ 加入到 $S$ 中。。细节见正文对应章节。

AI智能系统适合哪些人或团队?

AI智能系统更适合:产品/技术负责人、运营与增长团队、需要落地智能体或自动化的中小团队、关注「AI智能系统」方向的读者。若你只需要单次聊天式问答,可先读概念;若要上生产,请重点看步骤、权限与风控相关段落。

关于「网络基础算法」,本文给出了什么结论?

在「网络基础算法」部分,要点是:- 1$ 的邻居顶点。一个简单的实现方式是,创建一个有 $n$ 个元素的数组存储从源顶点 $s$ 到其他所有顶点的距离,同时创建一个距离变量 $d$ 来记录当前在搜索过程中所处的层数,算法的具体流程如下: 最短路径 这种方法在最坏的情况下时间复杂度为 $O \left(m + n^2\right)$ ,考虑多数网络的直径只随 $\log n$ 增长,算法运行的时间复杂度为 $O \left(m + n \log n\right)$ 。

关于「最短路径」,本文给出了什么结论?

在「最短路径」部分,要点是:现方式是,创建一个有 $n$ 个元素的数组存储从源顶点 $s$ 到其他所有顶点的距离,同时创建一个距离变量 $d$ 来记录当前在搜索过程中所处的层数,算法的具体流程如下: 最短路径 这种方法在最坏的情况下时间复杂度为 $O \left(m + n^2\right)$ ,考虑多数网络的直径只随 $\log n$ 增长,算法运行的时间复杂度为 $O \left(m + n \log n\right)$ 。 上述算法中步骤 1 是最耗时的部分