数学建模社区-数学中国

标题: 旅行商问题(TSP):数模优化题里"最简单的难题" [打印本页]

作者: 2744557306    时间: 2026-8-23 17:33
标题: 旅行商问题(TSP):数模优化题里"最简单的难题"
Snipaste_2026-08-23_17-26-06.jpg 0 ~! C4 `  f+ Q8 e
Snipaste_2026-08-23_17-26-15.jpg * B- _) D4 q" I, x3 W
Snipaste_2026-08-23_17-26-25.jpg
8 {+ I% |. {$ O- @5 _9 {/ s Snipaste_2026-08-23_17-26-35.jpg ! R1 a; g9 l* `% Z( |2 N$ X
Snipaste_2026-08-23_17-26-44.jpg 5 \2 I9 z1 k) i  L
Snipaste_2026-08-23_17-26-51.jpg 5 f: F0 k# c+ ^" _
Snipaste_2026-08-23_17-26-59.jpg
/ F8 l+ m% n' V& Z- S! ^/ ^0 v* |% e Snipaste_2026-08-23_17-27-09.jpg 3 H+ V) d4 L7 _/ }5 F
Snipaste_2026-08-23_17-27-17.jpg
  1. from itertools import permutations
    1 U6 D9 h$ {" I) Y5 g3 J
  2. import math7 h0 b* Z- u, K( ?
  3. ( ?) F3 w* J$ @6 |$ o6 S* ~3 Q
  4. def tsp_brute(dist):; ~6 c& o' x5 L1 h4 \# L1 w: e
  5.     """dist: n×n 距离矩阵,返回 (最短长度, 最优回路)"""+ r- {9 _! {8 [0 z4 i) C
  6.     n = len(dist)/ ]% x, [( z3 F, ?7 _
  7.     best_len, best_tour = math.inf, None
    ) C& j3 K1 c+ I
  8.     for perm in permutations(range(1, n)):          # 固定起点 0+ a- x& ?7 Z- |" @+ a3 g  r
  9.         tour = [0] + list(perm)
    % g  N3 N' R6 h  s
  10.         L = sum(dist[tour[i]][tour[i+1]] for i in range(n-1)) + dist[tour[-1]][0]8 T& O0 ?) E: H, D. d6 ~% b
  11.         if L < best_len:
    7 m9 p2 F6 l  \9 s9 h3 O
  12.             best_len, best_tour = L, tour" h+ O( t% T8 O7 u5 L6 c6 ~
  13.     return best_len, best_tour2 Q0 T- o/ N2 a: y
  14. , v, |  x+ m6 m" Y9 j8 A
  15. # ---------- 2-opt 局部搜索(中大规模) ----------+ `! H3 J, V$ f2 {& d
  16. def tsp_2opt(dist, max_iter=1000):& H& x9 j2 |, ^# z/ g: W7 W
  17.     n = len(dist)
    1 N% ^2 u, p$ }( V9 K; S- e3 B' n3 Q  [
  18.     tour = list(range(n))                          # 初始:自然顺序
    0 u: S: d! y. |0 y, j5 C4 x* y
  19.     improved = True7 B% Z2 C* m' |7 F9 I
  20.     while improved and max_iter > 0:
    " z( q& z- N2 w) @2 @1 h+ }
  21.         improved = False# i$ ?$ ]0 A) J: t5 r. e1 }$ U
  22.         for i in range(1, n-2):
    9 h0 Q+ U& N" C# m9 Q# D! V
  23.             for k in range(i+1, n):
    : R$ A2 J/ i: r9 A; A* W- P
  24.                 # 翻转 tour[i:k+1]
    ; F* I0 q- p  h4 p( v2 h
  25.                 new_tour = tour[:i] + tour[i:k+1][::-1] + tour[k+1:], d0 m+ r8 J5 j' R0 h" R. {
  26.                 cur = sum(dist[tour[j]][tour[j+1]] for j in range(n-1)) + dist[tour[-1]][tour[0]]3 y/ i+ v- i5 z3 ~! V, r% q" C
  27.                 new = sum(dist[new_tour[j]][new_tour[j+1]] for j in range(n-1)) + dist[new_tour[-1]][new_tour[0]]
    7 m3 w( o: C. K, l$ l% e- M
  28.                 if new < cur:9 k0 k4 D3 O/ q
  29.                     tour, improved = new_tour, True/ d& J3 Q  E: x$ w0 x
  30.                     max_iter -= 11 v7 f9 x( g+ J1 x' d
  31.     L = sum(dist[tour[j]][tour[j+1]] for j in range(n-1)) + dist[tour[-1]][tour[0]]
    - q! r5 k  l5 O4 Y) k& n
  32.     return L, tour
    $ M. I4 V7 v. p

  33. 2 e" m5 ?4 }4 [$ b- H; |6 O5 r
  34. # ---------- 测试:4 城市 ----------
    0 G" o* g  |) _- b0 s: R9 U
  35. dist = [
    ( n1 B; A4 D. B8 ]
  36.     [0, 10, 15, 20],3 `9 n! a  O4 y. L8 V
  37.     [10, 0, 35, 25],
    ( I) s. y& c! Y" V
  38.     [15, 35, 0, 30],2 P  r; _/ c  x3 N" R, Y0 u
  39.     [20, 25, 30, 0]
    ( M9 M* k9 G1 Z, a& k  z
  40. ]
    ' k6 |) j) r6 e/ L" {* v: t3 M
  41. print("暴力 DFS:", tsp_brute(dist))   # 最短长度 80,回路 0→1→3→2→0
    2 t0 q$ p* I: p& b2 i) G% w  G
  42. print("2-opt   :", tsp_2opt(dist))
复制代码
7.2 运行结果
  1. 暴力 DFS: (80, [0, 1, 3, 2])* z# m* L& Q7 _# q
  2. 2-opt   : (95, [0, 1, 2, 3])
复制代码
观察:暴力 DFS 保证全局最优( 时可行)。2-opt 从自然顺序出发卡在局部最优 95,未能到达最优解 80——这正是 2-opt 的经典陷阱:单次运行可能陷入局部最优。竞赛中应多次随机重启或结合其他启发式(如先用最近邻初始化再 2-opt)。这也是为什么论文里必须报告"与精确解的 gap",而不是只报一个数字。

8. 竞赛真题映射
年份
CUMCM 题目方向
TSP 变体
0 e9 N* F3 Q" S7 y) a1 k, I6 L& S
1998B灾情巡视路线巡检 TSP(带时间窗 / 部分覆盖)& Q  e) k1 n0 r6 Q) f' }
2001C公交车线路设计路径规划 + 容量约束(VRP 变体)- }7 G; Y; s; [1 O! L, W7 y
2008B啤酒运输问题配送路径优化
; N2 x% F' F& S( y. P0 ^- r2011A高速公路收费站路网遍历 + 费用优化1 @+ B* m  p, o
2015A太阳能小屋设备布点 + 巡检路径+ {1 f" e4 r  T' s9 r' z, D1 j+ G" D
2017B煤炭产量预测无关(数据题)7 [8 m: D; U( M! M/ I" q* ^6 L8 x
2020A炉温曲线无关(拟合题)* k5 \' ^' O" Y; N. T6 w+ s
近年物流配送 / 应急巡检 / 传感器网络TSP / VRP / 覆盖路径

核心规律:只要赛题出现"一条路走遍多个地点",TSP 或其变体(VRP、TSP with Time Windows、多车 TSP)就是最自然的建模原型。先用 TSP 建原型,再根据约束升级为 VRP,是数模竞赛的成熟套路。


9. 常见误区与赛场自查
#
误区
正解

* e, f8 b; d: q* j1"TSP 可以用贪心算法精确求解"贪心(最近邻)不保证最优,存在反例
( R  A6 J1 C# D) @, o2"2-opt 一定得到全局最优"2-opt 是局部搜索,可能陷入局部最优
  `' c7 ~) j, W; w3"TSP 和指派问题等价"TSP 要求单一回路,指派问题允许子回路
, W* b9 H1 E4 R2 t  w$ u4"子回路消除约束可以一次性写完"数量  级别,实际用逐步加入(lazy constraint)& ?% e" ~8 W# I& H) j
5"DP 复杂度 "准确是 ,每状态需  转移
% ^/ ?4 U( W0 X: K: U( b- W: ]6"所有 TSP 都有常数近似比"仅度量 TSP(三角不等式)有 Christofides  近似
# ]  M& K8 F) j9 m5 W5 d9 \, M7"对称 TSP 和非对称 TSP 一样"对称: 种回路;非对称: 种

赛场自查清单:


10. 参考文献

[1] Dantzig, G. B., Fulkerson, D. R., & Johnson, S. M. (1954). Solution of a Large-Scale Traveling-Salesman Problem. Operations Research, 2(4), 393–410. DOI: 10.1287/opre.2.4.393. https://doi.org/10.1287/opre.2.4.393

[2] Held, M., & Karp, R. M. (1961). A dynamic programming approach to sequencing problems. Proceedings of the 1961 16th ACM National Meeting, pp. 71.201–71.204. DOI: 10.1145/800029.808532. https://doi.org/10.1145/800029.808532

[3] Held, M., & Karp, R. M. (1962). The traveling-salesman problem and minimum spanning trees: Part II. Operations Research, 18(6), 1138–1162. DOI: 10.1287/opre.18.6.1138.

[4] Lawler, E. L., Lenstra, J. K., Rinnooy Kan, A. H. G., & Shmoys, D. B. (Eds.) (1985). The Traveling Salesman Problem: A Guided Tour of Combinatorial Optimization. Wiley-Interscience Series in Discrete Mathematics, Vol. 12. Chichester: John Wiley & Sons. ISBN 978-0-471-90413-7.

[5] Applegate, D. L., Bixby, R. E., Chvátal, V., & Cook, W. J. (2011). The Traveling Salesman Problem: A Computational Study. Princeton Series in Applied Mathematics. Princeton, NJ: Princeton University Press. ISBN 978-0-691-12993-8 (print), 978-1-400-84110-3 (ebook). https://press.princeton.edu/books/ebook/9781400841103/the-traveling-salesman-problem-pdf

[6] Cook, W. (2012). In Pursuit of the Traveling Salesman: Mathematics at the Limits of Computation. Princeton, NJ: Princeton University Press. ISBN 978-0-691-16352-9.

[7] 姜启源, 谢金星, 叶俊. 数学模型. 5版. 北京: 高等教育出版社, 2018. ISBN 978-7-04-049222-4.

[8] 司守奎, 孙玺菁. 数学建模算法与应用. 3版. 北京: 国防工业出版社, 2021. ISBN 978-7-118-12278-7.

[9] 胡运权, 主编. 运筹学教程. 5版. 北京: 清华大学出版社, 2018. ISBN 978-7-302-48125-6. https://www.tup.tsinghua.edu.cn/wap/tsxqy.aspx?id=07656604

给参赛学生的一句话:TSP 是数模优化题里"最简单的难题"——问题描述一句话,求解却需要一整套组合优化工具箱。小规模用 B&B/DP 保证最优,大规模用 2-opt 给出好解并报告 gap,这是评委最认可的"务实"策略。记住:能证明最优的解,比看似漂亮但无保证的解更有说服力。

' \  a! p0 c) u5 ?2 g# y

4 x+ e8 B0 N, x5 V% [9 G




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5