示例#1
0
    public List <Nodo> ResolverCamino(Vector3 posInicial, Vector3 posObjetivo)
    {
        Nodo nodoInicial  = grid.NodoDeUnPunto(posInicial);
        Nodo nodoObjetivo = grid.NodoDeUnPunto(posObjetivo);

        List <Nodo>    setAbiertos = new List <Nodo>();
        HashSet <Nodo> setCerrados = new HashSet <Nodo>();

        setAbiertos.Add(nodoInicial);
        while (setAbiertos.Count > 0)
        {
            Nodo nodoActual = setAbiertos[0];
            for (int i = 1; i < setAbiertos.Count; i++)
            {
                if (setAbiertos[i].costoF < nodoActual.costoF || setAbiertos[i].costoF == nodoActual.costoF && setAbiertos[i].costoH < nodoActual.costoH)  //siguiente posicion
                {
                    nodoActual = setAbiertos[i];
                }
            }
            setAbiertos.Remove(nodoActual);
            setCerrados.Add(nodoActual);
            if (nodoActual == nodoObjetivo)
            {
                rutaActual = trazarRuta(nodoInicial, nodoObjetivo);
                return(rutaActual); //camino encontrado
            }

            //En las siguientes lineas se asigna el set abiertos, los posibles nodos que pueden ocupar el camino
            foreach (Nodo vecino in grid.getNodosVecinos(nodoActual))
            {
                if (!vecino.walkable || setCerrados.Contains(vecino))
                {
                    continue;
                }
                int costoNuevoMovimientoAlVecino = nodoActual.costoG + getDistancia(nodoActual, vecino);
                if (costoNuevoMovimientoAlVecino < vecino.costoG || !setAbiertos.Contains(vecino))
                {
                    vecino.costoG    = costoNuevoMovimientoAlVecino;
                    vecino.costoH    = getDistancia(vecino, nodoObjetivo);
                    vecino.nodoPadre = nodoActual;
                    if (!setAbiertos.Contains(vecino))
                    {
                        setAbiertos.Add(vecino);
                    }
                }
            }
        }
        return(rutaActual);
    }
示例#2
0
    public Nodo EscogerCamino(Nodo nodoActual, HormigaAco hormiga)
    {
        double      ruleta  = Random.Range(0f, 1f);
        List <Nodo> vecinos = GrillaMundo.getNodosVecinos(nodoActual);

        double[] probabilidadLocal   = new double[vecinos.Count];
        double   probabilidadVecinos = 0.0;
        Nodo     nodoSiguiente       = null;
        int      indice = 0;

        foreach (Nodo vecino in vecinos)
        {
            if (vecino == nodoActual.nodoPadre)
            {
                indice++; continue;
            }
            probabilidadLocal[indice] = vecino.nivelDeFeromonas * getDistancia(nodoActual, vecino);
            probabilidadVecinos      += probabilidadLocal[indice];
            indice++;
        }
        indice = 0;
        //actualizar probabilidad de seleccion
        List <double> sum = new List <double>();

        foreach (Nodo vecino in vecinos)
        {
            if (vecino == nodoActual.nodoPadre)
            {
                indice++; continue;
            }
            probabilidadLocal[indice] = probabilidadLocal[indice] / probabilidadVecinos;
            indice++;
        }
        indice = 0;
        foreach (Nodo vecino in vecinos)
        {
            if (vecino == nodoActual.nodoPadre)
            {
                indice++; continue;
            }
            double suma = 0;
            for (int i = indice; i < probabilidadLocal.Length; i++)
            {
                suma += probabilidadLocal[i];
            }
            sum.Add(suma);
        }
        sum.Reverse();
        indice = 0;
        foreach (Nodo vecino in vecinos)
        {
            if (vecino == nodoActual.nodoPadre)
            {
                indice++; continue;
            }
            if (indice == 0)
            {
                if (ruleta <= sum[indice])
                {
                    nodoSiguiente           = vecino;
                    nodoSiguiente.nodoPadre = nodoActual;
                }
            }
            else if (ruleta > sum[indice - 1] && ruleta <= sum[indice])
            {
                nodoSiguiente           = vecino;
                nodoSiguiente.nodoPadre = nodoActual;
            }
            indice++;
        }
        if (nodoSiguiente == null)
        {
            bool apto = false;
            while (!apto)
            {
                int seleccion = Random.Range(0, vecinos.Count);
                nodoSiguiente = vecinos[seleccion];
                if (nodoSiguiente != nodoActual.nodoPadre && nodoSiguiente.walkable)
                {
                    apto = true;
                }
            }
        }
        return(nodoSiguiente);
    }