示例#1
0
 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;
 }
示例#2
0
 /// <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();
        }