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