Handlungsreisender-in-Deutschland-Nearest-Insertion.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. from copy import deepcopy
  4. def compute_length(Entfernungen, route):
  5. """ Berechnet die Länge der Route und gibt diesen Integer zurück. """
  6. entfernung = 0
  7. for i in xrange(0, len(route)-1):
  8. entfernung += Entfernungen[route[i]][route[i+1]]
  9. return entfernung
  10. def nearest_insertion(Entfernungen):
  11. """ Entfernungen: Entfernungen[x][y] gibt die Länge der Strecke von x nach
  12. y als integer an.
  13. return: route als Liste, z.B. [0,3,4,1,2]
  14. Es wird immer mit der Stadt 0 begonnen. """
  15. route = [0]
  16. cities = len(Entfernungen)
  17. maxEntfernung = max([item for sublist in Entfernungen for item in sublist])
  18. aktuelleCity = 0
  19. Entfernungen_read = deepcopy(Entfernungen)
  20. for i in xrange(0, cities):
  21. for sublist in Entfernungen:
  22. sublist[aktuelleCity] = maxEntfernung + 1
  23. aktuelleCity = Entfernungen[aktuelleCity].index( min(Entfernungen[aktuelleCity]) )
  24. minInsert = None
  25. routenLaenge = len(route)*(maxEntfernung+1)
  26. for insertIndex in xrange(0, len(route) ):
  27. route_tmp = deepcopy(route)
  28. route_tmp.insert(insertIndex, aktuelleCity)
  29. if compute_length(Entfernungen_read, route_tmp) < routenLaenge:
  30. routenLaenge = compute_length(Entfernungen_read, route_tmp)
  31. minInsert = insertIndex
  32. route.insert(minInsert, aktuelleCity)
  33. routenLaenge+= Entfernungen[route[-1]][aktuelleCity]
  34. #Drehen der Route, sodass Berlin am Anfang und am Ende steht
  35. route = route[route.index(0)+1:] + route[0:route.index(0)+1]
  36. print("Routenlänge: %i" % compute_length(Entfernungen_read, route))
  37. return route
  38. Entfernungen = []
  39. Entfernungen.append([ 0, 288, 585, 575, 547, 633, 559, 494, 531, 392])
  40. Entfernungen.append([289, 0, 775, 426, 493, 655, 400, 344, 365, 122])
  41. Entfernungen.append([589, 775, 0, 577, 398, 220, 612, 604, 634, 748])
  42. Entfernungen.append([579, 426, 576, 0, 193, 369, 42, 95, 73, 320])
  43. Entfernungen.append([552, 492, 393, 193, 0, 210, 229, 219, 251, 445])
  44. Entfernungen.append([637, 667, 231, 369, 203, 0, 404, 417, 426, 642])
  45. Entfernungen.append([563, 408, 611, 38, 228, 404, 0, 71, 37, 302])
  46. Entfernungen.append([498, 346, 605, 95, 221, 418, 69, 0, 36, 240])
  47. Entfernungen.append([536, 374, 634, 74, 252, 427, 35, 37, 0, 267])
  48. Entfernungen.append([397, 123, 748, 315, 441, 638, 289, 233, 254, 0])
  49. Stadtliste = ['Berlin', 'Hamburg', 'München', 'Köln', 'Frankfurt a. M.',
  50. 'Stuttgart', 'Düsseldorf', 'Dortmund', 'Essen', 'Bremen']
  51. for city in nearest_insertion(Entfernungen):
  52. print("%s" % Stadtliste[city])