Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. def simulated_annealing(coordinates, route=None, epochs=1, T=20.0, eta=0.995):
  2. """Simulated Annealing for TSP
  3.  
  4. T(n) = T * eta**n
  5.  
  6. Args:
  7. coordinates (np.ndarray): initial route consisting of coordinates
  8. route (array): inital route
  9. epochs (int): number of loops through all cities.
  10. T (float): Initial temperature
  11. eta (float): Exponential cooling rate
  12.  
  13. Returns:
  14. route (np.ndarray): optimized route
  15. distances (np.ndarray): travel distance after each epoch
  16. """
  17. np.random.seed(7)
  18.  
  19. N = coordinates.shape[0]
  20.  
  21. if route is None:
  22. route = np.random.permutation(N)
  23.  
  24. distances = []
  25. distances.append(distance(coordinates, route))
  26.  
  27. T_n = [T * eta**i for i in range(epochs)]
  28.  
  29. for e in range(epochs):
  30. if e==0:
  31. prev_distance = distance(coordinates, route)
  32.  
  33. for i, idx in enumerate(np.random.permutation(N)):
  34. route[idx], route[(idx+1) % N] = route[(idx+1) % N], route[idx]
  35. curr_distance = distance(coordinates, route)
  36.  
  37. dE = curr_distance - prev_distance
  38. if dE > 0:
  39. p = np.exp(-dE/T_n[e])
  40.  
  41. if np.random.binomial(1,p,1) == 0: # undo changes
  42. route[idx], route[(idx+1) % N] = route[(idx+1) % N], route[idx]
  43. # prev_distance remains unchaged
  44. else: # accept
  45. prev_distance = curr_distance
  46. else: # accept
  47. prev_distance = curr_distance
  48.  
  49.  
  50. distances.append(distance(coordinates, route))
  51.  
  52. print(distance)
  53. return np.asarray(route), np.asarray(distances)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement