2013-08-26 110 views
0

我想知道這個功能是什麼:Python的TSP柏林52模擬退火

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 

多數民衆贊成它,感謝您的意見。

回答

2

就這樣,該函數會生成一些隨機數然後停止。如果取消對註釋行的註釋,它會創建一個包含交換兩個隨機元素的輸入副本(如果輸入只有一個元素,則永遠循環,如果輸入爲空,則會引發異常)。下面是一行一行地擊穿:

# The default argument here is useless. 
def Recocido(tour1 = []): 

    # Make a copy of the list. 
    tour1 = tour1[:] 

    # Pick a random index. 
    izquierda = random.randrange(len(tour1)) 

    # Unnecessary. 
    derecha = 0 

    while(True): 

     # # Pick another random index 
     derecha = random.randrange(len(tour1)) 

     # If it's not the same index you picked the first time, 
     if (derecha != izquierda): 

      # swap the elements of the copy at the two indices, 
      tour1[izquierda], tour1[derecha] = tour1[derecha], tour1[izquierda] 

      # and stop looping. 
      break 

    return tour1 

(我希望這是你的模擬退火程序的只是其中的一部分,因爲這不是模擬退火沒有的功能進行優化,沒有冷卻的時間表,也沒有。概率排斥的狀態變化)

如果你想編寫一個返回與兩個隨機元素的輸入列表交換的拷貝功能,可以按如下方式清理:

# No default argument - you'd never want to use the default. 
def with_random_swap(lst): 
    # Use random.sample to pick two distinct random indices. 
    index1, index2 = random.sample(xrange(len(lst)), 2) 
    copy = lst[:] 
    copy[index1], copy[index2] = copy[index2], copy[index1] 
    return copy 
+0

是,只是概率部分完成的功能,但我沒有結果我想,在真正的答案上太高了。看看編輯過的問題。 – Menticolcito

+0

@Menticolcito:我沒有看到任何相關的修改。 – user2357112

+0

我只是添加它們。 – Menticolcito