public NeuroNetwork Copy() { var hidden = new List <int>(); for (int i = 0; i < HiddenLayers.Count; i++) { hidden.Add(HiddenLayers[i].Count); } var result = new NeuroNetwork(Inputs.Count, hidden, Outputs.Count, Memory.Count, false); for (int i = 0; i < Inputs.Count; i++) { result.Inputs.Add(Inputs[i].Copy()); } for (int i = 0; i < Memory.Count; i++) { result.Memory.Add(Memory[i].Copy()); } for (int i = 0; i < hidden.Count; i++) { for (int j = 0; j < hidden[i]; j++) { result.HiddenLayers[i].Add(HiddenLayers[i][j].Copy()); } } for (int i = 0; i < Outputs.Count; i++) { result.Outputs.Add(Outputs[i].Copy()); } result.Color = Color; return(result); }
public void Update() { if (Dead) { return; } NeuroNetwork.Update(GetInputsNew()); var rotRight = NeuroNetwork.Outputs[0].Value; var rotLeft = NeuroNetwork.Outputs[1].Value; var turn = 0; if (rotRight > 0.4) { Rotate(1); turn = 1; } if (rotLeft > 0.4) { Rotate(-1); turn = -1; } for (int i = 1; i < lastTurns.Count; i++) { lastTurns[i] = lastTurns[i - 1]; } lastTurns[0] = turn; Move(); }
private void InitSnakes() { for (int i = 0; i < populationCount; i++) { fields.Add(new Field(fieldSize, fieldSize, i * (int)DateTime.Now.Ticks)); var neuroNetwork = new NeuroNetwork(snakeInputs, hiddenLayersConfig[StaticRandom.Next(hiddenLayersConfig.Count)], snakeOutputs, snakeMemory); population.Add(new Snake(fields[i], neuroNetwork)); } }
public Snake(Field field, NeuroNetwork neuroNetwork) { Field = field; field.Snake = this; NeuroNetwork = neuroNetwork; neuroNetwork.Snake = this; body = new List <Point>(); Energy = 50; Rotation = StaticRandom.Next(4); lastTurns = new List <double> { 0, 0, 0 }; Initialize(); }
public void Cross(NeuroNetwork other) { for (int i = 0; i < HiddenLayers.Count; i++) { for (int j = 0; j < HiddenLayers[i].Count; j++) { if (StaticRandom.NextDouble() > 0.5) { HiddenLayers[i][j] = other.HiddenLayers[i][j].Copy(); } } } for (int j = 0; j < Outputs.Count; j++) { if (StaticRandom.NextDouble() > 0.5) { Outputs[j] = other.Outputs[j].Copy(); } } }
private void CreatePopulation() { dead.Sort(new SnakeComparer()); dead.Reverse(); if (topSnake == null || dead[0].Fitness > topSnake.Fitness) { topSnake2 = topSnake; topSnake = dead[0]; } if (topSnake2 == null) { topSnake2 = dead[1]; } scores["maxFitness"] = Math.Max(scores["maxFitness"], dead[0].Fitness); scores["lastFitness"] = dead[0].Fitness; if (dead[0].Fitness == 0) { throw new Exception(); } var fieldCount = 0; /*for (int i = 0; i < populationCount * 0.0; i++) * { * var neuroNetwork = dead[0].NeuroNetwork.Copy(); * neuroNetwork.NeuroShake(shakeRate); * population.Add(new Snake(fields[fieldCount], neuroNetwork)); * fieldCount++; * }*/ for (int i = 0; i < populationCount * 0.3; i++) { var neuroNetwork = topSnake.NeuroNetwork.Copy(); neuroNetwork.Cross(dead[0].NeuroNetwork); neuroNetwork.NeuroShake(shakeRate); population.Add(new Snake(fields[fieldCount], neuroNetwork)); fieldCount++; } for (int i = 0; i < populationCount * 0.3; i++) { var neuroNetwork = topSnake.NeuroNetwork.Copy(); neuroNetwork.NeuroShake(shakeRate); population.Add(new Snake(fields[fieldCount], neuroNetwork)); fieldCount++; } for (int i = 0; i < populationCount * 0.2; i++) { var neuroNetwork = topSnake2.NeuroNetwork.Copy(); neuroNetwork.NeuroShake(shakeRate); population.Add(new Snake(fields[fieldCount], neuroNetwork)); fieldCount++; } for (int i = 0; i < populationCount * 0.2; i++) { var neuroNetwork = new NeuroNetwork(snakeInputs, hiddenLayersConfig[StaticRandom.Next(hiddenLayersConfig.Count)], snakeOutputs, snakeMemory); population.Add(new Snake(fields[fieldCount], neuroNetwork)); fieldCount++; } foreach (var field in fields) { field.ReviewFood(); } dead.Clear(); populationNumber++; }