Пример #1
0
    /// <summary>
    /// añade cromosomas al set de especies
    /// </summary>
    /// <param name="cromosoma"></param>
    public void aniadirAEspecies(GenomaNEAT cromosoma)
    {
        bool especieEncontrada = false;
        int  especieID         = 0;

        if (especies != null)
        {
            for (int i = 0; i < especies.Count; i++)
            {
                if (especies[i] != null)
                {
                    List <GenomaNEAT> especieAux = especies[i];

                    if (!especieEncontrada && mismaEspecie(cromosoma, especieAux[0]))
                    {
                        cromosoma.setNumEspecie(i);
                        especies[i].Add(cromosoma);
                    }
                }
            }
            especieID = especies.Count;
        }
        else
        {
            especieID++;
        }

        if (!especieEncontrada)
        {
            List <GenomaNEAT> especie = new List <GenomaNEAT>();
            cromosoma.setNumEspecie(especies.Count);
            especie.Add(cromosoma);
            especies.Add(especie);
        }
    }
Пример #2
0
    /// <summary>
    /// Revision por estructura, computacionalmente costosa
    /// </summary>
    /// <param name="cromosoma1"></param>
    /// <param name="cromosoma2"></param>
    /// <returns></returns>
    public bool mismaEspecie(GenomaNEAT cromosoma1, GenomaNEAT cromosoma2)
    {
        float VaricionDesunion = DeltaDesconexion * disjunciones(cromosoma1.genes, cromosoma2.genes);
        float variacionPeso    = deltaPeso * Pesos(cromosoma1.genes, cromosoma2.genes);

        return(VaricionDesunion + variacionPeso < DeltaLimite);
    }
Пример #3
0
    /// <summary>
    /// Toma un cromosoma y realiza una mutacion de nodo, añadiendo una nueva neurona a la red
    /// </summary>
    /// <param name="cromosoma">Es la estructura que representa 1 individuo de la poblacion</param>
    public void mutarNodo(GenomaNEAT cromosoma)
    {
        if (cromosoma.genes.Count == 0)
        {
            return;
        }
        cromosoma.maximoNeuronas++;
        GenNEAT gen = cromosoma.genes[Random.Range(1, cromosoma.genes.Count - 1)];

        if (!gen.habilitado)
        {
            return;
        }
        gen.habilitado = false;
        GenNEAT gen1 = GenNEAT.copiarGen(gen);

        gen1.salida     = cromosoma.maximoNeuronas;
        gen1.peso       = Random.Range(-1f, 1f);
        gen1.innovacion = cromosoma.genes.Count;
        gen1.habilitado = true;
        cromosoma.genes.Add(gen1);


        GenNEAT gen2 = GenNEAT.copiarGen(gen);

        gen1.entrada    = cromosoma.maximoNeuronas;
        gen2.innovacion = cromosoma.genes.Count;
        gen2.habilitado = true;
        cromosoma.genes.Add(gen2);
    }
Пример #4
0
    //mutaciones especiales

    /// <summary>
    /// Toma un cromosoma y crea una mutacion, que añade un link entre neuronas
    /// </summary>
    /// <param name="cromosoma">Es la estructura que representa 1 individuo de la poblacion</param>
    /// <param name="forzarBias">Forzar conexion, para el nodo BIAS(sesgo),nodo que se conecta a toda la red neuronal</param>
    public void mutarLink(GenomaNEAT cromosoma, bool forzarBias)
    {
        int     neuro1 = Random.Range(0, tamañoEntradas);
        int     neuro2 = Random.Range(tamañoEntradas, cromosoma.tamañoRed);
        GenNEAT link   = ScriptableObject.CreateInstance <GenNEAT>();

        if (neuro1 <= tamañoEntradas && neuro2 <= tamañoEntradas)
        {
            return;
        }
        if (neuro2 <= tamañoEntradas)
        {
            int temp = neuro1;
            neuro1 = neuro2;
            neuro2 = temp;
        }
        link.entrada = neuro1;
        link.salida  = neuro2;
        if (forzarBias)
        {
            link.entrada = tamañoEntradas;
        }
        if (contieneLink(cromosoma.genes, link))
        {
            return;
        }
        link.innovacion = cromosoma.genes.Count;
        link.peso       = Random.Range(-1.0f, 1.0f);
        cromosoma.genes.Add(link);
    }
