• tsp可视化python


    随机生成点的坐标并依据点集生成距离矩阵,通过点的坐标实现可视化

    c代码看我的这篇文章tsp动态规划递归解法c++

    1. from typing import List, Tuple
    2. import matplotlib.pyplot as plt
    3. from random import randint
    4. N: int = 4
    5. MAX: int = 0x7f7f7f7f
    6. distances: List[List[int]] = [[0 for _ in range(N)] for _ in range(N)]
    7. path: List[List[int]] = [[0 for _ in range(1 << (N - 1))] for _ in range(N)]
    8. dp: List[List[int]] = [[0 for _ in range(1 << (N - 1))] for _ in range(N)]
    9. points: List[Tuple[int, int ]]
    10. def creatDistances():
    11. global distances, dp
    12. # for i in range(N):
    13. # for j in range(N):
    14. # if i == j:
    15. # distances[i][j] = MAX
    16. # else:
    17. # temp = randint(1, 10)
    18. # while temp == 0:
    19. # temp = randint(1, 10)
    20. # distances[i][j] = temp
    21. # x=[[MAX, 3, 6, 7],
    22. # [5, MAX, 2, 3],
    23. # [6, 4, MAX, 2],
    24. # [3, 7, 5, MAX]]
    25. # for i in range(N):
    26. # for j in range(N):
    27. # distances[i][j] = x[i][j]
    28. creatpoints()
    29. for i in range(N):
    30. dp[i][0] = distances[i][0]
    31. def printDistances():
    32. global distances
    33. print("代价矩阵为:")
    34. for i in range(N):
    35. for j in range(N):
    36. if distances[i][j] == MAX:
    37. s = "INF"
    38. print(f"{s:<17}", end=" ")
    39. else:
    40. print(f"{distances[i][j]:<17}", end=" ")
    41. print()
    42. for i, point in enumerate(points):
    43. plt.text(*point, f'{i }', fontsize=12, ha='center', va='bottom')
    44. plt.scatter(*zip(*points))
    45. def removeCity(j: int, k: int) -> int:
    46. return j - (1 << (k - 1))
    47. def printPath(i: int, j: int) -> None:
    48. if j != 0:
    49. print(f"{i} -> ", end="")
    50. next_city = path[i][j]
    51. plt.plot((points[i][0],points[next_city][0]), (points[i][1],points[next_city][1]))
    52. printPath(next_city, removeCity(j, next_city))
    53. else:
    54. print(f"{i} -> {0}")
    55. plt.plot((points[i][0],0), (points[i][1],0))
    56. def creatpoints() ->None:
    57. ldasc: int = 1
    58. hdasc: int = 10
    59. dapr: int = N - 1
    60. global points
    61. points = [(0,0)]+[(randint(ldasc, hdasc), randint(ldasc, hdasc)) for i in range(dapr)]
    62. for i in range(N):
    63. for j in range(i, N):
    64. if i == j:
    65. distances[i][j] = MAX
    66. else:
    67. distances[i][j] = distances[j][i] = ((points[i][0]-points[j][0])**2+(points[i][1]-points[j][1])**2)**.5
    68. def drewpoints() ->None:
    69. global points
    70. def TSP(v: int, s: int) -> int:
    71. global distances, dp, path
    72. if dp[v][s] != 0:
    73. return dp[v][s]
    74. min = MAX
    75. for k in range(1, N):
    76. if ((s >> (k - 1)) & 1) == 1:
    77. t = TSP(k, removeCity(s, k))
    78. if (t + distances[v][k]) < min:
    79. min = t + distances[v][k]
    80. path[v][s] = k
    81. dp[v][s] = min
    82. return min
    83. if __name__ == "__main__":
    84. creatDistances()
    85. printDistances()
    86. print(f"最短距离为:{TSP(0, (1 << (N - 1)) - 1)}")
    87. print("最短路径为:")
    88. printPath(0, (1 << (N - 1)) - 1)
    89. print(points)
    90. plt.show()

  • 相关阅读:
    Java 线程池
    面向对象基础案例(2)
    个人养老金真的要来了,详解人社部、财政部、税务局、银保监会和证监会联合发布的《个人养老金实施办法》(要点概览+示意图+逐条解读)
    ES6之Symbol.isConcatSpreadable
    计算机中找不到d3dcompiler47.dll怎么解决,实用解决方法推荐
    如何正确操作封箱机
    logrus包学习(一)
    【PyCharm Community Edition】:excel操作
    Apache Doris (四十七): Doris表结构变更-Schema变更
    在Windows 10上安装单机版的hadoop-3.3.5
  • 原文地址:https://blog.csdn.net/m0_74644005/article/details/139680961