WaterlessStraw

Traveling Salesman Version 2

Jan 29th, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. import random
  2. import math
  3. import pprint
  4. from matplotlib import pyplot as plt
  5.  
  6. def create_nodes(num_nodes, num_rows):
  7. elements = range(1, num_nodes + 1)
  8. return [random.sample(elements, num_nodes) for _ in range(num_rows)]
  9.  
  10. def mutate(table, node_table, mutate_probability, cross_probability):
  11. for next_id, row in enumerate(table, 1):
  12. nodes = len(row)
  13. # print
  14. # print "Original: ", row
  15. #mutation
  16. if random.random() > mutate_probability:
  17. mini, maxi = sorted(random.sample(range(nodes),2))
  18. row[mini:maxi+1] = row[mini:maxi+1][::-1]
  19. # print "After mutation: ", row
  20. # print "Between: ", mini, maxi
  21.  
  22. #crossover
  23. if random.random() > cross_probability:
  24. try:
  25. next_row = table[next_id]
  26. # print "Parent: ", next_row
  27. except IndexError:
  28. pass
  29. else:
  30. half_length = nodes//2
  31. mini = random.randint(0, half_length)
  32. maxi = mini + half_length - 1 + (nodes % 2)
  33.  
  34. crossed = [None] * nodes
  35. # print "Before crossed: ", row
  36. crossed[mini:maxi+1] = next_row[mini:maxi+1]
  37. # print "Cross with: ", crossed
  38. iterator = 0
  39. for element in row:
  40. if element in crossed:
  41. continue
  42. while mini <= iterator <= maxi:
  43. iterator += 1
  44. crossed[iterator] = element
  45. iterator += 1
  46. row[:] = crossed
  47. # print "After crossed: ", row
  48. # print "Between: ", mini, maxi
  49. def sample_best(table, node_table):
  50. t1, t2 = random.sample(table[1:], 2)
  51. return distance(t1, t2, node_table)
  52.  
  53. def distance(s1, s2, node_table):
  54. distance1 = sum_distances(s1, node_table)
  55. distance2 = sum_distances(s2, node_table)
  56.  
  57. if distance1 < distance2:
  58. return s1, distance1
  59. else:
  60. return s2, distance2
  61.  
  62. def sum_distances(strategy, node_table):
  63. dist = 0
  64. first_row, second_row = node_table
  65.  
  66. for idx_next_node, node1 in enumerate(strategy, 1):
  67. try:
  68. node2 = strategy[idx_next_node]
  69. except IndexError:
  70. node2 = strategy[0]
  71. dist += math.hypot(
  72. first_row[node2-1] - first_row[node1-1],
  73. second_row[node2-1] - second_row[node1-1])
  74.  
  75. return dist
  76.  
  77. def draw_graph(node_table, strategy):
  78. graphX = [node_table[0][index - 1] for index in strategy]
  79. graphY = [node_table[1][index - 1] for index in strategy]
  80.  
  81. plt.scatter(graphX, graphY)
  82. plt.plot(graphX, graphY)
  83. plt.show()
  84.  
  85.  
  86. def main(nodes=8, strategies=100, generations=10000, mutateP=.7, crossP=.7):
  87. #create node locations
  88. node_table = create_nodes(nodes, 2)
  89. # for i in range(2):
  90. # print node_table[i]
  91.  
  92. #create first generation
  93. table = create_nodes(nodes, strategies)
  94. # for i in range(strategies):
  95. # print i
  96. # print table[i]
  97.  
  98. print "TOP MEN are looking through:"
  99. print strategies, "strategies in", generations, "generations with",
  100. print nodes, "nodes in each strategy..."
  101.  
  102. best_score = None
  103. for count in range(generations):
  104. mutate(table, node_table, mutateP, crossP)
  105. # crossover(table, node_table, crossP)
  106. strategy, score = sample_best(table, node_table)
  107.  
  108. if best_score is None or score < best_score:
  109. best_strategy = strategy
  110. best_score = score
  111.  
  112. if count % 100 == 0:
  113. print "Foraged", count, "berries"
  114. print "Best we got so far:", best_score, "with: ", best_strategy
  115.  
  116. # if count % 2 == 0:
  117. # print count
  118. # for i in range(strategies):
  119. # print table[i]
  120.  
  121.  
  122.  
  123. print "=========================================================================="
  124. print "Best we could find: ", best_score, "for strategy", best_strategy
  125.  
  126. draw_graph(node_table, best_strategy)
  127.  
  128. main()
Advertisement
Add Comment
Please, Sign In to add comment