Пример #5
0
 public void setRed(GenomaNEAT nuevaRed)
 {
     redNeural        = nuevaRed;
     redNeural.vision = DeteccionDeEntorno;
     redNeural.GenerarRed(evolutivo.maximoNeuronas);
     DeteccionDeEntorno.transform.SetParent(companion.transform);
     //Debug.Log("Ha jugar!");
     InvokeRepeating("Jugar", 0.2f, 0.2f);
 }
Пример #6
0
    /// <summary>
    /// Devuelve el indice que identifica una neurona
    /// </summary>
    /// <param name="cromosoma"></param>
    /// <param name="NoInput"></param>
    /// <returns></returns>
    public int neuroAleatorio(GenomaNEAT cromosoma, bool NoInput)
    {
        List <bool> neurona = new List <bool>();

        neurona.Capacity = cromosoma.tamañoRed;
        for (int i = 0; i < neurona.Capacity; i++)
        {
            neurona.Add(false);
        }
        if (!NoInput)
        {
            for (int i = 0; i < tamañoEntradas; i++)
            {
                neurona[i] = true;
            }
        }
        for (int o = tamañoEntradas; o < (tamañoEntradas + tamañoSalidas); o++)
        {
            neurona[o] = true;
        }
        foreach (GenNEAT gen in cromosoma.genes)
        {
            if (!NoInput || gen.entrada > tamañoEntradas)
            {
                neurona[gen.entrada] = true;
            }
            if (!NoInput || gen.salida > tamañoEntradas)
            {
                neurona[gen.salida] = true;
            }
        }
        int n = Random.Range(0, neurona.Count);
        int k = 0;

        foreach (bool valor in neurona)
        {
            n--;
            k++;
            if (n == 0)
            {
                return(k);
            }
        }


        return(0);
    }
Пример #7
0
 void Start()
 {
     ambientes = GameObject.FindGameObjectWithTag("Ambiente");
     for (int i = 0; i < ambientes.transform.childCount; i++)
     {
         companionEvolutivo = BusquedaHijos.buscarHijoPorTag(ambientes.transform.GetChild(i).gameObject, "Companion").GetComponent <CompanionEvolutivo>();
         //Debug.Log("numero inviduo: "+ numeroIndividuo);
         GenomaNEAT aux = poblacion[numeroIndividuo];
         companionEvolutivo.individuo = numeroIndividuo;
         companionEvolutivo.setRed(aux);
         tiempoDePrueba = tiempoPruebaOriginal;
         numeroIndividuo++;
         AmbienteEvolutivo ambienteLocal = ambientes.transform.GetChild(i).GetComponent <AmbienteEvolutivo>();
         ambienteLocal.tiempoPruebaOriginal = tiempoPruebaOriginal;
         ambienteLocal.tiempoDePrueba       = tiempoPruebaOriginal;
         ambienteLocal.listo = true;
     }
     companionEvolutivo = GameObject.FindGameObjectWithTag("Companion").GetComponent <CompanionEvolutivo>();
 }
Пример #8
0
    /// <summary>
    /// Toma un cromsoma y  un valor de habilitacion, y muta las posibilidades de conexion
    /// </summary>
    /// <param name="cromosoma">Es la estructura que representa 1 individuo de la poblacion</param>
    /// <param name="habilitar">habilita las conexion negando la entrada</param>
    public void MutarHabilitarDesHab(GenomaNEAT cromosoma, bool habilitar)
    {
        List <GenNEAT> candidatos = new List <GenNEAT>();;

        foreach (GenNEAT gen in cromosoma.genes)
        {
            if (gen.habilitado != habilitar)
            {
                candidatos.Add(gen);
            }
        }
        if (candidatos.Count == 0)
        {
            return;
        }
        int indice = Random.Range(0, (candidatos.Count - 1));

        candidatos[indice].habilitado = !candidatos[indice].habilitado;
    }
Пример #9
0
 /// <summary>
 /// toma un cromosoma y muta los pesos de la red neuronal actual
 /// </summary>
 /// <param name="cromosoma">Es la estructura que representa 1 individuo de la poblacion</param>
 public void mutarPesos(GenomaNEAT cromosoma)
 {
     foreach (GenNEAT gen in cromosoma.genes)
     {
         float probabilidad = Random.Range(0.0f, 1.0f);
         if (probabilidad < tasaMutacion)
         {
             gen.peso = Random.Range(-1f, 1f);
             if (gen.peso > 1f)
             {
                 gen.peso = 1f;
             }
             if (gen.peso < -1f)
             {
                 gen.peso = -1f;
             }
         }
     }
 }
