using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.UI; using Random = UnityEngine.Random; public class EvolutionController : MonoBehaviour { public int generationTimeInSeconds; public int populationSize; public GameObject agentPrefab; public Transform target; public Text informationText; public Slider timeSlider; private int _currentGeneration; private List _agents; private float _startTime; private float _lastScore; private void Start() { _agents = new List(); StartGeneration(); } private void Update() { if (_agents.Count == 0) return; if (Time.time - _startTime > generationTimeInSeconds) { _startTime = Time.time; StartGeneration(); } _agents.Sort((agent, agent1) => agent1.Network.CompareTo(agent.Network)); informationText.text = $"Generation: {_currentGeneration}\n" + $"Time: {(Time.time - _startTime).ToString("F1")}\n" + $"Population: {_agents.Count}\n" + $"Time scale: {Time.timeScale}\n" + $"Score: {_agents[0].Network.GetScore()}\n" + $"Last score: {_lastScore}"; } private void StartGeneration() { for (int i = 0; i < transform.childCount; i++) { Destroy(transform.GetChild(i).gameObject); } NeuralNetwork bestNetwork = null; if (_currentGeneration > 0) { _agents.Sort((agent, agent1) => agent1.Network.CompareTo(agent.Network)); bestNetwork = _agents[0].Network; _lastScore = bestNetwork.GetScore(); } target.position = new Vector2(Random.Range(-10, 10), Random.Range(-5, 5)); _agents.Clear(); for (int i = 0; i < populationSize; i++) { GameObject agent = Instantiate(agentPrefab, Vector3.zero, Quaternion.identity); agent.transform.SetParent(transform); Agent agentController = agent.AddComponent(); agentController.Initialize(target, bestNetwork); _agents.Add(agentController); } _currentGeneration++; } public void ChangeTimeMultipler() { Time.timeScale = timeSlider.value; } }