Example #1
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)