def heuristic_search(root_node: Node, heuristic: Callable[[Node], int]) -> (Node, Monitor): X = set() F = [] heapq.heapify(F) heapq.heappush(F, root_node) monitor = Monitor(X, F) monitor.start() while True: if not F: monitor.finish() return False, monitor # with MonitorPerformance(): v = heapq.heappop(F) if v.state == parameters.objective_state: monitor.finish() return v, monitor elif v.state not in X: #rever isso, o estado pode estar aqui já, mas ter chego por outro caminho X.add(v.state) monitor.count() for node in expand_node(v): node.set_heuristic_cost(heuristic(node)) heapq.heappush(F, node)
def run_expand_nodes_function(arguments: Arguments): to_expand_node = Node(None, arguments.initial_state, arguments.initial_state_cost, []) expanded_nodes = expand_node(to_expand_node) to_print = "" for expanded_node in expanded_nodes: to_print += "(" + expanded_node.action + "," + expanded_node.state + "," \ + str(expanded_node.cost) + "," + expanded_node.predecessor.state + ") " print(to_print.strip()) logging.info(to_print.strip())
def test_expand_left_center_root_node(self): state = "321_54867" action = None cost = 120 predecessor = None node = Node(action, state, cost, predecessor) expanded_nodes = expand_node(node) expected_node_right = Node("direita", "3215_4867", 121, node) expected_node_up = Node("acima", "_21354867", 121, node) expected_node_down = Node("abaixo", "321854_67", 121, node) self.assertEqual(len(expanded_nodes), 3) self.assertEqual(expected_node_right, expanded_nodes[0]) self.assertEqual(expected_node_up, expanded_nodes[1]) self.assertEqual(expected_node_down, expanded_nodes[2])
def breadth_first_search(root_node: Node) -> (Node, Monitor): X = set() # <-- Explorados F: Deque[Node] = deque() # <-- Fronteira - deque eh uma implementacao para fila F.append(root_node) monitor = Monitor(X, F) monitor.start() while True: if not F: # <-- Se a fronteira fica vazia, nao existe caminho monitor.finish() return False, monitor v = F.popleft() # <-- Retira um nodo v da fronteira if v.state == parameters.objective_state: # <-- Chegou no estado final? monitor.finish() return v, monitor # <-- Entao retorna o ultimo nó elif v.state not in X: # <-- Adiciona v aos explorados caso ainda nao esteja X.add(v.state) monitor.count() for node in expand_node(v): # <-- Adiciona os vizinhos de V a fronteira F.append(node)
def test_expand_center_root_node(self): action = None state = "3215_4867" cost = 0 predecessor = None node = Node(action, state, cost, predecessor) expanded_nodes = expand_node(node) expected_node_left = Node("esquerda", "321_54867", 1, node) expected_node_right = Node("direita", "32154_867", 1, node) expected_node_up = Node("acima", "3_1524867", 1, node) expected_node_down = Node("abaixo", "3215648_7", 1, node) self.assertEqual(len(expanded_nodes), 4) self.assertEqual(expected_node_left, expanded_nodes[0]) self.assertEqual(expected_node_right, expanded_nodes[1]) self.assertEqual(expected_node_up, expanded_nodes[2]) self.assertEqual(expected_node_down, expanded_nodes[3])