コード例 #1
0
        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);
        }
コード例 #2
0
        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();
        }
コード例 #3
0
ファイル: MainForm.cs プロジェクト: alexey-dev0/SnakeAI
 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));
     }
 }
コード例 #4
0
        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();
        }
コード例 #5
0
 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();
         }
     }
 }
コード例 #6
0
ファイル: MainForm.cs プロジェクト: alexey-dev0/SnakeAI
        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++;
        }