Advertisement
Guest User

Untitled

a guest
Apr 28th, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.92 KB | None | 0 0
  1. import random
  2. import math
  3. import numpy
  4.  
  5.  
  6. class nearest_neighbourhood:
  7.  
  8.     def odczytZPliku(sciezka):
  9.         u"""Otwiera plik zawierający współrzędne miast, które zostaną użyte do wyznaczenia trasy.
  10.        Odczytuje z pliku dane i przekształca je w tablicę.
  11.        Zwraca tablicę ze współrzędnymi miast.
  12.        """
  13.         plik = open(sciezka, "r")
  14.         try:
  15.             wspolrzedne_miast = numpy.loadtxt(plik)
  16.         finally:
  17.             plik.close()
  18.         return wspolrzedne_miast
  19.  
  20.     def numerowanieMiast(wspolrzedne_miast, N):
  21.         u"""Tworzy tablicę oraz wypełnia ją liczbami od 1 do N, gdzie N oznacza liczbę miast używanych do wyznaczenia trasy.
  22.        Wstawia utworzoną tablicę jako trzecią kolumnę do tablicy ze współrzędnymi miast.
  23.        Zwraca rozbudowaną tablicę ze współrzędnymi miast."""
  24.         numery_miast = []
  25.         for i in range(N):
  26.             numery_miast.append(i + 1)
  27.  
  28.         wspolrzedne_miast = numpy.insert(wspolrzedne_miast, 2, numery_miast, axis=1)
  29.         return wspolrzedne_miast
  30.  
  31.     def losowaniePunktuStartowego(N):
  32.         u"""Losuje punkt z zakresu od 0 do N-1, gdzie N oznacza liczbę miast używanych do wyznaczenia trasy.
  33.        Zwraca wylosowaną wartość."""
  34.         punkt_startowy = random.randint(0, (N - 1))
  35.         return punkt_startowy
  36.  
  37.     def obliczanieOdleglosci(a, b, wspolrzedne_miast):
  38.         u"""Oblicza odległość dwóch miast, miasta a, którego współrzędne zostają przekazane do funkcji, oraz miasta b, którego indeks zostaje przekazany do funkcji, względem siebie.
  39.        Zwraca obliczoną odległość."""
  40.         odleglosc = math.sqrt(
  41.             (wspolrzedne_miast[b][0] - a[0]) * (wspolrzedne_miast[b][0] - a[0]) + (wspolrzedne_miast[b][1] - a[1]) * (
  42.             wspolrzedne_miast[b][1] - a[1]))
  43.         return odleglosc
  44.  
  45.     def zapisDoPliku(wynik):
  46.         u"""Otwiera lub tworzy, jeżeli nie istnieje, plik oraz zapisuje do niego wynik działania algorytmu."""
  47.         cel = open("plik_z_wynikami.txt", "w")
  48.         try:
  49.             wynik.tofile(cel, sep="\n", format="%i")
  50.         finally:
  51.             cel.close()
  52.  
  53.     def algorytmNN(sciezka):
  54.         u"""Przy pomocy funcji odczytZPliku pobiera dane startowe.
  55.        Mierzy długość tablicy wejściowej, oznacza ją jako N, gdzie N to ilość miast używanych do wyznaczenia trasy.
  56.        Przy pomocy funkcji numerowanieMiast modyfikuje tablicę z danymi wejściowymi.
  57.        Przy pomocy funkcji losowaniePunktuStartowego wyznacza indeks punktu startowego trasy.
  58.        Tworzy pustą tablicę, do której zapisywany będzie wynik końcowy.
  59.        Do tablicy z wynikiem końcowym zapisuje punkt startowy trasy.
  60.        Z tablicy ze współrzędnymi miast dostępnymi do odwiedzenia usuwa punkt startowy.
  61.        Inicjalizuje zmienną oznaczającą długość trasy i przypisuje jej wartość początkową 0.
  62.        W pętli składającej się z N kroków, wyznacza kolejność odwiedzanych miast.
  63.        Dla każdego wybranego miasta, zaczynając od wylsowanego punktu startowego, oblicza odległości do miast, wzciąż pozostałych do odwiedzenia i wybiera najbliższe z nich.
  64.        Najbliższe miasto staje się nowym wybranym miastem, a odległość do niego zostaje dodana do długości trasy.
  65.        Wybrane miasto zostaje dodane do tablicy z wynikiem końcowym oraz usunięte z tablicy miast dostępnych do odwiedzenia.
  66.        Po ustaleniu kolejności wszystkich N miast tablica z wynikiem zostaje zapisana do pliku przy pomocy funkcji zapisDoPliku.
  67.        Zwraca tablicę z ustaloną kolejnością odwiedzania miast."""
  68.         dane_startowe = nearest_neighbourhood.odczytZPliku(sciezka)
  69.         N = len(dane_startowe)
  70.         wspolrzedne_miast = nearest_neighbourhood.numerowanieMiast(dane_startowe, N)
  71.         punkt_startowy = nearest_neighbourhood.losowaniePunktuStartowego(N)
  72.         a = wspolrzedne_miast[punkt_startowy,]
  73.         wynik = []
  74.         wynik = numpy.append(wynik, wspolrzedne_miast[punkt_startowy, 2])
  75.         wspolrzedne_miast = numpy.delete(wspolrzedne_miast, punkt_startowy, axis=0)
  76.         dlugosc_trasy = 0
  77.  
  78.         for i in range(0, (N - 1)):
  79.             najmniejsza_odleglosc = 100 * math.sqrt(2)
  80.             for b in range(0, len(wspolrzedne_miast)):
  81.                 odleglosc = nearest_neighbourhood.obliczanieOdleglosci(a, b, wspolrzedne_miast)
  82.  
  83.                 if odleglosc <= najmniejsza_odleglosc:
  84.                     najmniejsza_odleglosc = odleglosc
  85.                     najblizsze_miasto = b
  86.  
  87.             a = wspolrzedne_miast[najblizsze_miasto,]
  88.             dlugosc_trasy = dlugosc_trasy + najmniejsza_odleglosc
  89.  
  90.             wynik = numpy.append(wynik, wspolrzedne_miast[najblizsze_miasto, 2])
  91.             wspolrzedne_miast = numpy.delete(wspolrzedne_miast, najblizsze_miasto, axis=0)
  92.  
  93.         nearest_neighbourhood.zapisDoPliku(wynik)
  94.  
  95.         return wynik
  96.  
  97.  
  98. nearest_neighbourhood.algorytmNN("TSP30.txt")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement