← 返回目录

Chapter 15: 从路径说起

通道、迹、路径、回路、环,各种路径问题

🛤️ 基本概念•🗺️ 所有路径•🚀 最短路径•🔄 哈密尔顿•🚚 TSP

关于路径问题

路径是图论中最基本也是最重要的概念之一。 从简单的节点序列到复杂的优化问题,路径问题贯穿了图论的各个分支。 本章将系统介绍路径的基本概念,以及几个经典的路径问题。

我们将探讨通道、迹、路径、回路、环这些相似但不同的概念, 理解最短路径问题的求解方法, 认识欧拉路径和哈密尔顿路径的区别, 最后了解著名的旅行商问题(TSP)。

✦
15.1

基本概念

通道、迹、路径、回路、环

在图论中,通道(walk)、迹(trail)、路径(path)、回路(circuit)、环(cycle)这几个概念容易混淆。 它们的区别主要在于:是否允许重复节点、是否允许重复边、首尾是否闭合。

🔍 回路与环的行走过程

🎯 有向图中的路径与环

📊 概念对比表

类型重复节点重复边首尾闭合
通道 Walk✓ 允许✓ 允许开放/闭合
迹 Trail✓ 允许✗ 不允许开放
路径 Path✗ 不允许✗ 不允许开放
回路 Circuit✓ 允许✗ 不允许闭合
环 Cycle✗ 不允许✗ 不允许闭合
✦
15.2

常见路径问题

经典路径问题对比

图论中存在多种经典路径问题,它们在节点要求、边要求、优化目标等方面各有不同。 理解这些问题的区别和联系,有助于选择合适的算法解决实际问题。

📋 路径问题对比表

问题回到起点节点要求边要求优化要求
最短路径问题否--✓ 距离最短
欧拉路径否-不重复经过所有边-
欧拉回路✓ 是-不重复经过所有边-
中国邮递员问题✓ 是-至少经过一次✓ 路径最短
哈密尔顿路径否不重复经过所有节点最多经过一次-
哈密尔顿回路✓ 是不重复经过所有节点最多经过一次-
旅行商问题 (TSP)✓ 是不重复经过所有节点最多经过一次✓ 路径最短

🎯 核心区别

• 欧拉 vs 哈密尔顿:边 vs 节点
• 路径 vs 回路:开放 vs 闭合
• 存在性 vs 优化:判定 vs 求最优
• 多项式 vs NP:欧拉简单,哈密尔顿困难

💡 实际应用

• 导航系统:最短路径
• 邮递路线:中国邮递员问题
• 电路设计:欧拉路径(一笔画)
• 物流配送:TSP优化
✦
路径

路径与所有路径

探索图中的简单路径

路径(path)是通道的一种特殊情况, 它确保每个节点和每条边只经过一次。 在完全图K5中,任意两个节点之间存在多条路径, 其中长度最小的路径称为最短路径。 经过所有节点的路径称为哈密尔顿路径。

💻 NetworkX函数

nx.all_simple_paths(G, source, target)
nx.all_simple_edge_paths(G, source, target)
nx.has_path(G, source, target)

📊 路径长度

• 无权图:路径上的边数
• 有权图:边权重之和
• 完全图:任意两点直接相连
• 最短路径:长度最小的路径
✦
15.3

最短路径问题

寻找最优路线

最短路径问题(Shortest Path Problem)是图论中的经典问题, 目标是在加权图中找到两个节点之间权重和最小的路径。 常用算法包括Dijkstra算法、Floyd-Warshall算法、Bellman-Ford算法等。 最短路径在导航系统、网络路由、物流配送等领域有广泛应用。

🎯 算法选择

• 单源:Dijkstra (非负权重)
• 单源:Bellman-Ford (允许负权)
• 所有对:Floyd-Warshall
• 启发式:A*算法

📊 复杂度

Dijkstra: O(E + V log V)
Bellman-Ford: O(VE)
Floyd-Warshall: O(V³)
A*: 启发式优化

💻 NetworkX

shortest_path()
shortest_path_length()
dijkstra_path()
bellman_ford_path()
✦
15.4

欧拉路径

经过所有边恰好一次

欧拉路径(Eulerian Path)是指通过图中每条边恰好一次的路径,起点和终点不同。欧拉回路(Eulerian Cycle)则是经过每条边恰好一次并回到起点的闭合路径。 如果图中存在欧拉回路,该图称为欧拉图。 欧拉路径问题源于著名的哥尼斯堡七桥问题,是图论的起源之一。

