示例#1
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);
    }
示例#2
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);
    }
示例#3
0
    public static GenNEAT copiarGen(GenNEAT genACopiar)
    {
        GenNEAT salida = CreateInstance <GenNEAT>();

        salida.entrada    = genACopiar.entrada;
        salida.salida     = genACopiar.entrada;
        salida.peso       = genACopiar.peso;
        salida.habilitado = genACopiar.habilitado;
        salida.innovacion = genACopiar.innovacion;
        return(salida);
    }
示例#4
0
 /// <summary>
 /// Verifica si en una lista de genes, existe un gen que contiene un gen link
 /// </summary>
 /// <param name="genes">Lista de genes sobre la que se busca</param>
 /// <param name="link">gen link buscado</param>
 /// <returns></returns>
 public bool contieneLink(List <GenNEAT> genes, GenNEAT link)
 {
     foreach (GenNEAT gen in genes)
     {
         if (gen.salida == link.salida && gen.entrada == link.entrada)
         {
             return(true);
         }
     }
     return(false);
 }
示例#5
0
    public List <Neurona> RedBase(int maxNeuronas)
    {
        List <Neurona> neuronas = new List <Neurona>();

        maxNodos = maxNeuronas;
        //float[] entradas = vision.construirEntradas();
        for (int i = 0; i < tamanioEntrada; i++)
        {//inputs
            Neurona Aux = CreateInstance <Neurona>();
            Aux.idTipo = -1;
            neuronas.Add(Aux);
            maximoNeuronas = i;
        }
        posicionSalida = maximoNeuronas + 1;
        for (int o = 0; o < tamanioSalida; o++)
        {//outputs
            Neurona Aux = CreateInstance <Neurona>();
            Aux.idTipo = 1;
            neuronas.Add(Aux);
        }
        int count = 0;

        for (int i = 0; i < tamanioEntrada; i++)
        {
            for (int o = 0; o < tamanioSalida; o++)
            {
                GenNEAT nuevoGen = CreateInstance <GenNEAT>();

                nuevoGen.entrada = i;
                nuevoGen.salida  = posicionSalida + o;
                nuevoGen.peso    = Random.Range(-1f, 1f);

                nuevoGen.innovacion = count;
                count++;
                nuevoGen.habilitado = true;
                genes.Add(nuevoGen);
            }
        }
        // Debug.Log("Tamaño Genes:"+ genes.Count+"innovacion"+count);
        foreach (GenNEAT gen in genes)
        {
            neuronas[gen.salida].entrante.Add(gen);
        }

        //   Debug.Log(count + " Genes Generados");
        redNeural = neuronas;
        tamañoRed = neuronas.Count;
        return(neuronas);
    }