예제 #1
0
    public void Reproduction(bool mutate = true)
    {
        List <DNA> reproducedDNAs = new List <DNA>();

        if (DNAList.Count < 2 && DNAList.Count > 0)   // if one is present, reproduce by itself and mutate
        {
            DNA reproducedDNA = new DNA(DNAList[0]);
            if (mutate && UnityEngine.Random.Range(0f, 1f) >= GeneticAlgorithm.instance.mutationRate)
            {
                reproducedDNA.Mutate();
            }
            reproducedDNAs.Add(reproducedDNA);
            DNAList.AddRange(reproducedDNAs);
            Debug.Log(".Added " + reproducedDNAs.Count + " Offsprings. [" + DNAList.Count + "/" + CreatureSpawner.instance.creaturesCount + "]");
        }
        else if (DNAList.Count >= 2)
        {
            for (int i = 0; i < DNAList.Count - 1; i++)
            {
                DNA        parent1DNA  = DNAList[i];
                DNA        parent2DNA  = DNAList[i + 1];
                List <DNA> crossedDNAs = parent1DNA.CrossoverBothWays(parent2DNA);
                foreach (DNA crossedDNA in crossedDNAs)
                {
                    crossedDNA.Mutate();
                }
                reproducedDNAs.AddRange(crossedDNAs);
            }
            DNAList.AddRange(reproducedDNAs);
            Debug.Log("Added " + reproducedDNAs.Count + " Offsprings. [" + DNAList.Count + "/" + CreatureSpawner.instance.creaturesCount + "]");
        }
    }