Example #1
0
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())
Example #3
0
    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)
Example #5
0
    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])