完全图
:两两城市间都有直达的路线,这条路线不需要经过中间其他节点;
非完全图
:偶尔有两个城市间的路线需要经过其他中间节点。
什么是旅行商问题旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。从图论的角度来看,该问题实质是在一个带权完全无向图中,找一个权值最小的Hamilton回路。由于该问题的可行解是所有顶点的全排列...
TSP
简介
一个商人从一点出发,经过所有点后返回原点。它需要满足:除起点和终点外,所有点当且仅当经过一次;起点与终点重合;所有点构成一个连通图。要求:得到这个商人经过所有点的最短路程。
TSP
模型表示
设x[i][j]是一个0-1变量,其中1表示点i与点j之间有连边,0表示这两点之间无连边,值得注意的是:x[i][j]不一定等于x[j][i]。
设c[i][j]表示点i到点j的距离,同理,...
# -
TSP
-
本文主要是用以下方法解决
旅行商问题
(
TSP
问题)
详情见:https://blog.csdn.net/weixin_42715356/article/details/83089108
自顶向下的算法:深度优先搜索算法->回溯法
:广度优先搜索算法->分支限界算法
自底向上的算法:动态规划
启发式策略
贪心算法、蚁群算法
旅行商问题
(Travelling Salesman Problem, 简记
TSP
,亦称货郎担问题):设有n个城市和距离矩阵D=[dij],其中dij表示城市i到城市j的距离,i,j=1,2 … n,则问题是要找出遍访每个城市恰好一次的一条回路并使其路径长度为最短。
一、动态规划解决
旅行商问题
要使用动态规划,需要问题本身有最优子结构,我们需要找到要解决的问题的子问题。题目要求,从0(a)出发,经过[1(b),2©,3(d)]这几个城市,然后回到0,使得花费最少。要实现这个要求,需要从下面
# 计算从当前城市出发到未访问过的城市的距离
def nearest_neighbor(current_city, unvisited_cities):
return min(unvisited_cities, key=lambda city: distance(current_city, city))
#
TSP
主函数
def
tsp
(cities):
start_city = cities[0]
unvisited_cities = set(cities[1:])
tour = [start_city]
while unvisited_cities:
nearest_city = nearest_neighbor(tour[-1], unvisited_cities)
tour.append(nearest_city)
unvisited_cities.remove(nearest_city)
tour.append(start_city)
return tour
if __name__ == "__main__":
cities = [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]
print(
tsp
(cities))
输出结果为:
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (0, 0)]
这表示从起点出发,按照距离最近的顺序访问每个城市,最后回到起点的路径为 `(0, 0) -> (1, 1) -> (2, 2) -> (3, 3) -> (4, 4) -> (5, 5) -> (0, 0)`。