我想知道这个函数的作用:
def Recocido(tour1 = []):
# tour1 = tour1[:]
izquierda = random.randrange(len(tour1))
derecha = 0
while(True):
derecha = random.randrange(len(tour1))
if (derecha != izquierda):
#tour1[izquierda], tour1[derecha] = tour1[derecha], tour1[izquierda]
break
return tour1
我正在执行此功能以“退火”tour1,但我不确定我是否做得很好。我特别纠结于注释行(#),有人可以帮助我知道我在做什么!?或者更好,如果我做得很好?
编辑:
这是我的 SA 部分:
tamañoTour = len(matriz)
inicioTour = []
inicioTour = Tour(tamañoTour)
print(inicioTour)
costoTourInicio = PesoTour(inicioTour, matriz)
print(costoTourInicio)
nuevoTour = []
temp = 1000000000
#i = 0
while(temp > 0.000000001):
for j in range(40):
nuevoTour = Recocido(inicioTour)
#print(nuevoTour)
costoNuevoTour = PesoTour(nuevoTour, matriz)
#print(costoNuevoTour)
if (costoNuevoTour < costoTourInicio):
inicioTour = nuevoTour
#temp = temp*0.99
else:
numero = random.random()
deltaZ = costoNuevoTour - costoTourInicio
prob = math.exp(-(deltaZ/temp))
if (numero < prob):
inicioTour = nuevoTour
#temp = temp*0.99
#i += 1
temp = temp*0.99
#print(inicioTour)
print(nuevoTour)
#print(costoTourInicio)
print(costoNuevoTour)
#print(i)
matriz 是一个 52x52 数组,是 berlin52 http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95/tsp/各部分之间的距离
其他功能是:
def Tour(tamaño):
tour1 = []
for i in range(tamaño):
while(not False):
valor = random.randrange(tamaño)
if valor not in tour1:
tour1.append(valor)
break
return tour1
def PesoTour(tour1 = [], matriz = [[]]):
valor = 0
i = 0
while(i < len(tour1)):
if (i == len(tour1) - 1):
valor = valor + matriz[tour1[i]][tour1[0]]
else:
valor = valor + matriz[tour1[i]][tour1[i+1]]
i += 1
return valor
就是这样,感谢您的评论。