From 7288e4901c862befba6a4fac1d33adc58f120234 Mon Sep 17 00:00:00 2001 From: Miron Date: Sun, 9 May 2021 11:27:22 +0200 Subject: [PATCH] Nieskonczony A* --- src/img/stain.png | Bin 0 -> 2557 bytes src/main.py | 146 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 130 insertions(+), 16 deletions(-) create mode 100644 src/img/stain.png diff --git a/src/img/stain.png b/src/img/stain.png new file mode 100644 index 0000000000000000000000000000000000000000..4092b32544510527ff161296c133f4982b53dad4 GIT binary patch literal 2557 zcma)8dsGu=9vxUj0uo*VJ}LpVMji(0qaYy!1QkRAqD2vTwW6XW3?MriAg~A`*ou}a zyAsLDBk>8iU7M6K1PPD2DpV*%aYjsh#1Wa4iYAf-c9NcB*~L9)|Cn#SlT7aXzWclP z{!$jr+GuULz!Cre>+rD97yvNwGF%qs#3zUIPvj6c5*QYj4FFaShRXyv%bQ0$@o8E} zNObhRjDs23`!Yb+@Q@H!Fe_tE+Lx&SaA@f2iEEo=(Q|`(kJl=qJ!!fTo*sv8Irc$+5$%FOs9e}Up}^VJ95OL218`evTk0u zpCe59HpTY90NcOsP2O5<$DFOePo(dDW?v@*ilrwsHN6^$d;ew8NK1aBhf)Nvef7)PB0ML+#dk4AysJCA3KKME~57^WDCePgs4Gr)IZ(-g=+ypLKPA zT<(Z&RipAY@~FbLa0kb0XRzNk<*>(B=Z2Mvu0!+587Z8Yf1;k^2ZbdgwO3=$-T`lt*Du0iA_0K&F#r@E0f2W?#Qg;T#8?0(jynLrzX|}HGX{53P6B{M zaCm6&wnIa&kly1z=X}&XCP*mox*RwDgh1`8(-M^yyU1v{^4gYn5 zMl-rPGTXfE;^WQUCaybxqFEMBg~=usPR70K4&$C!ie~+vU)Hgah@k2T3Hwde$mW%2 zc|(d$sASrY-vhNZzg!*p|cU87NwXB*f`jzb=7G zsm)LeLK&9O=x zlU(q1X0kbo0ESy&f-diJ&QV>a(vgX8j%bRQc>Vk+Tq;9Fa<=XoJ_J-MyvXf;=$d2@L(D>8~lnFC3W!XI}^liny@_3CR&ko-|g zt6!;Z#`30zSKAe9MZGqD1*7Vv!z(O&^qd^;v(tXrK)u{uK3p-LNyI`ssOE|vI^npb zAt%)3Nma~UDIdx}AD<_}HkD?V7+!)bvW9$1U>m~rwRA>W-clseNlH1VNQh5r98hmA zScZ%e`XM@7Ekos?8a9$|j4Cs$Kcs9f=wBV_X@jV8k}QNGLcC8$N9A}cs7@9~L^TVk zuc}Jn969?+L+|7Bpqf3Vy>})-&W;q*1MfurIqTBfwpLHCHh%Gp*ls&^OocsC<@ApZ zfg%qioeVV@1L-e>Rg#nD(u=~gpNnm?_nuEcX?C?jN&*JMo?<0+M3j%`Q%FWC`+GFlZ=rp;vFcnjUtWRO;aqpF2frA;EkpmM7;d8A zfd?>sWWm#WpnARdp$ks4hPD^OlD%KqZvS1})73*%yQH>%_1!RroZCca@&sygJ{!Au z#RkG&N2*fzH62r{kwp<3uyA!;9(icOf@T9rOJGL&4ep0iYu<%Zbc`%E%r3%>zt67U s>_0RmW_V*pO#SDSo?doP*_1iZlVn1(KYK5N_~QYDuV;leu1hZZHw^D``Tzg` literal 0 HcmV?d00001 diff --git a/src/main.py b/src/main.py index ed11727..7ec8fb1 100644 --- a/src/main.py +++ b/src/main.py @@ -4,7 +4,6 @@ import time pygame.init() - WIDTH = 675 HEIGHT = 675 size = 75 @@ -14,7 +13,6 @@ RECT_SIZE = 9 IMAGE = pygame.image.load('img/wozek2.png') BACKGROUND = pygame.transform.scale(pygame.image.load('img/background.png'), (WIDTH, HEIGHT)) DOCK = pygame.transform.scale(pygame.image.load('img/dock_left.png'), (75, 75)) - get_pix_from_position = {} @@ -25,7 +23,20 @@ def get_position_from_pix(pix_pos): print("ERROR: THERE IS NO POSITION LIKE THIS (get_position_from_pix)") -def create_postiions(): +WAREHOUSE_MAP = [ + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [20, 20, 20, 20, 20, 20, 20, 20, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 199, 199, 199, 199, 199, 199, 199, 199], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1], +] + + +def create_positions(): size_agent = 40 x_position_pix = size_agent y_position_pix = size_agent @@ -42,9 +53,10 @@ def generate_package(a, b): rand_x = random.randint(10, 150) name_list = ['Grocery', 'Explosive', 'Electronic', 'Builders'] image_list = ['img/package_grocery.png', 'img/package_explosive.png', 'img/package.png', 'img/package_builders.png'] - p1 = Package((a, b), rand_x, name_list[rand_y-1], image_list[rand_y-1]) + p1 = Package((a, b), rand_x, name_list[rand_y - 1], image_list[rand_y - 1]) return p1 + # FRINGE - struktura danych przechowująca wierzchołki do odwiedzenia # EXPLORED - lista odwiedzonych stanów # istate - stan początkowy @@ -96,6 +108,92 @@ def breadth_first_search(istate, agent_direction): # COORDINATES OF A START PLA fringe.append(x) +def a_star_search(start, end): + open_nodes = [] + closed_nodes = [] + + start_node = NodeAStar(None, start) + start_node.g = start_node.h = start_node.f = 0 + end_node = NodeAStar(None, end) + end_node.g = end_node.h = end_node.f = 0 + + open_nodes.append(start_node) + + while len(open_nodes) != 0: + current_node = open_nodes[0] + current_node_index = 0 + for index, node in enumerate(open_nodes): + if node.f < current_node.f: + current_node = node + current_node_index = index + + open_nodes.pop(current_node_index) + closed_nodes.append(current_node) + + # Sprawdzam czy jesteśmy u celu jeżeli tak zwracamy ścieżkę + neighbour_nodes = [] + if current_node == end_node: + path = [] + current = current_node + while current is not None: + path.append(current.position) + current = current.parent + return path[::-1] + + x = current_node.position[0] + y = current_node.position[1] + if x < 8: # RIGHT NEIGHBOUR + neighbour_nodes.append( + NodeAStar(current_node, + (x + 1, y) + )) + if x > 0: # LEFT NEIGHBOUR + neighbour_nodes.append( + NodeAStar(current_node, + (x - 1, y) + )) + if y > 0: # UP NEIGHBOUR + neighbour_nodes.append( + NodeAStar(current_node, + (x, y - 1) + )) + if y < 8: # DOWN NEIGHBOUR + neighbour_nodes.append( + NodeAStar(current_node, + (x, y + 1) + )) + for neighbour in neighbour_nodes: + if len([closed_neighbour for closed_neighbour in closed_nodes if closed_neighbour == neighbour]) > 0: + continue + + neighbour.g = current_node.g + WAREHOUSE_MAP[neighbour.position[0]][neighbour.position[1]] + neighbour.h = abs(neighbour.position[0] - end_node.position[0]) + abs(neighbour.position[1] - end_node.position[1]) + neighbour.f = neighbour.g + neighbour.h + + if len([open_node for open_node in open_nodes if + neighbour.position == open_node.position and neighbour.g > open_node.g]) > 0: + continue + + open_nodes.append(neighbour) + + +class NodeAStar: + def __init__(self, parent=None, position=None): + self.parent = parent + self.position = position + + self.g = 0 + self.h = 0 + self.f = 0 + + def __eq__(self, other): + return self.position == other.position + + +print(a_star_search((0, 0), (3, 0))) +#print(a_star_search((2, 2), (7, 7))) +print(WAREHOUSE_MAP[5][0]) +print(5, 0) class Node: def __init__(self, state, agent_direction, action=None, parent=None): self.state = state @@ -178,6 +276,13 @@ class Shelf: self.rect = self.image.get_rect(center=self.pos_pix) +class Stain: + def __init__(self, pos): + self.pos_pix = get_pix_from_position[pos] + self.image = STAIN = pygame.transform.scale(pygame.image.load("img/stain.png"), (60, 60)) + self.rect = self.image.get_rect(center=self.pos_pix) + + class Agent: def __init__(self, pos, agent_direction="right"): self.pos = pos @@ -259,7 +364,7 @@ class Agent: def lift_package_bfs(self): for package in Package_list: if package.is_package_up: - package.is_package_up = False + package.is_package_up = False elif package.pos == agent.pos: package.is_package_up = True @@ -273,7 +378,7 @@ class Agent: board = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA) # transparently surface # -create_postiions() +create_positions() # @@ -283,15 +388,17 @@ for x in range(9): agent = Agent((40, 640)) - Shelf_list = [ - Shelf((5, 2), 'Explosive', 5), Shelf((6, 2), 'Explosive', 5), Shelf((7, 2), 'Explosive', 5), Shelf((8, 2), 'Explosive', 5), + Shelf((5, 2), 'Explosive', 5), Shelf((6, 2), 'Explosive', 5), Shelf((7, 2), 'Explosive', 5), + Shelf((8, 2), 'Explosive', 5), Shelf((5, 4), 'Grocery', 5), Shelf((6, 4), 'Grocery', 5), Shelf((7, 4), 'Grocery', 5), Shelf((8, 4), 'Grocery', 5), - Shelf((5, 6), 'Builders', 5), Shelf((6, 6), 'Builders', 5), Shelf((7, 6), 'Builders', 5), Shelf((8, 6), 'Builders', 5), - Shelf((5, 8), 'Electronic', 5), Shelf((6, 8), 'Electronic', 5), Shelf((7, 8), 'Electronic', 5), Shelf((8, 8), 'Electronic', 5)] + Shelf((5, 6), 'Builders', 5), Shelf((6, 6), 'Builders', 5), Shelf((7, 6), 'Builders', 5), + Shelf((8, 6), 'Builders', 5), + Shelf((5, 8), 'Electronic', 5), Shelf((6, 8), 'Electronic', 5), Shelf((7, 8), 'Electronic', 5), + Shelf((8, 8), 'Electronic', 5)] - -coord_goals = [(6, 8), (0, 0), (5,8), (0, 0), (7,8), (0, 0), (8,8), (0, 0), (5,6), (0, 0), (6,6), (0, 0), (7,6), (0, 0), (8,6), (0, 8)] +coord_goals = [(6, 8), (0, 0), (5, 8), (0, 0), (7, 8), (0, 0), (8, 8), (0, 0), + (5, 6), (0, 0), (6, 6), (0, 0), (7, 6), (0, 0), (8, 6), (0, 8)] screen = pygame.display.set_mode([WIDTH, HEIGHT]) @@ -301,18 +408,22 @@ Package_list = [ agent.path = breadth_first_search(agent.pos_coord, agent.agent_direction) +Stain_list = [] +# Pętla służąca do tworzenia plam oleju na podstawie mapy magazynu +for index_x in range(9): + for index_y in range(9): + if WAREHOUSE_MAP[index_x][index_y] == 5: + Stain_list.append(Stain((index_y, index_x))) running = True -while running: +while running: + time.sleep(0.25) for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.KEYDOWN: pass - # agent.move(event.key) - # agent.lift_package(event.key) - # agent.rotate(event.key) for package in Package_list: if package.is_package_up: @@ -337,6 +448,7 @@ while running: agent.move_bfs() + else: time.sleep(.25) @@ -353,6 +465,8 @@ while running: screen.blit(board, board.get_rect()) for shelf in Shelf_list: screen.blit(shelf.image, shelf.rect) + for stain in Stain_list: + screen.blit(stain.image, stain.rect) screen.blit(agent.image, agent.rect) for package in Package_list: screen.blit(package.image, package.rect)