Inteligentny_Wozek/wyszukiwanie.py

88 lines
2.9 KiB
Python
Raw Normal View History

2023-04-20 23:16:34 +02:00
class SearchSpace:
def __init__(self):
2023-04-26 18:59:38 +02:00
self.grid = [['1'] * 10 for _ in range(10)] # create a 10x10 grid of cells
for r, c in [(2, 2), (2, 3), (3, 2), (3, 3), (8, 2), (8, 3), (9, 2), (9, 3),
(2, 8), (2, 9), (3, 8), (3, 9), (8, 8), (8, 9), (9, 8), (9, 9)]:
2023-04-20 23:16:34 +02:00
self.grid[r][c] = 'X' # set the cells with a shelf to not passable
def is_passable(self, x, y):
return 0 <= x < 10 and 0 <= y < 10 and self.grid[y][x] != 'X'
2023-04-26 18:59:38 +02:00
2023-04-20 20:54:58 +02:00
class Stan:
def __init__(self, x, y, kierunek):
self.x = x
self.y = y
self.kierunek = kierunek
2023-04-26 18:59:38 +02:00
2023-04-20 20:54:58 +02:00
class Wezel:
2023-05-06 13:53:01 +02:00
def __init__(self, stan, rodzic):
2023-04-20 20:54:58 +02:00
self.stan = stan
2023-05-06 13:53:01 +02:00
self.rodzic = rodzic
2023-04-20 20:54:58 +02:00
2023-05-06 13:53:01 +02:00
def nastepnik(wezel, licznik):
2023-04-26 18:59:38 +02:00
# gora -> prawo -> dol -> lewo | obrot w prawo
2023-04-20 20:54:58 +02:00
# gora -> lewo -> dol -> prawo | obrot w lewo
# 0 gora 1 prawo 2 dol 3 lewo
2023-05-06 13:53:01 +02:00
x = wezel.stan.x
y = wezel.stan.y
obrot_w_prawo = Wezel(Stan(x, y, (wezel.stan.kierunek + 1) % 4), licznik)
obrot_w_lewo = Wezel(Stan(x, y, 3 if wezel.stan.kierunek == 0 else wezel.stan.kierunek - 1), licznik)
2023-04-20 20:54:58 +02:00
if wezel.stan.kierunek == 0:
2023-05-06 13:53:01 +02:00
y -= 70
2023-04-20 20:54:58 +02:00
elif wezel.stan.kierunek == 1:
2023-05-06 13:53:01 +02:00
x += 70
2023-04-20 20:54:58 +02:00
elif wezel.stan.kierunek == 2:
2023-05-06 13:53:01 +02:00
y += 70
2023-04-20 20:54:58 +02:00
elif wezel.stan.kierunek == 3:
2023-05-06 13:53:01 +02:00
x -= 70
2023-04-20 20:54:58 +02:00
wezly = [obrot_w_prawo, obrot_w_lewo]
2023-05-06 13:53:01 +02:00
ruch_w_przod = Wezel(Stan(x, y, wezel.stan.kierunek), licznik)
2023-04-20 20:54:58 +02:00
# sprawdzenie czy nie wyjdzie poza plansze
2023-05-06 13:53:01 +02:00
if 0 <= x <= 910 and 0 <= y <= 910:
2023-04-20 20:54:58 +02:00
wezly.append(ruch_w_przod)
return wezly
2023-05-06 13:53:01 +02:00
def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy):
pierwszy_wezel = Wezel(stan_poczatkowy, 0)
2023-04-20 20:54:58 +02:00
fringe = [pierwszy_wezel]
2023-05-06 13:53:01 +02:00
odwiedzone = [pierwszy_wezel]
licznik = 0
global mapa
mapa = dict()
2023-04-20 20:54:58 +02:00
while fringe:
wezel = fringe.pop(0)
2023-05-06 13:53:01 +02:00
licznik = licznik + 1
mapa[licznik] = wezel
2023-04-20 20:54:58 +02:00
if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y:
2023-05-06 13:53:01 +02:00
return wezel
lista1 = nastepnik(wezel, licznik)
for obecny_wezel in lista1:
flag_juz_odwiedzony = 0
for odwiedzony_wezel in odwiedzone:
# sprawdzenie czy odwiedzilismy juz ten stan
if odwiedzony_wezel.stan.x == obecny_wezel.stan.x and odwiedzony_wezel.stan.y == obecny_wezel.stan.y\
and odwiedzony_wezel.stan.kierunek == obecny_wezel.stan.kierunek:
flag_juz_odwiedzony = 1
2023-04-26 18:59:38 +02:00
break
2023-05-06 13:53:01 +02:00
if flag_juz_odwiedzony == 1:
2023-04-26 18:59:38 +02:00
continue
else:
2023-05-06 13:53:01 +02:00
fringe.append(obecny_wezel)
odwiedzone.append(obecny_wezel)
return pierwszy_wezel
def znajdz_sciezke(wezel):
sciezka = [wezel]
index = wezel.rodzic
while index != 0:
wezel = mapa[index]
sciezka.append(wezel)
index = wezel.rodzic
sc = list(reversed(sciezka))
return sc