예제 #1
0
bool BusquedaA::ejecutarBusqueda()
{
    nodoInicial->setHeuristica(calcularHeuristicaAdmisible(nodoInicial));
    cola<<nodoInicial;
    Nodo* nodoMenor;

    while(!cola.empty())
    {
        int idxMenor = getIndiceNodoFMenor(cola);  // obtiene el indice del nodo con menor f en la cola de prioridad
        nodoMenor = cola.at(idxMenor);     // obtiene el nodo de con menor f de la cola de prioridad

        cola.removeAt(idxMenor);           // elimina el nodo de menor f de la cola
        nodosExpandidos<<nodoMenor;                 // añade el nodo con menor f a los nodos expandidos
        cantidadNodosExpandidos++;

        if(nodoMenor->esMeta()){                    // se verifica si es meta
            nodoSolucion = nodoMenor;               // como es meta se asigna a nodoSolucion el nodo solucion
            return true;
        }else{
            QList <Nodo*> nodosExpandidos = nodoMenor->expandir();
            Nodo* nodoExp;
            foreach (nodoExp, nodosExpandidos) {
                if(!esCiclo(nodoExp)){
                    cola<<nodoExp;
                    cantidadNodosCreados++;
                    nodoExp->setHeuristica(calcularHeuristicaAdmisible(nodoExp));
                    if(nodoExp->getProfundidad() > profundidadArbol){
                        profundidadArbol = nodoExp->getProfundidad();
                    }
                }else{
                    delete nodoExp;     // elimina solo los nodos que representan un ciclo en el arbol
                    nodoExp = 0;
                }
            }
        }
    }
    return false;
}
예제 #2
0
bool BusquedaAmplitud::ejecutarBusqueda()
{
    cola<<nodoInicial;

    while (!cola.empty()) {

        nodosExpandidos<<cola.first();
        cola.pop_front();
        cantidadNodosExpandidos++;

        if (nodosExpandidos.last()->esMeta()) {
            nodoSolucion=nodosExpandidos.last();
            return true;
        }else {
            QList <Nodo*> nodosExpandidosTemporales = nodosExpandidos.last()->expandir();
            Nodo *nodoExp;
            foreach (nodoExp, nodosExpandidosTemporales) {

                if(!esCiclo(nodoExp)){
                    cantidadNodosCreados++;
                    cola<<nodoExp;
                    if(nodoExp->getProfundidad() > profundidadArbol){
                        profundidadArbol = nodoExp->getProfundidad();
                    }
                }else{
                    delete nodoExp;
                    nodoExp = 0;
                }

            }

        }
    }

    return false;
}