随机生成点的坐标并依据点集生成距离矩阵,通过点的坐标实现可视化
c代码看我的这篇文章tsp动态规划递归解法c++
- from typing import List, Tuple
- import matplotlib.pyplot as plt
- from random import randint
-
- N: int = 4
- MAX: int = 0x7f7f7f7f
-
- distances: List[List[int]] = [[0 for _ in range(N)] for _ in range(N)]
- path: List[List[int]] = [[0 for _ in range(1 << (N - 1))] for _ in range(N)]
- dp: List[List[int]] = [[0 for _ in range(1 << (N - 1))] for _ in range(N)]
- points: List[Tuple[int, int ]]
-
- def creatDistances():
- global distances, dp
- # for i in range(N):
- # for j in range(N):
- # if i == j:
- # distances[i][j] = MAX
- # else:
- # temp = randint(1, 10)
- # while temp == 0:
- # temp = randint(1, 10)
- # distances[i][j] = temp
- # x=[[MAX, 3, 6, 7],
- # [5, MAX, 2, 3],
- # [6, 4, MAX, 2],
- # [3, 7, 5, MAX]]
- # for i in range(N):
- # for j in range(N):
- # distances[i][j] = x[i][j]
- creatpoints()
- for i in range(N):
- dp[i][0] = distances[i][0]
-
-
- def printDistances():
- global distances
- print("代价矩阵为:")
- for i in range(N):
- for j in range(N):
- if distances[i][j] == MAX:
- s = "INF"
- print(f"{s:<17}", end=" ")
- else:
- print(f"{distances[i][j]:<17}", end=" ")
- print()
- for i, point in enumerate(points):
- plt.text(*point, f'{i }', fontsize=12, ha='center', va='bottom')
- plt.scatter(*zip(*points))
-
- def removeCity(j: int, k: int) -> int:
- return j - (1 << (k - 1))
-
-
- def printPath(i: int, j: int) -> None:
- if j != 0:
- print(f"{i} -> ", end="")
- next_city = path[i][j]
- plt.plot((points[i][0],points[next_city][0]), (points[i][1],points[next_city][1]))
- printPath(next_city, removeCity(j, next_city))
- else:
- print(f"{i} -> {0}")
- plt.plot((points[i][0],0), (points[i][1],0))
-
-
- def creatpoints() ->None:
- ldasc: int = 1
- hdasc: int = 10
- dapr: int = N - 1
- global points
- points = [(0,0)]+[(randint(ldasc, hdasc), randint(ldasc, hdasc)) for i in range(dapr)]
- for i in range(N):
- for j in range(i, N):
- if i == j:
- distances[i][j] = MAX
- else:
- distances[i][j] = distances[j][i] = ((points[i][0]-points[j][0])**2+(points[i][1]-points[j][1])**2)**.5
- def drewpoints() ->None:
- global points
-
-
-
- def TSP(v: int, s: int) -> int:
- global distances, dp, path
- if dp[v][s] != 0:
- return dp[v][s]
- min = MAX
- for k in range(1, N):
- if ((s >> (k - 1)) & 1) == 1:
- t = TSP(k, removeCity(s, k))
- if (t + distances[v][k]) < min:
- min = t + distances[v][k]
- path[v][s] = k
- dp[v][s] = min
- return min
-
-
- if __name__ == "__main__":
- creatDistances()
- printDistances()
- print(f"最短距离为:{TSP(0, (1 << (N - 1)) - 1)}")
- print("最短路径为:")
- printPath(0, (1 << (N - 1)) - 1)
- print(points)
- plt.show()