🎯 定义与判定

欧拉路径
• 经过所有边恰好一次
• 起点 ≠ 终点(开放路径)
判定:恰有2个奇度节点
欧拉回路
• 经过所有边恰好一次
• 起点 = 终点(闭合回路)
判定:所有节点度数为偶数

🔍 柏拉图图中的欧拉回路

六面体图(正方体):
• 8个节点,12条边
• 所有节点度数为3(奇数)
✗ 不存在欧拉路径或欧拉回路
注意:原文图20可能存在错误。 正方体的所有节点度数为3(奇数),不满足欧拉回路条件(所有节点度数为偶数)。

📚 七桥问题

• 1736年:欧拉解决
• 问题:能否一次走过所有7座桥
• 结论:不存在欧拉路径
• 意义:图论的起源

🎯 实际应用

• 中国邮递员问题:路线规划
• 电路设计:一笔画问题
• DNA测序:序列重构
• 迷宫求解:路径遍历

💻 NetworkX

is_eulerian(G)
has_eulerian_path(G)
eulerian_path(G)
eulerian_circuit(G)
✦
15.5

哈密尔顿路径

经过所有节点恰好一次

哈密尔顿路径(Hamiltonian Path)是指经过图中每个节点恰好一次的路径。哈密尔顿回路(Hamiltonian Cycle)是起点和终点相同的哈密尔顿路径。 与欧拉路径(经过所有边)不同,哈密尔顿路径关注节点。 判断一个图是否存在哈密尔顿路径是NP完全问题。 所有柏拉图图都存在哈密尔顿回路。

🔄 欧拉 vs 哈密尔顿

欧拉路径
• 经过所有边恰好一次
• 有高效判定算法(多项式时间)
• 七桥问题
哈密尔顿路径
• 经过所有节点恰好一次
• NP完全问题(指数时间)
• 旅行商问题基础

📊 计算复杂度

• 判定问题:NP完全
• 枚举所有:指数级复杂度
• 回溯算法:常用求解方法
• 动态规划:O(n²·2ⁿ)
⚠️ 没有已知的多项式时间算法
✦
15.6

旅行商问题 (TSP)

最小化路径长度的哈密尔顿回路

旅行商问题(Traveling Salesman Problem, TSP) 是哈密尔顿路径问题的加权版本。 目标是找到访问所有城市恰好一次并回到起点的最短回路。 TSP是NP困难问题,对于n个城市,可能的路线数为(n-1)!/2。 TSP在物流配送、芯片制造、基因测序等领域有重要应用。

🎯 求解方法

• 精确算法:动态规划、分支限界
• 近似算法:Christofides (1.5倍)
• 启发式:遗传算法、模拟退火
• 局部搜索:2-opt、3-opt、Lin-Kernighan

📊 问题规模

5城市: 12条路线
10城市: 181,440条
15城市: 43亿条
20城市: 60万亿条
(n-1)!/2 增长极快

💻 NetworkX

from networkx.algorithms
  import approximation
tour = approximation
  .christofides(G)
Christofides算法保证不超过最优解的1.5倍
💡
TSP的实际应用

物流配送:快递公司每天都要解决TSP问题,优化配送路线以节省时间和成本。

芯片制造:PCB钻孔机需要在多个位置钻孔,TSP用于优化钻头移动路径。

基因测序:DNA片段测序问题可以建模为TSP,寻找最优的片段排列顺序。

天文观测:望远镜观测多个天体时,TSP用于规划最优的观测顺序。

✦

本章小结

本章系统介绍了图中的路径问题,从基本概念到经典算法问题。 路径问题是图论的核心内容,在计算机科学、运筹学、网络优化等领域都有重要应用。

📊 概念层次

🛤️
通道 → 迹 → 路径
从宽松到严格
🔄
回路 → 环
闭合路径

🎯 经典问题

• 最短路径:多项式时间算法
• 欧拉路径:经过所有边
• 哈密尔顿路径:经过所有节点(NP完全)
• TSP:最优哈密尔顿回路(NP困难)

💡 关键要点

算法复杂度
  • • 最短路径:P类问题,高效算法
  • • 哈密尔顿路径:NP完全,判定困难
  • • TSP:NP困难,优化困难
实用工具
  • • NetworkX提供丰富的路径算法
  • • 近似算法在实际中很重要
  • • 启发式方法解决大规模问题