public void Generation(Jugador[] jugadores, Comida[] comidas) { //Actualizar los fitness de la poblacion actual y correr una epoca evolutiva en la poblacion if (this.comidas != null && this.jugadores != null) //Generacion posterior a la primera { for (int i = 0; i < jugadores.Length; i++) ((gameChromosome)poblacion[i]).chromoFitness = this.jugadores[i].Fitness(); poblacion.RunEpoch(); } //Transformar la poblacion actual a redes neuronales controladoras for (int i = 0; i < poblacion.Size; i++) ChromosomeNetworkMapper.ChromosomeToNetwork((gameChromosome)poblacion[i], redes[i]); this.jugadores = jugadores; this.comidas = comidas; }
/// <summary> /// Aplica la salida de la red neuronal a cada jugador, /// modificando la direccion en la cual debe moverse. /// </summary> /// <param name="outputVector">Salida de la red neuronal que controla al jugador</param> /// <param name="j">Jugador para el cual se quiere modificar su cinematica</param> private void applyNetworkOutput(double[] outputVector, Jugador j) { //Preliminar, el codigo final esta sujeto a nuestra interpretacion de la salida y lo que esta modifica. float diffDireccionReal = ANGLE_DIFF; //Cambiar la direccion de acuerdo a la salida de la red. if (0.05 < Math.Abs(outputVector[1] - outputVector[0])) //Si hay duda no se voltea. { if (outputVector[0] > outputVector[1]) diffDireccionReal *= -1f; } else { diffDireccionReal = 0f; } //Enviar las ordenes de la red Neural al jugador. if (!RANDOM) j.controlar(outputVector[2] > MOVEMENT_THRESHOLD, diffDireccionReal); else j.controlar(rndMovControl.NextDouble() > 0d, 2f * (float)rndControl.NextDouble() - 1f); }
protected override void Initialize() { if (jugadores != null) foreach (Jugador j in jugadores) Components.Remove(j); if (comidas != null) foreach (Comida c in comidas) Components.Remove(c); //Al forzar el recolector de basura no importa hacer New aqui: rnd = new Random(); jugadores = new Jugador[JUGADORES]; comidas = new Comida[rnd.Next(COMIDA_MIN, COMIDA_MAX)]; //Inicializando los jugadores: for (int i = 0; i < jugadores.Length; i++) { jugadores[i] = new Jugador(this, rnd.Next(ESCENARIO.Left, ESCENARIO.Right), rnd.Next(ESCENARIO.Top, ESCENARIO.Bottom), TAMANO_JUGADOR); Components.Add(jugadores[i]); //Con esto se grafican y actualizan automaticamente. } //Inicializando la comida: for (int i = 0; i < comidas.Length; i++) { comidas[i] = new Comida(this, rnd.Next(ESCENARIO.Left, ESCENARIO.Right), rnd.Next(ESCENARIO.Top, ESCENARIO.Bottom), TAMANO_COMIDA); Components.Add(comidas[i]); } ia.Generation(jugadores, comidas); generacion++; base.Initialize(); //Se fuerza el recolector de basura: GC.Collect(); }