How to solve: UnboundLocalError: local variable 't' referenced before assignment? in python?
How to solve: UnboundLocalError: local variable 't' referenced before assignment? in python?
我正在尝试实施模拟退火 (SA) 算法来解决 python 中旅行商问题 (TSP) 的随机实例。在我的代码中,我有一个函数可以计算旅行的总经度,给定一个包含路线和距离矩阵的列表。当我 运行 我的代码出现以下与此函数相关的错误时。
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 上搜索它,但使用最常见的解决方案 "global" 和其他解决方案不起作用。有任何想法吗?我确信这不是一个难题,只是我没有看到它。有什么提示吗?在此先感谢智利的问候。
这意味着当计算机以前从未见过 t
时,您尝试从 t
读取。
假设你写了这样的东西:
x = t*99 + 3
..... 但 t
从未在程序的前面出现过回答。计算机无法将 t
乘以 99,除非它知道 t
是什么。在分配任何内容之前,您尝试使用 t
做某事。
正如 Samuel Muldoon 在他的回答中所说,该错误意味着您在设置其值之前尝试使用 t
。您的代码中的挑战是很难看出这是如何发生的。 distancia_tour
里的for
循环里好像总是设置t
,怎么不设置呢?
事实证明,由于您的代码中存在错误,您向 distancia_tour
函数传递了一个空列表。空列表的长度为 0,因此您的 for
循环实际上是:
for t in range(-1):
...
range(-1)
returns 一个空列表,因此在 for
循环中没有要迭代的值。 t
永远不会被赋予一个值,当在 for
循环之后的下一行引用 t
时,您会收到错误消息。
它得到一个空列表的原因是您将 tour_actual
初始化为一个空列表,然后由于 while
语句中的错误而没有更改它的值。您有 while iterador>IT_max:
,它永远不会执行,因为 iterador
小于 IT_max
。您可能打算测试 iterador < IT_max
.
我正在尝试实施模拟退火 (SA) 算法来解决 python 中旅行商问题 (TSP) 的随机实例。在我的代码中,我有一个函数可以计算旅行的总经度,给定一个包含路线和距离矩阵的列表。当我 运行 我的代码出现以下与此函数相关的错误时。
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 上搜索它,但使用最常见的解决方案 "global" 和其他解决方案不起作用。有任何想法吗?我确信这不是一个难题,只是我没有看到它。有什么提示吗?在此先感谢智利的问候。
这意味着当计算机以前从未见过 t
时,您尝试从 t
读取。
假设你写了这样的东西:
x = t*99 + 3
..... 但 t
从未在程序的前面出现过回答。计算机无法将 t
乘以 99,除非它知道 t
是什么。在分配任何内容之前,您尝试使用 t
做某事。
正如 Samuel Muldoon 在他的回答中所说,该错误意味着您在设置其值之前尝试使用 t
。您的代码中的挑战是很难看出这是如何发生的。 distancia_tour
里的for
循环里好像总是设置t
,怎么不设置呢?
事实证明,由于您的代码中存在错误,您向 distancia_tour
函数传递了一个空列表。空列表的长度为 0,因此您的 for
循环实际上是:
for t in range(-1):
...
range(-1)
returns 一个空列表,因此在 for
循环中没有要迭代的值。 t
永远不会被赋予一个值,当在 for
循环之后的下一行引用 t
时,您会收到错误消息。
它得到一个空列表的原因是您将 tour_actual
初始化为一个空列表,然后由于 while
语句中的错误而没有更改它的值。您有 while iterador>IT_max:
,它永远不会执行,因为 iterador
小于 IT_max
。您可能打算测试 iterador < IT_max
.