如何解决:UnboundLocalError:赋值之前引用了局部变量“ t”?在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”,其他方法不起作用。有任何想法吗?我确信这不是一个难题,只是我没有看到。有什么提示吗?在此先感谢智利的问候。

xbl_lkz 回答:如何解决:UnboundLocalError:赋值之前引用了局部变量“ t”?在python中?

这意味着您尝试在计算机以前从未见过t时从t进行读取。 假设您编写了类似的内容:

x = t*99 + 3

....但t从未在程序的早期出现过。除非知道t是什么,否则计算机无法将t乘以99。您曾尝试使用t做某事,然后再为其分配任何内容。

,

正如Samuel Muldoon在回答中说的那样,该错误表示您在设置t的值之前尝试使用它。您的代码中的挑战是很难看到这种情况如何发生。看来您总是在t的{​​{1}}循环中设置for,所以怎么设置呢?

事实证明,由于代码错误,您将一个空列表传递给了distancia_tour函数。空列表的长度为0,因此您的distancia_tour循环有效:

for

for t in range(-1): ... 返回一个空列表,因此在range(-1)循环中没有要迭代的值。 for永远不会得到值,并且在t循环后的下一行引用t时会出现错误。

它得到一个空列表的原因是,您将for初始化为一个空列表,然后由于tour_actual语句中的错误而没有更改它的值。您有while,由于while iterador>IT_max:小于iterador,因此它永远不会执行。您可能打算测试IT_max

本文链接:https://www.f2er.com/3140415.html

大家都在问