Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.90 KB | None | 0 0
  1. class Kratka():
  2.  
  3. def __init__(self, rodzic=None, pozycja=None):
  4. self.rodzic = rodzic
  5. self.pozycja = pozycja
  6.  
  7. self.g = 0
  8. self.h = 0
  9. self.f = 0
  10.  
  11. def __eq__(self, other):
  12. return self.pozycja == other.pozycja
  13.  
  14.  
  15. listaOtwarta = []
  16. listaZamknieta = []
  17. listaDzieci = []
  18. sasiedzi = [(0, 1), (-1, 0), (1, 0), (-1, 1), (1, 1), (0, -1), (-1, -1), (1, -1)];
  19.  
  20.  
  21. def wyznaczSciezke():
  22. print("Definiuje grida ... \nPostać grida:")
  23. grid = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  24. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  25. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  26. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 0, 0, 0],
  27. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  28. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0],
  29. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0],
  30. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0],
  31. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  32. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  33. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5],
  34. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0],
  35. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  36. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  37. [0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  38. [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  39. [0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  40. [0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  41. [0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
  42. [0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
  43. for g in grid:
  44. print(g)
  45. start = Kratka(None, (0, 0))
  46. koniec = Kratka(None, (19, 19))
  47. # start - dodanie na liste otwarta pierwszego elementu
  48. listaOtwarta.append(start)
  49.  
  50. # dopoki istenieje lista owarta
  51. while len(listaOtwarta) > 0:
  52.  
  53. # ustawienie elementu na ktorym operuje
  54. aktualnyWezel = listaOtwarta[0]
  55. aktualnyIndex = 0
  56. for index, wezel in enumerate(listaOtwarta):
  57. if wezel.f < aktualnyWezel.f:
  58. aktualnyWezel = wezel
  59. aktualnyIndex = index
  60.  
  61. # usuniecie z listy otwartej iterowanego wezla
  62. listaOtwarta.pop(aktualnyIndex)
  63. # wrzucenie go do listy zamknietej
  64. listaZamknieta.append(aktualnyWezel)
  65.  
  66. if aktualnyWezel == koniec:
  67. sciezka = []
  68. aktualny = aktualnyWezel
  69. while aktualny is not None:
  70. sciezka.append(aktualny.pozycja)
  71. aktualny = aktualny.rodzic
  72. return sciezka
  73. # iteracja po tablicy sasiadow wezla
  74. for sasiad in sasiedzi:
  75. pw = (aktualnyWezel.pozycja[0] + sasiad[0], aktualnyWezel.pozycja[1] + sasiad[1])
  76. if pw[0] > (len(grid) - 1) or pw[0] < 0 or pw[1] > (len(grid[len(grid) - 1]) - 1) or pw[1] < 0:
  77. continue
  78. if grid[pw[0]][pw[1]] != 0:
  79. continue
  80. nastepny = Kratka(aktualnyWezel, pw)
  81. listaDzieci.append(nastepny)
  82.  
  83. # iteracja po pomocniczej liscie wezlow
  84. for dziecko in listaDzieci:
  85. for z in listaZamknieta:
  86. # sprawdzenie czy iterowany element nalezy do listy zamknietej
  87. if czyWZamknietej(dziecko, z):
  88. continue
  89. # wyliczenie kosztu, drogi i heurestykil;
  90. wyliczWartosci(dziecko, aktualnyWezel, koniec)
  91.  
  92. # sprawdzenie czy iterowany element nalezy do listy owartej
  93. for o in listaOtwarta:
  94. if czyWOtwartej(o, dziecko):
  95. continue
  96. listaOtwarta.append(dziecko)
  97.  
  98.  
  99. def wyliczWartosci(dziecko, aktualnyWezel, koniec):
  100. dziecko.g = dajG(aktualnyWezel)
  101. dziecko.h = dajH(dziecko, koniec)
  102. dziecko.f = dajF(dziecko)
  103.  
  104.  
  105. def czyWZamknietej(d, z):
  106. if d == z:
  107. return True
  108. else:
  109. return False
  110.  
  111.  
  112. def czyWOtwartej(o, d):
  113. if d == o and d.g > o.g:
  114. return True
  115. else:
  116. return False
  117.  
  118.  
  119. def dajG(wezel):
  120. return wezel.g + 1;
  121.  
  122.  
  123. def dajH(dziecko, koncowyWezel):
  124. return ((dziecko.pozycja[0] - koncowyWezel.pozycja[0]) ** 2) + (
  125. (dziecko.pozycja[1] - koncowyWezel.pozycja[1]) ** 2)
  126.  
  127.  
  128. def dajF(dziecko):
  129. return dziecko.g + dziecko.h;
  130.  
  131.  
  132. def main():
  133. sciezka = wyznaczSciezke()
  134. print('------------------------------------------------------------')
  135. print('Wyznaczona sciezka:')
  136. print(*sciezka[::-1], sep="\n")
  137.  
  138.  
  139. if __name__ == '__main__':
  140. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement