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