tsp可视化python

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

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

python 复制代码
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()
相关推荐
智航GIS3 分钟前
Python 3.4.1官方教程中文版分享
python
赏金术士10 分钟前
Kotlin 从入门到进阶 之作用域函数 & 优雅写法(五)
android·开发语言·kotlin
qq_4142565711 分钟前
组件懒加载如何处理 JS 报错后的重试加载?保障应用高可用性实战
jvm·数据库·python
qq_3926906621 分钟前
如何优化SQL长文本字段查询_通过选择性返回减少IO消耗
jvm·数据库·python
openKaka_21 分钟前
从 scheduleUpdateOnFiber 到 Root 微任务调度:React 如何把更新交给调度系统
开发语言·前端·javascript
梦梦代码精35 分钟前
《企业开源商城选型:商业闭环、二次开发与成本平衡》
java·开发语言·低代码·开源·github
前进的李工39 分钟前
智能Agent实战指南:记忆组件嵌入技巧(记忆)
开发语言·前端·javascript·python·langchain·agent
西洼工作室41 分钟前
B站登录流程全解析:RSA+极验验证
前端·python·极验
zhaoyong22241 分钟前
如何在 MySQL 中实现基于全字段唯一性的重复行计数更新
jvm·数据库·python
X566143 分钟前
为什么宝塔面板网站无法正常连接外部远程数据库_检查服务器安全组放行端口并开启IP授权
jvm·数据库·python