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