68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
class SearchSpace:
|
|
def __init__(self):
|
|
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)]:
|
|
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'
|
|
|
|
class Stan:
|
|
def __init__(self, x, y, kierunek):
|
|
self.x = x
|
|
self.y = y
|
|
self.kierunek = kierunek
|
|
|
|
class Wezel:
|
|
def __init__(self, stan):
|
|
self.stan = stan
|
|
|
|
def poprzednik(wezel, search_space):
|
|
# gora -> prawo -> dol -> lewo | obrot w prawo
|
|
# gora -> lewo -> dol -> prawo | obrot w lewo
|
|
# 0 gora 1 prawo 2 dol 3 lewo
|
|
y = wezel.stan.x
|
|
x = wezel.stan.y
|
|
obrot_w_prawo = Stan(x, y, (wezel.stan.kierunek + 1) % 4)
|
|
obrot_w_lewo = Stan(x, y, (wezel.stan.kierunek - 1) % 4)
|
|
|
|
if wezel.stan.kierunek == 0:
|
|
y -= 1
|
|
elif wezel.stan.kierunek == 1:
|
|
x += 1
|
|
elif wezel.stan.kierunek == 2:
|
|
y += 1
|
|
elif wezel.stan.kierunek == 3:
|
|
x -= 1
|
|
|
|
wezly = [obrot_w_prawo, obrot_w_lewo]
|
|
ruch_w_przod = Stan(x, y, wezel.stan.kierunek)
|
|
|
|
# sprawdzenie czy nie wyjdzie poza plansze
|
|
if 0 <= x <= 916 and 0 <= y <= 916:
|
|
wezly.append(ruch_w_przod)
|
|
|
|
return wezly
|
|
|
|
def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy, search_space):
|
|
pierwszy_wezel = Wezel(stan_poczatkowy)
|
|
fringe = [pierwszy_wezel]
|
|
|
|
odwiedzone = set()
|
|
|
|
while fringe:
|
|
wezel = fringe.pop(0)
|
|
|
|
if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y:
|
|
return odwiedzone
|
|
|
|
odwiedzone.add(wezel.stan)
|
|
|
|
for stan in poprzednik(wezel, search_space):
|
|
if stan not in odwiedzone:
|
|
nowy_wezel = Wezel(stan)
|
|
fringe.append(nowy_wezel)
|
|
odwiedzone.add(stan)
|
|
return odwiedzone
|