WaterlessStraw

Traveling Salesman Version 1

Jan 29th, 2016
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.87 KB | None | 0 0
  1. import random
  2. import math
  3. import copy
  4. from matplotlib import pyplot as plt
  5.  
  6. #number of nodes
  7. nodes = 60
  8. strategies = 100
  9. generations = 400
  10. mutateP = .70
  11. crossP = 1.0
  12. count = 0
  13. bestStrat = [[0 for i in range(nodes)], 0]
  14. temp = [[0 for i in range(nodes)], 0]
  15. graphX = [0 for i in range(nodes)]
  16. graphY = [0 for i in range(nodes)]
  17. tempTable = [0 for i in range(nodes)]
  18. parent1 = [0 for i in range(nodes)]
  19. parent2 = [0 for i in range(nodes)]
  20.  
  21.  
  22. #create first generation
  23. table = [ [ 0 for i in range(6) ] for j in range(strategies) ]
  24. for d1 in range(strategies):
  25. table[d1] = random.sample(range(1, nodes+1), nodes)
  26. for i in range(strategies):
  27. print table[i]
  28.  
  29.  
  30. print "TOP MEN are looking through:"
  31. print strategies, "strategies in", generations, "generations with", nodes, "nodes in each strategy..."
  32.  
  33. #create locations for nodes
  34. def createNodeLocations():
  35. print "Creating locations for nodes"
  36. nodeTable = [ [ 0 for i in range(nodes) ] for j in range(2) ]
  37. for i in range(2):
  38. nodeTable[i] = random.sample(range(1, nodes+1), nodes)
  39. print nodeTable[i]
  40. return nodeTable
  41.  
  42. def generateIteration():
  43.  
  44. for i in range(strategies):
  45. p = random.random()
  46. p2 = random.random()
  47. mini = 0
  48. maxi = 0
  49.  
  50. # mutation!
  51. if p > mutateP:
  52. indices = random.sample(range(0,nodes), 2)
  53. mini = min(indices)
  54. maxi = max(indices)
  55. iterator = 0
  56. for j in range(maxi,mini-1,-1):
  57. tempTable[iterator] = table[i][j]
  58. iterator += 1
  59. iterator = 0
  60. for j in range(mini, maxi+1):
  61. table[i][j] = tempTable[iterator]
  62. iterator += 1
  63. # ordered crossover!
  64. if p2 > crossP:
  65. if i < strategies-1:
  66. iterator = 0
  67. if (nodes % 2) == 0:
  68. mini = random.randint(0, nodes/2)
  69. maxi = mini + nodes/2 -1
  70. else:
  71. mini = random.randint(0, (nodes-1)/2)
  72. maxi = mini + (nodes-1)/(2)
  73. parent1 = copy.deepcopy(table[i])
  74. parent2 = copy.deepcopy(table[i+1])
  75.  
  76. tempTable2 = [0 for i in range(nodes)]
  77. for j in range(mini, maxi+1):
  78. tempTable2[j] = copy.deepcopy(parent1[j])
  79. else:
  80. mini = random.randint(0, (nodes-1)/2)
  81. maxi = mini + (nodes-1)/(2)
  82. parent1 = copy.deepcopy(table[i])
  83. parent2 = copy.deepcopy(table[i+1])
  84.  
  85. tempTable2 = [0 for i in range(nodes)]
  86. for j in range(mini, maxi+1):
  87. tempTable2[j] = copy.deepcopy(parent1[j])
  88. for j in range(0, nodes):
  89. if tempTable2[j] == 0:
  90. for k in range(len(parent2)):
  91. if parent2[k] not in tempTable2:
  92. tempTable2[j] = copy.deepcopy(parent2[k])
  93. break
  94. table[i] = copy.deepcopy(tempTable2)
  95.  
  96. if (count == generations - 1):
  97. print table[i]
  98.  
  99. #Begin the tournament
  100. for i in range(strategies):
  101. indices = random.sample(range(0,strategies), 2)
  102. mini = min(indices)
  103. maxi = max(indices)
  104. distance1 = sumDistance(table[mini])
  105. distance2 = sumDistance(table[maxi])
  106. winner = min(distance1, distance2)
  107. if(winner == distance1):
  108. table[i] = copy.deepcopy(table[mini])
  109. else:
  110. table[i] = copy.deepcopy(table[maxi])
  111. return table
  112.  
  113. def tournament(mini, maxi):
  114. selections = random.sample(range(1,strategies), 2)
  115. return findDistance(table[selections[0]], table[selections[1]])
  116.  
  117.  
  118. def chooseTwo():
  119. selections = random.sample(range(1,strategies), 2)
  120.  
  121. selections = random.sample(range(1,strategies), 2)
  122. return findDistance(table[selections[0]], table[selections[1]])
  123.  
  124.  
  125. def sumDistance(s1):
  126.  
  127. distSum = 0
  128. for i in range(nodes):
  129. if (i < nodes-1):
  130. node1 = s1[i]
  131. node2 = s1[i+1]
  132. distSum += math.hypot(nodeTable[0][node2-1] - nodeTable[0][node1-1], nodeTable[1][node2-1] - nodeTable[1][node1-1])
  133. else:
  134. node1 = s1[i]
  135. node2 = s1[0]
  136. distSum += math.hypot(nodeTable[0][node2-1] - nodeTable[0][node1-1], nodeTable[1][node2-1] - nodeTable[1][node1-1])
  137. return distSum
  138.  
  139. def findDistance(s1, s2):
  140.  
  141. distance1 = sumDistance(s1)
  142. distance2 = sumDistance(s2)
  143. winner = min(distance1, distance2)
  144. if(winner == distance1):
  145. stratWinner = s1
  146. temp[1] = distance1
  147. else:
  148. stratWinner = s2
  149. temp[1] = distance2
  150.  
  151. temp[0] = stratWinner
  152.  
  153. return temp
  154.  
  155. def drawGraph():
  156.  
  157. for i in range(0,nodes):
  158. graphX[i] = nodeTable[0][bestStrat[0][i]-1]
  159. graphY[i] = nodeTable[1][bestStrat[0][i]-1]
  160.  
  161. for i in range(0,nodes):
  162. graphX[i] = nodeTable[0][bestStrat[0][i]-1]
  163. graphY[i] = nodeTable[1][bestStrat[0][i]-1]
  164.  
  165.  
  166. plt.scatter(graphX, graphY)
  167. plt.plot(graphX, graphY)
  168. plt.show()
  169.  
  170. nodeTable = createNodeLocations()
  171.  
  172. while (count < generations):
  173. table = generateIteration()
  174. temp = chooseTwo()
  175.  
  176. if(temp[1] < bestStrat[1] or bestStrat[1] == 0):
  177. bestStrat = copy.deepcopy(temp)
  178.  
  179. if (count == generations - 1):
  180. print "========================================================="
  181. print "Best we could find: ", bestStrat
  182.  
  183.  
  184. if(count % 10 == 0):
  185. print "Foraged", count, "berries"
  186. print "Best we got so far:", bestStrat
  187. count+=1
  188.  
  189. drawGraph()
Advertisement
Add Comment
Please, Sign In to add comment