Как решить: UnboundLocalError: локальная переменная 't', на которую ссылается перед присваиванием? в питоне? - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь реализовать алгоритм имитации отжига (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, но использование наиболее распространенного решения как «глобального», а другие не работают. Есть идеи? Я уверен, что это не сложная проблема, просто я этого не вижу. Есть намеки? Заранее благодарю и приветствую из Чили.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Как сказал Самуэль Малдун в своем ответе, ошибка означает, что вы пытались использовать t перед тем, как установить его значение. Проблема в вашем коде состоит в том, что трудно понять, как это могло произойти. Похоже, что вы всегда устанавливаете t в цикле for в distancia_tour, так как это не может быть установлено?

Получается, что из-за ошибки в вашем коде вы передаетепустой список для вашей distancia_tour функции. Длина пустого списка равна 0, поэтому ваш цикл for эффективен:

for t in range(-1):
    ...

range(-1) возвращает пустой список, поэтому в цикле for нет значений для перебора. t никогда не присваивается значение, и вы получаете ошибку, когда на следующую строку после цикла for ссылается t.

Причина, по которой он получает пустой список, заключается в том, что вы инициализируете tour_actualв пустой список, а затем не изменяйте его значение из-за ошибки в вашем while выражении. У вас есть while iterador>IT_max:, который никогда не выполняется, потому что iterador меньше IT_max. Вы, вероятно, хотели проверить на iterador < IT_max.

0 голосов
/ 08 ноября 2019

Это означает, что вы пытались читать с t, когда компьютер никогда не видел t раньше. Предположим, вы написали что-то вроде:

x = t*99 + 3

.... но t никогда не появлялся ранее в программе с ответом. Компьютер не может умножить t на 99, если не знает, что такое t. Вы пытались что-то сделать, используя t, прежде чем когда-либо присвоить ему что-либо.

...