Пример #10
0
    public GenomaNEAT cruceGenoma(GenomaNEAT cromosoma1, GenomaNEAT cromosoma2)
    {
        List <GenNEAT> innovaciones2 = new List <GenNEAT>();
        GenomaNEAT     hijo          = ScriptableObject.CreateInstance <GenomaNEAT>();

        if (cromosoma1.fitness > cromosoma2.fitness)
        {
            GenomaNEAT tempg = cromosoma1;
            cromosoma1 = cromosoma2;
            cromosoma2 = tempg;
        }
        foreach (GenNEAT gen in cromosoma2.genes)
        {
            innovaciones2.Add(gen);
        }
        foreach (GenNEAT gen in cromosoma1.genes)
        {
            GenNEAT otroGen;
            if (gen.innovacion < innovaciones2.Count)
            {
                otroGen = innovaciones2[gen.innovacion];
            }
            else
            {
                //Debug.Log("otro gen");
                otroGen = gen;
            }
            if (otroGen != null && Random.Range(1, 2) == 1 && otroGen.habilitado)
            {
                hijo.genes.Add(otroGen);
            }
            else
            {
                hijo.genes.Add(gen);
            }
        }
        hijo.maximoNeuronas = Mathf.Max(cromosoma1.maximoNeuronas, cromosoma2.maximoNeuronas);

        return(hijo);
    }
Пример #11
0
    /*public void cruce() {
     *  float mutar;
     *  float[] hijo1 = new float[5];
     *  float[] hijo2 = new float[5];
     *  List<float[]> hijos = new List<float[]>();
     *  for (int i = 0; i < matingPool.Count; i = i + 2)
     *  {
     *      hijo1[0] = matingPool[i][0];
     *      hijo1[1] = matingPool[i+1][1];
     *      hijo1[2] = matingPool[i][2];
     *      hijo1[3] = matingPool[i+1][3];
     *      hijo1[4] = matingPool[i][4];
     *      mutar = Random.value;
     *      //Debug.Log(mutar);
     *      if (mutar <= tasaMutacion) {
     *          hijo1=mutacion(hijo1);
     *      }
     *
     *      hijo2[0] = matingPool[i+1][0];
     *      hijo2[1] = matingPool[i][1];
     *      hijo2[2] = matingPool[i+1][2];
     *      hijo2[3] = matingPool[i][3];
     *      hijo2[4] = matingPool[i+1][4];
     *      mutar = Random.value;
     *      if (mutar <= tasaMutacion)
     *      {
     *          hijo2=mutacion(hijo2);
     *      }
     *      hijos.Add(hijo1);
     *      hijos.Add(hijo2);
     *  }
     *  poblacion.Clear();
     * // Debug.Log("# poblacion " + poblacion.Count);
     * /*   foreach (float[] cromosoma in matingPool) {
     *      poblacion.Add(cromosoma);
     *  }
     *  foreach (float[] cromosoma in hijos) {
     *      poblacion.Add(cromosoma);
     *  }*/
    /*    matingPool.Clear();
     * //  Debug.Log("# poblacion " + poblacion.Count +"Mating pool "+matingPool.Count);
     *  numeroGeneracion++;
     *
     *  numeroIndividuo = 0;
     * }*/


    private GenomaNEAT mutacion(GenomaNEAT cromosoma)
    {
        int muto     = 0;
        int posicion = Random.Range(0, 1);

        if (Random.Range(0f, 1f) < tasaMutacion)  //conexiones
        {
            mutarPesos(cromosoma);
            muto++;
        }
        if (Random.Range(0f, 1f) < tasaMutacion) //Link
        {
            mutarLink(cromosoma, false);
            muto++;
        }
        if (Random.Range(0f, 1f) < tasaMutacion) //Bias
        {
            mutarLink(cromosoma, true);
            muto++;
        }
        if (Random.Range(0f, 1f) < tasaMutacion)//node
        {
            mutarNodo(cromosoma);
            muto++;
        }
        if (Random.Range(0f, 1f) < tasaMutacion)//enable
        {
            MutarHabilitarDesHab(cromosoma, true);
            muto++;
        }
        if (Random.Range(0f, 1f) < tasaMutacion)//enable
        {
            MutarHabilitarDesHab(cromosoma, false);
            muto++;
        }
        //Debug.Log("No. Mutacion:"+muto);
        return(cromosoma);
    }
