Python 动态规划实现旅行商问题(TSP)
以下是使用动态规划实现旅行商问题的修改后的代码:
import numpy as np
import matplotlib.pyplot as plt
from string import ascii_uppercase
import networkx as nx
np.random.seed(20)
cities = ascii_uppercase[:20]
locs = {cities[i]:(np.random.uniform(0,30),np.random.uniform(0,10)) for i in range(20)}
for c in cities:
plt.scatter(locs[c][0],locs[c][1])
plt.text(locs[c][0],locs[c][1]+0.2,c) # 标记点的标签
dist_array = np.zeros((20,20))
for i in range(20):
for j in range(20):
x1,y1 = locs[cities[i]]
x2,y2 = locs[cities[j]]
dist_array[i,j] = np.sqrt((x1-x2)**2+(y1-y2)**2)
# 动态规划解决旅行商问题
num_cities = len(cities)
dp = np.zeros((1 << num_cities, num_cities))
dp[1, 0] = 0
for mask in range(1, 1 << num_cities):
for i in range(num_cities):
if mask & (1 << i):
dp[mask, i] = np.inf
for j in range(num_cities):
if mask & (1 << j) and i != j:
dp[mask, i] = min(dp[mask, i], dp[mask ^ (1 << i), j] + dist_array[j, i])
# 从动态规划结果中回溯找到最优路径
path = [0]
mask = (1 << num_cities) - 1
while len(path) < num_cities:
last_city = path[-1]
next_city = None
for i in range(num_cities):
if mask & (1 << i) and (next_city is None or dp[mask, last_city] == dp[mask ^ (1 << last_city), i] + dist_array[i, last_city]):
next_city = i
path.append(next_city)
mask ^= (1 << next_city)
# 绘制路径
for i in range(len(path)-1):
c1 = cities[path[i]]
c2 = cities[path[i+1]]
x1,y1 = locs[c1]
x2,y2 = locs[c2]
plt.plot([x1,x2],[y1,y2],'r--')
for c in cities:
plt.scatter(locs[c][0],locs[c][1])
plt.text(locs[c][0],locs[c][1]+0.2,c) # 标记点的标签
plt.show()
这段代码使用动态规划方法解决旅行商问题,通过计算每个城市到其他城市的距离,并使用动态规划算法找到最短路径。最后将路径绘制在图上进行可视化展示。请注意,由于动态规划解决旅行商问题的时间复杂度较高,可能在城市数量较多时会需要较长的运行时间。
原文地址: https://www.cveoy.top/t/topic/bPzm 著作权归作者所有。请勿转载和采集!