Example #1
0
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)
Example #2
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)
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])
Example #4
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)
Example #5
0
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])