Я пытаюсь реализовать алгоритм имитации отжига (SA) для решения случайного экземпляра задачи коммивояжера (TSP) в python. В моем коде у меня есть функция, которая вычисляет общую долготу тура, учитывая список с маршрутом и матрицей расстояния. Когда я запускаю свой код, у меня возникает следующая ошибка, связанная с этой функцией.
UnboundLocalError: локальная переменная 't', на которую ссылается перед присваиванием
Мой код имеет следующий вид:
N=4
D=np.zeros([N,N])
random.seed(13)
for i in range(N):
for j in range(N):
D[i,j]=random.randint(15,100)
for i in range(N):
D[i,i]=10000
print("")
print("- Number of cities=",N)
print("")
print("- =")
print("- Distance matrix")
print(D)
#GENERATE ROUTES FUNCTION:
def generar_tour(N):
ruta=range(N)
ruta_obtenida=random.sample(ruta,len(ruta))
return ruta_obtenida
#Function for calculating the length of the route
def distancia_tour(ejemplo,D):
longitud=0
for t in range(len(ejemplo)-1):
longitud=longitud+D[ejemplo[t],ejemplo[t+1]]
longitud=longitud+D[ejemplo[t+1],ejemplo[0]]
return longitud
#SIMULATED ANNEALING ALGORITHM
T_inicial=5000
tour_inicial=generar_tour(N)
distancia_inicial=distancia_tour(tour_inicial,D)
print("TOUR INICIAL=",tour_inicial,"| LONGITUD TOUR=",distancia_tour(tour_inicial,D))
tour_actual=[]
tour_vecino=[]
distancia_vecino=0
distancias=[]
iteracion=[]
IT_max=1000
iterador=1
contar=1
while T_inicial>10**(-5):
while iterador>IT_max:
tour_vecino=generar_tour(N)
distancia_vecino=distancia_tour(tour_vecino,D)
if distancia_vecino-distancia_inicial<0:
tour_actual=tour_vecino
else:
if random.random()<math.exp(-(distancia_vecino-distancia_inicial)/T_inicial):
tour_actual=tour_vecino
iterador=iterador+1
T_inicial=0.9999*T_inicial
print("RUTA=",tour_actual,"|","DISTANCIA TOTAL=",distancia_tour(tour_actual,D),"|","TEMPERATURA ACTUAL=",T_inicial)
distancias.append(distancia_tour(tour_actual,D))
iteracion.append(contar)
contar=contar+1
plt.plot(contar,distancias,'b')
plt.show()
Мне пришлось искать его в Google, но использование наиболее распространенного решения как «глобального», а другие не работают. Есть идеи? Я уверен, что это не сложная проблема, просто я этого не вижу. Есть намеки? Заранее благодарю и приветствую из Чили.