Example #1
0
def search_BSF_solution(connections, init_state, solution):
    solved = False
    visited_nodes = []
    frontrs_nodes = []

    init_node = Node(init_state)
    frontrs_nodes.append(init_node)
    while (not solved) and len(frontrs_nodes) != 0:
        node = frontrs_nodes[0]
        # extraer nodo y añadirlo a visitados
        visited_nodes.append(frontrs_nodes.pop(0))
        if node.get_data() == solution:
            solved = True
            return node
        else:
            # expandir nodos hijo - ciudades con conexion
            node_data = node.get_data()
            child_list = []
            for chld in connections[node_data]:
                child = Node(chld)
                child_list.append(child)
                if not child.on_list(visited_nodes) and not child.on_list(
                        frontrs_nodes):
                    frontrs_nodes.append(child)

            node.set_child(child_list)
Example #2
0
def search_solution_UCS(connections, init_state, solution):
    solved = False
    visited_nodes = []
    frontier_nodes = []
    init_node = Node(init_state)
    init_node.set_cost(0)
    frontier_nodes.append(init_node)
    while (not solved) and len(frontier_nodes) != 0:
        # Ordenar lista de nodos frontera
        frontier_nodes = sorted(frontier_nodes, key=Compare)
        node = frontier_nodes[0]
        # Extraer nodo y añadirlo a visitados
        visited_nodes.append(frontier_nodes.pop(0))
        if node.get_data() == solution:
            # Solucion encontrada
            solved = True
            return node
        else:
            # Expandir nodos hijo (ciudades con conexion)
            node_data = node.get_data()
            child_list = []
            for achild in connections[node_data]:
                child = Node(achild)
                cost = connections[node_data][achild]
                child.set_cost(node.get_cost() + cost)
                child_list.append(child)
                if not child.on_list(visited_nodes):
                    # Si está en la lista lo sustituimos con el nuevo valor de coste si es menor
                    if child.on_list(frontier_nodes):
                        for n in frontier_nodes:
                            if n.equal(
                                    child) and n.get_cost() > child.get_cost():
                                frontier_nodes.remove(n)
                                frontier_nodes.append(child)
                    else:
                        frontier_nodes.append(child)
            node.set_child(child_list)
Example #3
0
def search_BFS_solution(init_state, solution):
    solved = False
    visited_nodes = []
    frontrs_nodes = []

    initNode = Node(init_state)
    frontrs_nodes.append(initNode)
    while (not solved) and len(frontrs_nodes) != 0:
        node = frontrs_nodes.pop(0)
        # extraer nodo y añadirlo a visitados
        visited_nodes.append(node)
        if node.get_data() == solution:
            # solucion encontrada
            solved = True
            return node
        else:
            # expandir nodos hijo
            node_data = node.get_data()

            # operador izquierdo
            child = [node_data[1], node_data[0], node_data[2], node_data[3]]
            left_child = Node(child)
            if not left_child.on_list(
                    visited_nodes) and not left_child.on_list(frontrs_nodes):
                frontrs_nodes.append(left_child)

            # operador central
            child = [node_data[0], node_data[2], node_data[1], node_data[3]]
            center_child = Node(child)
            if not center_child.on_list(
                    visited_nodes) and not center_child.on_list(frontrs_nodes):
                frontrs_nodes.append(center_child)

            # operador derecho
            child = [node_data[0], node_data[1], node_data[3], node_data[2]]
            right_child = Node(child)
            if not right_child.on_list(
                    visited_nodes) and not right_child.on_list(frontrs_nodes):
                frontrs_nodes.append(right_child)

            node.set_child([left_child, center_child, right_child])
Example #4
0
def search_solution_DFS(init_state, solution):
    solved = False
    visited_nodes = []
    frontrs_nodes = []
    init_node = Node(init_state)
    frontrs_nodes.append(init_node)
    while (not solved) and len(frontrs_nodes) != 0:
        node = frontrs_nodes.pop()
        # Extraer nodo y añadirlo a visitados
        visited_nodes.append(node)
        if node.get_data() == solution:
            # Solucion encontrada
            solved = True
            return node
        else:
            # Expandir nodos hijos
            data_node = node.get_data()
            # Operador Izquierdo
            child = [data_node[1], data_node[0], data_node[2], data_node[3]]
            left_child = Node(child)
            if not left_child.on_list(
                    visited_nodes) and not left_child.on_list(frontrs_nodes):
                frontrs_nodes.append(left_child)
            # Operador Central
            child = [data_node[0], data_node[2], data_node[1], data_node[3]]
            central_child = Node(child)
            if not central_child.on_list(
                    visited_nodes) and not central_child.on_list(
                        frontrs_nodes):
                frontrs_nodes.append(central_child)
            # Operador Derecho
            child = [data_node[0], data_node[1], data_node[3], data_node[2]]
            right_child = Node(child)
            if not right_child.on_list(
                    visited_nodes) and not right_child.on_list(frontrs_nodes):
                frontrs_nodes.append(right_child)
            node.set_child([left_child, central_child, right_child])