Handlungsreisender-in-Deutschland-Alle-Routen.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """ Dieses Script berechnet die Länge aller möglichen Routen und speichert sie
  4. in "Entfernungen.txt".
  5. Am Ende wird noch die optimale Route ausgegeben.
  6. Benötigte Rechenzeit: ca. 50s """
  7. from copy import deepcopy
  8. # http://blog.bjrn.se/2008/04/lexicographic-permutations-using.html
  9. def next_permutation(seq, pred=cmp):
  10. """Like C++ std::next_permutation() but implemented as
  11. generator. Yields copies of seq."""
  12. def reverse(seq, start, end):
  13. # seq = seq[:start] + reversed(seq[start:end]) + \
  14. # seq[end:]
  15. end -= 1
  16. if end <= start:
  17. return
  18. while True:
  19. seq[start], seq[end] = seq[end], seq[start]
  20. if start == end or start+1 == end:
  21. return
  22. start += 1
  23. end -= 1
  24. if not seq:
  25. raise StopIteration
  26. try:
  27. seq[0]
  28. except TypeError:
  29. raise TypeError("seq must allow random access.")
  30. first = 0
  31. last = len(seq)
  32. seq = seq[:]
  33. # Yield input sequence as the STL version is often
  34. # used inside do {} while.
  35. yield seq
  36. if last == 1:
  37. raise StopIteration
  38. while True:
  39. next = last - 1
  40. while True:
  41. # Step 1.
  42. next1 = next
  43. next -= 1
  44. if pred(seq[next], seq[next1]) < 0:
  45. # Step 2.
  46. mid = last - 1
  47. while not (pred(seq[next], seq[mid]) < 0):
  48. mid -= 1
  49. seq[next], seq[mid] = seq[mid], seq[next]
  50. # Step 3.
  51. reverse(seq, next1, last)
  52. # Change to yield references to get rid of
  53. # (at worst) |seq|! copy operations.
  54. yield seq[:]
  55. break
  56. if next == first:
  57. raise StopIteration
  58. raise StopIteration
  59. def Strecke_der_Route(Entfernungen, route):
  60. """ Bestimmt die länge der Route und gibt diese als int zurück """
  61. Entfernung = 0
  62. for step, index in enumerate(route):
  63. index2 = route[(step+1)%len(Entfernungen)]
  64. Entfernung += Entfernungen[index][index2] # von index nach index2
  65. return Entfernung
  66. def optimal_solution_with_brute_force(Entfernungen):
  67. """ Findet die optimale Lösung, indem alle Routen durchgegangen werden.
  68. Zurückgegeben wird eine Liste mit den Indizes """
  69. liste = [i for i in xrange(0, len(Entfernungen))]
  70. min_Entfernung_Route = [i for i in xrange(0, len(Entfernungen))]
  71. min_Entfernung = Strecke_der_Route(Entfernungen, min_Entfernung_Route)
  72. f = open('/home/moose/Entfernungen.txt', 'w')
  73. for route in next_permutation(liste):
  74. entfernung_tmp = Strecke_der_Route(Entfernungen, route)
  75. f.write(str(entfernung_tmp) + "\n")
  76. if entfernung_tmp < min_Entfernung:
  77. min_Entfernung = entfernung_tmp
  78. min_Entfernung_Route = deepcopy(route)
  79. f.close()
  80. return min_Entfernung_Route
  81. Stadtliste = ['Berlin', 'Hamburg', 'München', 'Köln', 'Frankfurt a. M.',
  82. 'Stuttgart', 'Düsseldorf', 'Dortmund', 'Essen', 'Bremen']
  83. Entfernungen = []
  84. Entfernungen.append([ 0, 288, 585, 575, 547, 633, 559, 494, 531, 392])
  85. Entfernungen.append([289, 0, 775, 426, 493, 655, 400, 344, 365, 122])
  86. Entfernungen.append([589, 775, 0, 577, 398, 220, 612, 604, 634, 748])
  87. Entfernungen.append([579, 426, 576, 0, 193, 369, 42, 95, 73, 320])
  88. Entfernungen.append([552, 492, 393, 193, 0, 210, 229, 219, 251, 445])
  89. Entfernungen.append([637, 667, 231, 369, 203, 0, 404, 417, 426, 642])
  90. Entfernungen.append([563, 408, 611, 38, 228, 404, 0, 71, 37, 302])
  91. Entfernungen.append([498, 346, 605, 95, 221, 418, 69, 0, 36, 240])
  92. Entfernungen.append([536, 374, 634, 74, 252, 427, 35, 37, 0, 267])
  93. Entfernungen.append([397, 123, 748, 315, 441, 638, 289, 233, 254, 0])
  94. print("Berechnung aller Routen wurde begonnen.")
  95. route = optimal_solution_with_brute_force(Entfernungen)
  96. print("Berechnung aller Routen wurde abgeschlossen.")
  97. print("Länge der optimalen Route: ", Strecke_der_Route(Entfernungen, route))
  98. for index in route:
  99. print(Stadtliste[index])