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