徐涛 3 years ago
parent 68a400df8a
commit f00eb9ab98

Binary file not shown.

@ -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()

Loading…
Cancel
Save