def buscar_solucion_aes(conexiones, estado_inicial, solucion): solucionado = False nodos_visitados = [] nodos_frontera = [] nodo_inicial = Nodo(estado_inicial) nodo_inicial.set_coste(0) nodos_frontera.append(nodo_inicial) while (not solucionado) and len(nodos_frontera) != 0: nodos_frontera = sorted(nodos_frontera, key=cmp_to_key(compara)) nodo = nodos_frontera[0] nodos_visitados.append(nodos_frontera.pop(0)) if nodo.get_datos() == solucion: solucionado = True return nodo else: dato_nodo = nodo.get_datos() lista_hijos = [] for un_hijo in conexiones[dato_nodo]: hijo = Nodo(un_hijo) coste = conexiones[dato_nodo][un_hijo] hijo.set_coste(nodo.get_coste() + coste) lista_hijos.append(hijo) if not hijo.en_lista(nodos_visitados): if hijo.en_lista(nodos_frontera): for n in nodos_frontera: if n.igual( hijo) and n.get_coste() > hijo.get_coste(): nodos_frontera.remove(n) nodos_frontera.append(hijo) else: nodos_frontera.append(hijo) nodo.set_hijos(lista_hijos)
def buscar_solucion_UCS(conexiones, estado_inicial, solucion): solucionado = False nodos_visitados = [] nodos_frontera = [] nodoInicial = Nodo(estado_inicial) nodoInicial.set_coste(0) nodos_frontera.append(nodoInicial) while (not solucionado) and len(nodos_frontera) != 0: # Ordenar la lista de nodos frontera nodos_frontera = sorted(nodos_frontera, key=cmp_to_key(compara)) nodo = nodos_frontera[0] # Extraer nodo y añadirlo a visitados nodos_visitados.append(nodos_frontera.pop(0)) if nodo.get_datos() == solucion: # Solucion encontrada solucionado = True return nodo else: #Expandir nodos hijos (ciudades con conexión) dato_nodo = nodo.get_datos() lista_hijos = [] lista_posibles_hijos = procrear(nodoInicial, conexiones, solucion) for un_hijo in lista_posibles_hijos[dato_nodo]: hijo = Nodo(un_hijo) #Cálculo g(n) if celda_valida(hijo): coste = 2 hijo.set_coste(nodo.get_coste() + coste) lista_hijos.append(hijo) if not hijo.en_lista(nodos_visitados): # Si está en la lista lo sustituimos con el # nuevo valor de coste si es menor if hijo.en_lista(nodos_frontera): for n in nodos_frontera: if n.igual(hijo) and n.get_coste( ) > hijo.get_coste(): nodos_frontera.remove(n) nodos_frontera.append(hijo) else: nodos_frontera.append(hijo) nodo.set_hijos(lista_hijos)
def buscar_solucion_UCS(conexiones, estado_inicial, solucion): solucionado = False nodos_visitados = [] nodos_frontera = [] nodo_inicial = Nodo(estado_inicial) nodo_inicial.set_coste(0) nodos_frontera.append(nodo_inicial) while (not solucionado) and len(nodos_frontera) != 0: # ordenar la lista de nodos frontera nodos_frontera = sorted(nodos_frontera, cmp=compara) nodo = nodos_frontera[0] # extraer nodo y añadirlo a visitados nodos_visitados.append(nodos_frontera.pop(0)) if nodo.get_datos() == solucion: # solucion encontrada solucionado = True return nodo else: # expandir nodos hijo (ciudades con conexión) dato_nodo = nodo.get_datos() lista_hijos = [] for un_hijo in conexiones[dato_nodo]: hijo = Nodo(un_hijo) coste = conexiones[dato_nodo][un_hijo] hijo.set_coste(nodo.get_coste() + coste) lista_hijos.append(hijo) if not hijo.en_lista(nodos_visitados): # si está en la lista lo sustituimos con # el nuevo valor de coste si es menor if hijo.en_lista(nodos_frontera): for n in nodos_frontera: if n.igual( hijo) and n.get_coste() > hijo.get_coste(): nodos_frontera.remove(n) nodos_frontera.append(hijo) else: nodos_frontera.append(hijo) nodo.set_hijos(lista_hijos)