Ejemplo n.º 1
0
        public Bot(Maze maze, EngineSettings engineSettings, WallGrid walls, BrainFactory brainFactory, EyeFactory eyeFactory)
        {
            _maze = maze;
            _engineSettings = engineSettings;
            _walls = walls;
            _numEyes = engineSettings.BotEyes;
            _energyStep = 1.0;

            var neurons = _numEyes +
                          (engineSettings.ThinkDistance ? 1 : 0) +
                          (engineSettings.ThinkPath ? 5 : 0) +
                          (engineSettings.ThinkVelocity ? 3 : 0);

            Brain = brainFactory.Create(neurons, 2);
            _eyes = new Eye[_numEyes];
            Velocity = new Ray(new CoordD(0.5, 0.5), 0.0, engineSettings.BotSpeed);

            for (var i = 0; i < _numEyes; ++i)
            {
                var theta = i / (double)_numEyes * Consts.HalfTurn - Consts.QuarterTurn;
                _eyes[i] = eyeFactory.Create(Velocity.Origin, 2, 0, theta, 100);
            }

            Init(new CoordD(.5,.5));
        }
 /// <summary>
 /// Breeds two parent brains creating this as the new child.
 /// </summary>
 /// <param name="parentA">A parent brain.</param>
 /// <param name="parentB">A parent brain.</param>
 /// <param name="mutationRate">The rate of weights that are randomized instead of inherited.</param>
 public void Breed(Brain parentA, Brain parentB, double mutationRate)
 {
     for (var i = 0; i < _netSize.Length; ++i)
     {
         for (var j = 0; j < _largestLayer * _largestLayer; ++j)
         {
             if (_rand.NextDouble() <= mutationRate)
             {
                 _weights[i, j] = GenerateWeight();
             }
             else if (_rand.NextDouble() >= 0.5)
             {
                 _weights[i, j] = parentA.GetWeight(i, j);
             }
             else
             {
                 _weights[i, j] = parentB.GetWeight(i, j);
             }
         }
     }
 }