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)
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)
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])
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])