예제 #1
0
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)
예제 #2
0
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)