Пример #12
0
    public GenomaNEAT cruceEspecie(List <GenomaNEAT> especie)
    {
        GenomaNEAT hijo = ScriptableObject.CreateInstance <GenomaNEAT>();

        if (Random.Range(0f, 1f) < probabilidadCruce)
        {
            int seleccion  = Random.Range(0, especie.Count - 1);
            int seleccion2 = Random.Range(0, especie.Count - 1);
            //Debug.Log("Cant. Especies" + especie.Count+"Especie1: "+seleccion+" Especie2: "+seleccion2);
            GenomaNEAT genoma1 = especie[seleccion];
            GenomaNEAT genoma2 = especie[seleccion2];
            hijo = cruceGenoma(genoma1, genoma2);
        }
        else
        {
            int seleccion = Random.Range(0, especie.Count - 1);
            //Debug.Log("Cant. Especies" + especie.Count+" Especie1: " + seleccion);
            GenomaNEAT genoma1 = especie[seleccion];
            hijo = genoma1;
        }
        mutacion(hijo);

        return(hijo);
    }
Пример #13
0
    void Update()
    {
        UIManager.generacion = numeroGeneracion;
        UIManager.individuo  = numeroIndividuo + 1;
        UIManager.especie    = numeroEspecie;

        if (companionEvolutivo == null && numeroIndividuo < tamanioPoblacion && ambientes == null)///si el de cada ambiente

        /*companionEvolutivo = GameObject.FindGameObjectWithTag("Companion").GetComponent<CompanionEvolutivo>();
         * companionEvolutivo.setRed(poblacion[numeroIndividuo]);
         * companionEvolutivo.setNumeroIndividuo(numeroIndividuo);
         * // companionEvolutivo.GenerarRed(maximoNeuronas);*/
        {
            ambientes = GameObject.FindGameObjectWithTag("Ambiente");
            for (int i = 0; i < ambientes.transform.childCount; i++)
            {
                companionEvolutivo = BusquedaHijos.buscarHijoPorTag(ambientes.transform.GetChild(i).gameObject, "Companion").GetComponent <CompanionEvolutivo>();
                // Debug.Log("numero inviduo: " + numeroIndividuo);
                GenomaNEAT aux = poblacion[numeroIndividuo];
                companionEvolutivo.individuo = numeroIndividuo;
                companionEvolutivo.setRed(aux);
                tiempoDePrueba = tiempoPruebaOriginal;
                numeroIndividuo++;
                AmbienteEvolutivo ambienteLocal = ambientes.transform.GetChild(i).GetComponent <AmbienteEvolutivo>();
                ambienteLocal.tiempoPruebaOriginal = tiempoPruebaOriginal;
                ambienteLocal.tiempoDePrueba       = tiempoPruebaOriginal;
                ambienteLocal.listo = true;
            }
            companionEvolutivo = GameObject.FindGameObjectWithTag("Companion").GetComponent <CompanionEvolutivo>();
        }


        if (numeroIndividuo >= tamanioPoblacion && ambientes.GetComponent <Gimnasio>().Termino())
        {
            //Debug.Log("Siguiente paso");
            calificar();
            seleccion();
            List <GenomaNEAT> nuevaPoblacion = new List <GenomaNEAT>();
            foreach (List <GenomaNEAT> especie in especies)
            {
                nuevaPoblacion.Add(cruceEspecie(especie));
            }
            while (nuevaPoblacion.Count < tamanioPoblacion)
            {
                int seleccion = Random.Range(0, especies.Count - 1);
                //Debug.Log("Especies: " + especies.Count + " Seleccion: " + seleccion);
                nuevaPoblacion.Add(cruceEspecie(especies[seleccion]));
            }
            especies = new List <List <GenomaNEAT> >();
            foreach (GenomaNEAT hijo in nuevaPoblacion)
            {
                aniadirAEspecies(hijo);
            }
            numeroGeneracion++;
            numeroIndividuo = 0;
            Debug.Log(estadoPoblacion());
            poblacion = nuevaPoblacion;
            //aniadirAEspecies(todos)
            // ambientes.GetComponent<Gimnasio>().RecargarTodo();
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
            // Debug.Log("Siguiente paso 2");
        }
    }