数学建模社区-数学中国

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

作者: 2744557306    时间: 2026-8-23 17:33
标题: 旅行商问题(TSP):数模优化题里"最简单的难题"
Snipaste_2026-08-23_17-26-06.jpg . d1 e" t1 o( r+ u/ j0 V: @8 d
Snipaste_2026-08-23_17-26-15.jpg
; c' Q" Q: r: c Snipaste_2026-08-23_17-26-25.jpg
* Z2 Q% [4 h+ @+ d1 `- T- }: c& X Snipaste_2026-08-23_17-26-35.jpg * `4 f' f' J8 [  p% E
Snipaste_2026-08-23_17-26-44.jpg 1 n9 U) v8 l1 J, l$ z, H
Snipaste_2026-08-23_17-26-51.jpg
% P& l& P' W0 s: o+ E0 Z Snipaste_2026-08-23_17-26-59.jpg
; j- N2 |$ m, ?5 [9 b Snipaste_2026-08-23_17-27-09.jpg . [9 y( h% B& a4 L
Snipaste_2026-08-23_17-27-17.jpg
  1. from itertools import permutations
    5 n1 ?4 c. Z: T% z& ]
  2. import math: i' n2 p. v' }2 l# ]
  3. 3 B) N8 ^3 m7 k2 ~# W" B
  4. def tsp_brute(dist):" w! ]4 q, b+ r% a/ F- Z3 o
  5.     """dist: n×n 距离矩阵,返回 (最短长度, 最优回路)"""! n# d" ?  l7 ]1 F& W
  6.     n = len(dist)4 S# @" K2 I1 }1 m, z
  7.     best_len, best_tour = math.inf, None# _/ o$ E5 e' ~! e: N
  8.     for perm in permutations(range(1, n)):          # 固定起点 0
    7 R6 a! r- d. t" x  D/ A
  9.         tour = [0] + list(perm)0 X3 L8 b3 U+ H. x( X6 r0 u& B! |
  10.         L = sum(dist[tour[i]][tour[i+1]] for i in range(n-1)) + dist[tour[-1]][0]3 i% J" _, N, s2 n
  11.         if L < best_len:
    1 l9 P8 `  Z" c$ V* ^
  12.             best_len, best_tour = L, tour
    : c, m( y7 _+ H3 C/ p; b
  13.     return best_len, best_tour" w- r7 t) C: J% w

  14.   Q2 V) X3 S: J1 j: A0 W
  15. # ---------- 2-opt 局部搜索(中大规模) ----------
    : G% n/ {2 y+ {
  16. def tsp_2opt(dist, max_iter=1000):) Q2 L0 ^& S/ K# y- \3 N
  17.     n = len(dist)) M' ?, Q- d. Y, g" w5 u% \
  18.     tour = list(range(n))                          # 初始:自然顺序4 s" c- a& _: E  \
  19.     improved = True( T  @5 p  r" x0 J; c$ ^
  20.     while improved and max_iter > 0:. M/ t* _2 n8 f# W+ o5 n4 B
  21.         improved = False
    * j- U; |, L% {$ u
  22.         for i in range(1, n-2):. P6 v: p! P' r# ]5 O
  23.             for k in range(i+1, n):
    5 u3 E5 s/ q) I( A# X
  24.                 # 翻转 tour[i:k+1]3 l; |& Y: _5 O& h5 m$ n; ]  _
  25.                 new_tour = tour[:i] + tour[i:k+1][::-1] + tour[k+1:]. d: ]% ?, `1 n- M6 N. h/ r' w% A3 n
  26.                 cur = sum(dist[tour[j]][tour[j+1]] for j in range(n-1)) + dist[tour[-1]][tour[0]]
    ' p: d7 t# ^. k  [! H+ u
  27.                 new = sum(dist[new_tour[j]][new_tour[j+1]] for j in range(n-1)) + dist[new_tour[-1]][new_tour[0]]1 |. {7 K& e/ d, p
  28.                 if new < cur:
    2 X; i/ W/ u" r1 j
  29.                     tour, improved = new_tour, True
    ; k! _6 Z" d; M" S. m8 A: V
  30.                     max_iter -= 1
    " }0 g0 l% n; |, D) o
  31.     L = sum(dist[tour[j]][tour[j+1]] for j in range(n-1)) + dist[tour[-1]][tour[0]]
    2 I; c/ n5 Z7 H2 w( U
  32.     return L, tour
    / q# k( c, x  }4 v% y0 u
  33. 4 C1 Z! D/ }! e9 U" e% @
  34. # ---------- 测试:4 城市 ----------1 b4 d2 F) ?4 F0 P! Y
  35. dist = [
    6 T4 S, w' X# P# i! l7 e
  36.     [0, 10, 15, 20],
    ( r  r$ l2 }4 x/ g2 e
  37.     [10, 0, 35, 25],4 h! f" p" C5 r9 v3 o( b! W# {0 r
  38.     [15, 35, 0, 30],
    3 [' R1 \- m5 R
  39.     [20, 25, 30, 0]& P3 a$ W* E7 A9 u% m  ]6 y
  40. ]
    . S: x2 R! b5 H3 A7 Q& F4 Y
  41. print("暴力 DFS:", tsp_brute(dist))   # 最短长度 80,回路 0→1→3→2→0; w4 E! Q- I$ \, x  p. ^% x
  42. print("2-opt   :", tsp_2opt(dist))
复制代码
7.2 运行结果
  1. 暴力 DFS: (80, [0, 1, 3, 2])5 q8 f  q/ V8 l+ ~1 q" i4 a
  2. 2-opt   : (95, [0, 1, 2, 3])
复制代码
观察:暴力 DFS 保证全局最优( 时可行)。2-opt 从自然顺序出发卡在局部最优 95,未能到达最优解 80——这正是 2-opt 的经典陷阱:单次运行可能陷入局部最优。竞赛中应多次随机重启结合其他启发式(如先用最近邻初始化再 2-opt)。这也是为什么论文里必须报告"与精确解的 gap",而不是只报一个数字。

8. 竞赛真题映射
年份
CUMCM 题目方向
TSP 变体

  P* y; L& M) }* U' n1998B灾情巡视路线巡检 TSP(带时间窗 / 部分覆盖)
4 |/ A% H. E7 k8 o  K) r, O2001C公交车线路设计路径规划 + 容量约束(VRP 变体)
8 t  x: e3 r! S- T( a+ e2008B啤酒运输问题配送路径优化
0 r1 c  b+ D0 B4 g7 t& A2 V8 L2011A高速公路收费站路网遍历 + 费用优化. I+ N% `* q* O. h
2015A太阳能小屋设备布点 + 巡检路径
/ F) n' Z5 n8 e+ A2017B煤炭产量预测无关(数据题)- G6 N. [9 ]. F% q! ^7 C
2020A炉温曲线无关(拟合题)8 G( w3 h: a- R1 c% L
近年物流配送 / 应急巡检 / 传感器网络TSP / VRP / 覆盖路径

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


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

9 a  `- _7 W, W7 q/ h& D, n  p1"TSP 可以用贪心算法精确求解"贪心(最近邻)不保证最优,存在反例- ], T6 Q& f) B, Q8 K
2"2-opt 一定得到全局最优"2-opt 是局部搜索,可能陷入局部最优! A& O6 }' Q) h, m
3"TSP 和指派问题等价"TSP 要求单一回路,指派问题允许子回路
$ W- h8 N# f8 ]* G, l% w4"子回路消除约束可以一次性写完"数量  级别,实际用逐步加入(lazy constraint)
) m( |7 I6 N; `5"DP 复杂度 "准确是 ,每状态需  转移
5 W: |( b) y; U- P1 t" w; L6"所有 TSP 都有常数近似比"仅度量 TSP(三角不等式)有 Christofides  近似
. k+ E+ Z  a& \1 c* W7"对称 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,这是评委最认可的"务实"策略。记住:能证明最优的解,比看似漂亮但无保证的解更有说服力


1 m, W! s# a* M! h0 w" R7 F6 f0 c





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