public Population(int count)
 {
     Generation = 0;
     Players    = new  List <PopulationItem> ();
     for (int i = 0; i < count; i++)
     {
         var item = new PopulationItem();
         item.Player = AIGeneticPlayer.CreateRandom();
         Players.Add(item);
     }
 }
    private IEnumerator RunningGeneration(int generationsCount)
    {
        for (int generationInd = 0; generationInd < generationsCount; generationInd++)
        {
            Thread thread = new Thread(new ThreadStart(() => {
                PlayGeneration(_population.Players, GamesPerPlayer, (maxScores, averageScores, model) => {
                    for (int i = 0; i < _population.Players.Count; i++)
                    {
                        _population.Players[i].MaxScore     = maxScores[i];
                        _population.Players[i].AverageScore = averageScores[i];
                        _bestGamePlayerModel = model;
                    }
                });
            }));
            thread.Start();
            while (thread.IsAlive)
            {
                yield return(new WaitForEndOfFrame());
            }
            _population.Generation++;

            _population.Players.Sort((player1, player2) => {
                return(player1.AverageScore.CompareTo(player2.AverageScore));
            });

            // Remove worst genes.
            int DeathCount = Mathf.RoundToInt(DeathRate * _population.Players.Count);
            for (int i = 0; i < DeathCount; i++)
            {
                _population.Players.RemoveAt(0);
            }

            // Add best genes.
            int ReproductiveCount = Mathf.RoundToInt(ReproductivePercent * _population.Players.Count);
            for (int i = 0; i < DeathCount; i++)
            {
                int             parent1Ind = _population.Players.Count - UnityEngine.Random.Range(0, ReproductiveCount) - 1;
                int             parent2Ind = _population.Players.Count - UnityEngine.Random.Range(0, ReproductiveCount) - 1;
                AIGeneticPlayer child      = AIGeneticPlayer.CreateFromCrossover(_population.Players[parent1Ind].Player, _population.Players[parent2Ind].Player);
                PopulationItem  childItem  = new PopulationItem();
                childItem.Player = child;
                _population.Players.Insert(0, childItem);
            }
            UpdateView();
        }
    }