TSP问题:假设有六个城市,一销售商从其中的某一城市出发,不重复地走完其余5个城市并回到原出发点,在所有可能的路径中求出路径长度最短的一条。六个城市坐标为:城市1(87,7)、城市2(91,38)、城市3(83,46)、城市4(71,44)、城市5(64,60)、城市6(68,58)。
import math
import itertools
import numpy as np
import matplotlib.pyplot as plt
#输入城市坐标,用字典存储
city={'x':[87,91,83,71,64,68],'y':[7,38,46,44,60,58]}
#计算城市之间的距离矩阵
n=len(city['x']) # 城市个数
#print(city['x'])
# print(n)
x=city['x']
y=city['y']
#print(x[0])
a=np.zeros((n,n))
for i in range(n):
for j in range(n):
a[i,j] = math.sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2))
#print(a[0,1])
#生成6个城市的全排列
v=list(itertools.permutations([1,2,3,4,5,6],n))
#print(v[1][0])
m=len(v)
dis=[]
#print(m)
for i in range(m):
sum=0
for j in range(n-1):
sum=sum+a[v[i][j]-1,v[i][j+1]-1]
sum=sum+a[v[i][j+1]-1,v[i][0]-1]
dis.append(sum)
print('最小的是:',min(dis))
best=min(dis)
#print(best)
c=dis.index(min(dis))
print('最短路径:',v[c])
#绘图
#p1=[68,83,91,87,71,64]
#p2=[58,46,38,7,44,60]
p1=[]
p2=[]
for i in v[c]:
p1.append(x[i-1])
p2.append(y[i-1])
for i in range(n):
plt.plot( p1,p2, color='r')
plt.scatter( p1[i], p2[i], color='b' )
plt.show()