diff --git a/TSP/TSP.zip b/TSP/TSP.zip new file mode 100644 index 0000000..a9e666b Binary files /dev/null and b/TSP/TSP.zip differ diff --git a/TSP/src/TSP.py b/TSP/src/TSP.py index e8b491d..5a793f3 100644 --- a/TSP/src/TSP.py +++ b/TSP/src/TSP.py @@ -1,11 +1,10 @@ +import matplotlib import numpy as np import matplotlib.pyplot as plt -import pdb +import matplotlib.animation as animation import random as rd from math import sqrt, exp -from os import path -from matplotlib.lines import Line2D -import matplotlib.animation as animation +import os "旅行商问题 ( TSP , Traveling Salesman Problem )" ''' 编写模拟退火算法解旅行商问题 @@ -17,9 +16,8 @@ import matplotlib.animation as animation # input - def loadin_data(): - local_path = path.dirname(__file__) + local_path = os.path.dirname(__file__) with open(local_path + '/../testdata/1.txt', 'r') as f: data = f.read() data = data.split() @@ -34,30 +32,12 @@ def loadin_data(): return x, y -loadin_data() -x, y = loadin_data() -#print(x, y) -path = [x, y] - - def distance(path, i, j): a = path[0][i]-path[0][j] b = path[1][i]-path[1][j] return sqrt(a**2+b**2) -# distance_matrix = [] -# for i in range(len(x)): -# distance_matrix.append([]) -# # print(distance_matrix) -# for i in range(2): -# for j in range(len(x)): -# distance_matrix[i].append(distance(path, i, j)) - -# print(distance_matrix[1]) -# print(len(distance_matrix[0])) - - def exchange(path, a, b): path[0][a], path[0][b] = path[0][b], path[0][a] path[1][a], path[1][b] = path[1][b], path[1][a] @@ -72,21 +52,11 @@ def sum_distance(path): return sum - - -ax1 = plt.axes([0,0,1,1]) -# ax2 = plt.axes([0.55,0.05,0.95,0.9]) -fig, ax = plt.subplots() -def draw_line(path): - for j in range(len(path[0])-1): - line1 = [(path[0][j], path[1][j]), (path[0][j+1], path[1][j+1])] - (line1_xs, line1_ys) = zip(*line1) - ax.add_line(Line2D(line1_xs, line1_ys, linewidth=1, color='blue')) - line1 = [(path[0][0], path[1][0]), - (path[0][len(path[0])-1], path[1][len(path[0])-1])] - (line1_xs, line1_ys) = zip(*line1) - ax.add_line(Line2D(line1_xs, line1_ys,linewidth=1, color='blue')) - +x, y = loadin_data() +path = [x, y] +plt.figure(figsize=(10,5)) +ax1 = plt.axes([0.05, 0.05, 0.4, 0.9]) +ax2 = plt.axes([0.55, 0.05, 0.4, 0.9]) T = 100 alpha = 0.95 @@ -95,18 +65,18 @@ current = sum_distance(path) print(current, '\n') next = 0 count = 0 -xl=[] -yl=[] +xl = [] +yl = [] plt.cla() -plt.ion() +plt.ion() # 打开交互模式 while(True): if(T < 0.05): break oldcurrent = current for i in range(iters): a, b = rd.sample(range(0, len(path[0])), 2) - newpath=[[],[]] - for x,y in zip(path[0],path[1]): + newpath = [[], []] + for x, y in zip(path[0], path[1]): newpath[0].append(x) newpath[1].append(y) # print(newpath) @@ -122,22 +92,23 @@ while(True): elif (rd.random() < exp(-(next - current)/T)): current = next path = newpath.copy() - plt.cla() - draw_line(path) - ax.plot(path[0], path[1],'ro') - plt.pause(0.05) - if(oldcurrent!=current): + plt.cla() # 清除画板 + ax2.plot(path[0], path[1], 'b.-') + ax2.plot([path[0][0], path[0][-1]], [path[1][0], path[1][-1]], 'b.-') + ax2.plot(path[0], path[1], 'ro') + plt.pause(0.05) + if(oldcurrent != current): # print(count) count += 1 xl.append(count) yl.append(current) - ax1.plot(xl,yl) - oldcurrent=current + ax1.plot(xl, yl) + oldcurrent = current T = alpha * T print(T) -for x,y in zip(path[0],path[1]): - print("(",x,y,")-->",end='') +for x, y in zip(path[0], path[1]): + print("(", x, y, ")-->", end='') print(current) plt.ioff() plt.show()