for merge

This commit is contained in:
Mateusz Kantorski 2023-04-26 18:59:38 +02:00
parent 2a3e6b006a
commit 8dae8a4b20
2 changed files with 60 additions and 15 deletions

View File

@ -26,8 +26,8 @@ def main():
grid = SearchSpace() grid = SearchSpace()
# create start and goal states # create start and goal states
start_state = Stan(x=0, y=0, kierunek=0) # for example start_state = Stan(x=1, y=0, kierunek=0) # for example
goal_state = Stan(x=0, y=1, kierunek=0) # for example goal_state = Stan(x=12, y=0, kierunek=0) # for example
# perform BFS search # perform BFS search
path = wyszukiwanie_bfs(start_state, goal_state, grid) path = wyszukiwanie_bfs(start_state, goal_state, grid)

View File

@ -1,31 +1,35 @@
class SearchSpace: class SearchSpace:
def __init__(self): def __init__(self):
self.grid = [['1']*10 for _ in range(10)] # create a 10x10 grid of cells 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), 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)]: (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 self.grid[r][c] = 'X' # set the cells with a shelf to not passable
def is_passable(self, x, y): def is_passable(self, x, y):
return 0 <= x < 10 and 0 <= y < 10 and self.grid[y][x] != 'X' return 0 <= x < 10 and 0 <= y < 10 and self.grid[y][x] != 'X'
class Stan: class Stan:
def __init__(self, x, y, kierunek): def __init__(self, x, y, kierunek):
self.x = x self.x = x
self.y = y self.y = y
self.kierunek = kierunek self.kierunek = kierunek
class Wezel: class Wezel:
def __init__(self, stan): def __init__(self, stan):
self.stan = stan self.stan = stan
def poprzednik(wezel, search_space): def poprzednik(wezel, search_space):
# gora -> prawo -> dol -> lewo | obrot w prawo # gora -> prawo -> dol -> lewo | obrot w prawo
# gora -> lewo -> dol -> prawo | obrot w lewo # gora -> lewo -> dol -> prawo | obrot w lewo
# 0 gora 1 prawo 2 dol 3 lewo # 0 gora 1 prawo 2 dol 3 lewo
y = wezel.stan.x y = wezel.stan.x
x = wezel.stan.y x = wezel.stan.y
obrot_w_prawo = Stan(x, y, (wezel.stan.kierunek + 1) % 4) obrot_w_prawo = Stan(x, y, (wezel.stan.kierunek + 1) % 4)
obrot_w_lewo = Stan(x, y, (wezel.stan.kierunek - 1) % 4) # obrot_w_lewo = Stan(x, y, (wezel.stan.kierunek - 1) % 4)
obrot_w_lewo = Stan(x, y, 3 if wezel.stan.kierunek == 0 else wezel.stan.kierunek - 1)
if wezel.stan.kierunek == 0: if wezel.stan.kierunek == 0:
y -= 1 y -= 1
@ -45,23 +49,64 @@ def poprzednik(wezel, search_space):
return wezly return wezly
# def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy, search_space):
# pierwszy_wezel = Wezel(stan_poczatkowy)
# fringe = [pierwszy_wezel]
#
# odwiedzone = []
# odwiedzone.append(pierwszy_wezel)
# 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.append(nowy_wezel)
# if stan_docelowy.x == nowy_wezel.stan.x and stan_docelowy.y == nowy_wezel.stan.y:
# return odwiedzone
# return odwiedzone
def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy, search_space): def wyszukiwanie_bfs(stan_poczatkowy, stan_docelowy, search_space):
pierwszy_wezel = Wezel(stan_poczatkowy) pierwszy_wezel = Wezel(stan_poczatkowy)
fringe = [pierwszy_wezel] fringe = [pierwszy_wezel]
odl_x = 100
odwiedzone = set() odl_y = 100
# odleglosci = [[odleglosc_x, odleglosc_y]]
odwiedzone = [stan_poczatkowy]
while fringe: while fringe:
wezel = fringe.pop(0) wezel = fringe.pop(0)
if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y: if stan_docelowy.x == wezel.stan.x and stan_docelowy.y == wezel.stan.y:
return odwiedzone return odwiedzone
odwiedzone.add(wezel.stan) # odwiedzone.append(wezel.stan)
for stan in poprzednik(wezel, search_space): for stan in poprzednik(wezel, search_space):
if stan not in odwiedzone: flag = 0
for x in odwiedzone:
if x.x == stan.x and x.y == stan.y and x.kierunek == stan.kierunek:
flag = 1
break
if flag == 1:
continue
else:
odleglosc_x = abs(stan.x - stan_docelowy.x)
odleglosc_y = abs(stan.y - stan_docelowy.y)
if odl_x + odl_y >= odleglosc_x + odleglosc_y:
odl_x = odleglosc_x
odl_y = odleglosc_y
# else:
# # # print("JEST")
# # pass
nowy_wezel = Wezel(stan) nowy_wezel = Wezel(stan)
fringe.append(nowy_wezel) fringe.append(nowy_wezel)
odwiedzone.add(stan) odwiedzone.append(stan)
if stan_docelowy.x == stan.x and stan_docelowy.y == stan.y:
return odwiedzone
return odwiedzone return odwiedzone