def buscar_solucion_BFS(conexiones, estado_inicial, solucion): solucionado = False nodos_visitados = [] nodos_frontera = [] nodoInicial = Nodo(estado_inicial) nodos_frontera.append(nodoInicial) while (not solucionado) and len(nodos_frontera) != 0: #extraer nodo y añadirlo a visitados nodo = nodos_frontera.pop(0) nodos_visitados.append(nodo) if nodo.getDatos() == solucion: #Solcuion encontrada solucionado = True return nodo else: #expandir nodos hijos (ciudades con conexion) dato_nodo = nodo.getDatos() lista_hijos = [] for un_hijo in conexiones[dato_nodo]: hijo = Nodo(un_hijo) lista_hijos.append(hijo) if (not hijo.enLista(nodos_visitados)) and ( not hijo.enLista(nodos_frontera)): nodos_frontera.append(hijo) nodo.setHijos(lista_hijos)
def buscar_solucion_UCS(conexiones, estado_inicial, solucion): solucionado = False nodos_visitados = [] nodos_frontera = [] nodo_inicial = Nodo(estado_inicial) nodo_inicial.setCoste(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, key=lambda Nodo: Nodo.calcularTotalCost(coord, solucion)) #extraer nodo y añadirlo a visitados nodo = nodos_frontera.pop(0) nodos_visitados.append(nodo) if nodo.getDatos() == solucion: #Solcuion encontrada solucionado = True return nodo else: #expandir nodos hijos (ciudades con conexion) dato_nodo = nodo.getDatos() lista_hijos = [] for un_hijo in conexiones[dato_nodo]: hijo = Nodo(un_hijo) #añadir el coste al nodo coste = conexiones[dato_nodo][un_hijo] hijo.setCoste(nodo.getCoste() + coste) lista_hijos.append(hijo) if (not hijo.enLista(nodos_visitados)): #si no ha sido visitado y esta en la lista de frontera # lo sustituimos con el nuevo valor de coste si es menor if (hijo.enLista(nodos_frontera)): for n in nodos_frontera: if n.igual( hijo) and n.getCoste() > hijo.getCoste(): nodos_frontera.remove(n) nodos_frontera.append(hijo) else: nodos_frontera.append(hijo) nodo.setHijos(lista_hijos)
def buscarSolucionBfs(estadoInicial, solucion): solucionado = False nodosVisitados = [] nodosFrontera = [] nodoInicial = Nodo(estadoInicial) nodosFrontera.append(nodoInicial) while (not solucionado) and len(nodosFrontera) != 0: # extraer nodo y a;adirlo a vistado nodo = nodosFrontera.pop(0) nodosVisitados.append(nodo) if nodo.getDatos() == solucion: # solucion encontrada solucionado = True return nodo else: # expandir nodos hijo datoNodo = nodo.getDatos() # operador izquierdo hijo = [datoNodo[1], datoNodo[0], datoNodo[2], datoNodo[3]] hijoIzquierdo = Nodo(hijo) if not hijoIzquierdo.enLista(nodosVisitados) and not hijoIzquierdo.enLista(nodosFrontera): nodosFrontera.append(hijoIzquierdo) # operados central hijo = [datoNodo[0], datoNodo[2], datoNodo[1], datoNodo[3]] hijoCentral = Nodo(hijo) if not hijoCentral.enLista(nodosVisitados) and not hijoCentral.enLista(nodosFrontera): nodosFrontera.append(hijoCentral) #operador derecho hijo = [datoNodo[0], datoNodo[1], datoNodo[3], datoNodo[2]] hijoDerecho = Nodo(hijo) if not hijoDerecho.enLista(nodosVisitados) and not hijoDerecho.enLista(nodosFrontera): nodosFrontera.append(hijoDerecho) nodo.setHijos([hijoIzquierdo, hijoCentral, hijoDerecho])
def buscar_solucion_UCS(informacion, estado_inicial): depth = 0 nodos_visitados = [] nodos_frontera = [] nodo_inicial = Nodo(estado_inicial) nodo_inicial.setCoste(0) nodos_frontera.append(nodo_inicial) while (depth != 3) and len(nodos_frontera) != 0: #Ordenar la lista de nodos frontera nodos_frontera = sorted( nodos_frontera, key=lambda Nodo: Nodo.calcularTotalCost(informacion)) #extraer nodo y añadirlo a visitados nodo = nodos_frontera.pop(0) nodos_visitados.append(nodo) #expandir nodos hijos (empresas restantes) dato_nodo = nodo.getDatos() lista_hijos = [] if dato_nodo == "inicio": for i in range(4): hijo = Nodo("Empresa" + (i + 1)) #añadir el coste al nodo coste = informacion[i][depth] hijo.setCoste(nodo.getCoste() + coste) lista_hijos.append(hijo) if (not hijo.enLista(nodos_visitados)): #si no ha sido visitado y esta en la lista de frontera # lo sustituimos con el nuevo valor de coste si es menor if (hijo.enLista(nodos_frontera)): for n in nodos_frontera: if n.igual(hijo) and n.getCoste() > hijo.getCoste(): nodos_frontera.remove(n) nodos_frontera.append(hijo) else: nodos_frontera.append(hijo) nodo.setHijos(lista_hijos)
def buscarSolucionBfs(conexiones, estadoInicial, solucion): solucionado = False nodosVisitados = [] nodosFrontera = [] nodoInicial = Nodo(estadoInicial) nodosFrontera.append(nodoInicial) while (not solucionado) and len(nodosFrontera) != 0: nodo = nodosFrontera.pop(0) nodosVisitados.append(nodo) if nodo.getDatos() == solucion: solucionado = True return nodo else: # expandir nodos hijo (ciudades con conexion) datoNodo = nodo.getDatos() listaHijos = [] for unHijo in conexiones[datoNodo]: hijo = Nodo(unHijo) listaHijos.append(hijo) if not hijo.enLista(nodosVisitados) and not hijo.enLista(nodosFrontera): nodosFrontera.append(hijo) nodo.setHijos(listaHijos)
def buscarSolucionUcs(conexiones, estadoInicial, solucion): solucionado = False nodosVisitados = [] nodosFrontera = [] nodoInicial = Nodo(estadoInicial) nodoInicial.setCoste(0) nodosFrontera.append(nodoInicial) while (not solucionado) and len(nodosFrontera) != 0: # ordenar la lista de nodos frontera nodosFrontera = sorted(nodosFrontera, key=lambda n: n.getCoste()) nodo = nodosFrontera.pop(0) # extraer nodo y a;adirlo a visitados nodosVisitados.append(nodo) if nodo.getDatos() == solucion: solucionado = True return nodo else: datoNodo = nodo.getDatos() listaHijos = [] for unHijo in conexiones[datoNodo]: hijo = Nodo(unHijo) coste = conexiones[datoNodo][unHijo] hijo.setCoste(nodo.getCoste() + coste) listaHijos.append(hijo) if not hijo.enLista(nodosVisitados): # si esta el hijo en nodosFrontera if hijo.enLista(nodosFrontera): for n in nodosFrontera: if n.igual(hijo) and n.getCoste() > hijo.getCoste(): nodosFrontera.remove(n) nodosFrontera.append(hijo) else: nodosFrontera.append(hijo) nodo.setHijos(listaHijos)
def buscarSolucionDfs_recursive(conexiones, nodo, solucion, visitados, limite): if limite > 0: visitados.append(nodo) if nodo.getDatos() == solucion: return nodo else: datoNodo = nodo.getDatos() listaHijos = [] for unHijo in conexiones[datoNodo]: hijo = Nodo(unHijo) if not hijo.enLista(visitados): listaHijos.append(hijo) nodo.setHijos(listaHijos) for nodoHijo in nodo.getHijos(): if not nodoHijo.getDatos() in visitados: sol = buscarSolucionDfs_recursive(conexiones, nodoHijo, solucion, visitados, limite-1) if sol != None: return sol return None
def buscar_solucion_BFS(estado_inicial, solucion): solucionado = False nodos_visitados = [] nodos_frontera = [] nodoInicial = Nodo(estado_inicial) nodos_frontera.append(nodoInicial) while (not solucionado) and len(nodos_frontera) != 0: #extraer nodo y añadirlo a visitados nodo = nodos_frontera.pop(0) nodos_visitados.append(nodo) if nodo.getDatos() == solucion: #Solcuion encontrada solucionado = True return nodo else: #expandir nodos hijos dato_nodo = nodo.getDatos() #operador izquierdo hijo = [dato_nodo[1], dato_nodo[0], dato_nodo[2], dato_nodo[3]] hijo_izquierdo = Nodo(hijo) if (not hijo_izquierdo.enLista(nodos_visitados)) and ( not hijo_izquierdo.enLista(nodos_frontera)): nodos_frontera.append(hijo_izquierdo) #operador central hijo = [dato_nodo[0], dato_nodo[2], dato_nodo[1], dato_nodo[3]] hijo_central = Nodo(hijo) if (not hijo_central.enLista(nodos_visitados)) and ( not hijo_central.enLista(nodos_frontera)): nodos_frontera.append(hijo_central) #operador derecho hijo = [dato_nodo[0], dato_nodo[1], dato_nodo[3], dato_nodo[2]] hijo_derecho = Nodo(hijo) if (not hijo_derecho.enLista(nodos_visitados)) and ( not hijo_derecho.enLista(nodos_frontera)): nodos_frontera.append(hijo_derecho) nodo.setHijos([hijo_izquierdo, hijo_central, hijo_derecho])