/// <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); }
//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); }
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); }
/// <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); }
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); }