TSP的python解法 tsp问题python
时间: 2023-11-16 21:02:08 浏览: 47
TSP问题是指在给定的一些城市之间,求解访问每个城市一次并回到起始城市的最短路径。其中,TSP问题是一个NP难问题,因此需要使用一些高效的算法来解决。模拟退火算法是其中一种常用的算法之一,可以用来求解TSP问题。以下是一个使用Python实现的TSP问题的模拟退火算法解法:
```python
# -*- coding: utf-8 -*-
import numpy as np
import math
import random
# 计算两个城市之间的距离
def distance(city1, city2):
return math.sqrt((city1[0] - city2[0]) ** 2 + (city1[1] - city2[1]) ** 2)
# 计算路径长度
def path_length(path, cities):
length = 0
for i in range(len(path) - 1):
length += distance(cities[path[i]], cities[path[i+1]])
length += distance(cities[path[-1]], cities[path[0]])
return length
# 模拟退火算法求解TSP问题
def tsp_simulated_annealing(cities, T=10000, alpha=0.99, stopping_T=1e-8, stopping_iter=100000):
# 初始化路径
path = list(range(len(cities)))
# 初始化温度
temperature = T
# 记录最优路径和长度
best_path, best_length = path, path_length(path, cities)
# 迭代次数
iter_num = 0
# 迭代
while temperature > stopping_T and iter_num < stopping_iter:
# 生成新路径
new_path = path.copy()
# 随机交换两个城市的位置
rand1 = random.randint(0, len(cities) - 1)
rand2 = random.randint(0, len(cities) - 1)
while rand1 == rand2:
rand2 = random.randint(0, len(cities) - 1)
new_path[rand1], new_path[rand2] = new_path[rand2], new_path[rand1]
# 计算路径长度差
delta = path_length(new_path, cities) - path_length(path, cities)
# 判断是否接受新路径
if delta < 0 or math.exp(-delta / temperature) > random.random():
path = new_path
# 更新最优路径
if path_length(path, cities) < best_length:
best_path, best_length = path.copy(), path_length(path, cities)
# 降温
temperature *= alpha
# 迭代次数加1
iter_num += 1
return best_path, best_length
# 测试
if __name__ == '__main__':
# 随机生成10个城市
cities = np.random.rand(10, 2)
# 求解TSP问题
best_path, best_length = tsp_simulated_annealing(cities)
print('最优路径:', best_path)
print('最短路径长度:', best_length)
```