// GDnD wiki example // Demonstrates: Population loop for a beginner Unity genetic algorithm // Related pages: [[genetic-algorithms]], [[overview-unity-nature-of-code-examples]] using UnityEngine; public class TextPopulationManager : MonoBehaviour { [SerializeField] private string target = "HELLO UNITY"; [SerializeField] private int populationSize = 100; [SerializeField, Range(0f, 0.2f)] private float mutationRate = 0.01f; private DNA[] population; private int generation; private void Start() { population = new DNA[populationSize]; for (int i = 0; i < population.Length; i++) population[i] = new DNA(target.Length); } private void Update() { EvolveOneGeneration(); } private void EvolveOneGeneration() { foreach (DNA dna in population) dna.Evaluate(target); DNA bestCurrent = GetBest(); DNA[] next = new DNA[population.Length]; for (int i = 0; i < next.Length; i++) { DNA parentA = PickParent(); DNA parentB = PickParent(); DNA child = parentA.Crossover(parentB); child.Mutate(mutationRate); next[i] = child; } population = next; generation++; Debug.Log($"Generation {generation}: {bestCurrent.Text}"); } private DNA PickParent() { float bestFitness = GetBest().Fitness; if (bestFitness <= 0f) return population[Random.Range(0, population.Length)]; while (true) { DNA candidate = population[Random.Range(0, population.Length)]; if (Random.value < candidate.Fitness) return candidate; } } private DNA GetBest() { DNA best = population[0]; for (int i = 1; i < population.Length; i++) if (population[i].Fitness > best.Fitness) best = population[i]; return best; } }