赞
踩
旅行商问题是一个经典的组合优化问题,具体描述如下:
举个简单的例子,如果我们有4个城市A、B、C、D及其之间的距离矩阵:
A B C D
A 0 10 15 20
B 10 0 35 25
C 15 35 0 30
D 20 25 30 0
我们的目标就是找到一条路径,如A -> B -> C -> D -> A,使得总距离最小。
适用于小规模问题,通过列出所有可能的路径并计算总距离,从中选择最小的路径。
例如 Held-Karp 算法,它使用动态规划思想,可以在 O ( n 2 ⋅ 2 n ) O(n^2 \cdot 2^n) O(n2⋅2n)时间内解决 TSP。
基本思路:
通过在解空间中剪枝来减少搜索的节点数,提高效率。
基本思路:
每次选择当前距离最近的未访问城市,虽然简单快速,但通常不能得到最优解。
基本思路:
这些方法在大规模问题中常用,可以得到近似最优解。
常见的启发式算法:
import numpy as np def nearest_neighbor(dist_matrix): n = len(dist_matrix) unvisited = list(range(1, n)) tour = [0] current_city = 0 while unvisited: next_city = min(unvisited, key=lambda city: dist_matrix[current_city][city]) tour.append(next_city) unvisited.remove(next_city) current_city = next_city tour.append(0) # Return to start return tour, compute_tour_length(dist_matrix, tour) def compute_tour_length(dist_matrix, tour): return sum(dist_matrix[tour[i]][tour[i + 1]] for i in range(len(tour) - 1)) # 示例距离矩阵 dist_matrix = np.array([ [0, 10, 15, 20], [10, 0, 35, 25], [15, 35, 0, 30], [20, 25, 30, 0] ]) tour, tour_length = nearest_neighbor(dist_matrix) print(f"Tour: {tour}") print(f"Tour Length: {tour_length}")
import numpy as np def held_karp(dist_matrix): n = len(dist_matrix) memo = {} def visit(S, i): if (S, i) in memo: return memo[(S, i)] if S == (1 << n) - 1: return dist_matrix[i][0] min_cost = float('inf') for j in range(n): if S & (1 << j) == 0: cost = dist_matrix[i][j] + visit(S | (1 << j), j) min_cost = min(min_cost, cost) memo[(S, i)] = min_cost return min_cost return visit(1, 0) # 示例距离矩阵 dist_matrix = np.array([ [0, 10, 15, 20], [10, 0, 35, 25], [15, 35, 0, 30], [20, 25, 30, 0] ]) tour_length = held_karp(dist_matrix) print(f"Optimal Tour Length: {tour_length}")
旅行商问题是一类经典且复杂的问题,虽然目前没有通用的多项式时间算法可以解决所有规模的 TSP,但通过穷举法、动态规划、分支定界法、贪心算法以及各种近似和启发式算法,可以在不同规模和需求下找到适合的解决方案。了解这些算法和其应用场景,将为你在计算机科学和算法研究中打下坚实的基础。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。