public Chromosome(Chromosome chromosomeToCopy) { _chromosomeData = new bool[chromosomeToCopy._chromosomeData.Length]; _isSynchronized = chromosomeToCopy._isSynchronized; _genes = new Gene[chromosomeToCopy.Genes.Length]; for(int i = 0; i < _genes.Length; ++i) _genes[i] = new Gene(chromosomeToCopy._genes[i]); Cook(); }
public Dictionary<string, float> GetDifferences(Chromosome chromosome) { Dictionary<string, float> results = new Dictionary<string,float>(); for(int i = 0; i < _genes.Length; ++i) { #if DEBUG if (Object.ReferenceEquals(_genes[i], chromosome._genes[i])) Debug.WriteLine("The two genes are the same reference!"); #endif float sub = chromosome._genes[i].Ratio - _genes[i].Ratio; if (sub != 0) results.Add("d - " + i + ": ", sub); } return results; }
public SpawnerGroup(Spawner[] spawners, SpawnType[] spawnTypes) { m_spawners = spawners; m_spawnTypes = spawnTypes; Gene[] genes = new Gene[spawners.Length]; for(int i = 0; i < m_spawners.Length; ++i) genes[i] = m_spawners[i].Gene; m_chromosome = new Chromosome(genes); float totalAppearanceRates = 0; for (int i = 0; i < spawnTypes.Length; ++i) totalAppearanceRates += m_spawnTypes[i].appearanceRate; m_spawnTypes[0].appearanceRate = m_spawnTypes[0].appearanceRate / totalAppearanceRates; for (int i = 1; i < spawnTypes.Length; ++i) m_spawnTypes[i].appearanceRate = m_spawnTypes[i].appearanceRate / totalAppearanceRates + m_spawnTypes[i - 1].appearanceRate; #if DEBUG string debugstring = "Ratios : "; for (int i = 0; i < spawnTypes.Length; ++i) debugstring += " " + m_spawnTypes[i].appearanceRate / totalAppearanceRates; #endif }
public void BuildFromParents(SpawnerGroup mum, SpawnerGroup dad) { if (mum == null || dad == null) return; m_chromosome = mum.m_chromosome.MakeChild(dad.m_chromosome, m_mutationsPerReproduction); m_chromosome.Mutate(m_mutationsPerReproduction); m_chromosome.Reheat(); for (int i = 0; i < m_spawners.Length; ++i) m_spawners[i].Gene = m_chromosome.Genes[i]; m_chromosome.PrintData(); }
protected Chromosome CrossOver(Chromosome mate) { if (mate.ChromosomeData.Length != _chromosomeData.Length) throw new InvalidOperationException("The two chromosomes must have the same length!"); Chromosome newChromosome = new Chromosome(this); int splitIndex = Globals.Random.Next(0, _chromosomeData.Length); bool[] newChromosomeData = new bool[_chromosomeData.Length]; for (int i = 0; i < newChromosomeData.Length; ++i) if (i < splitIndex) newChromosomeData[i] = _chromosomeData[i]; else newChromosomeData[i] = mate.ChromosomeData[i]; newChromosome.ChromosomeData = newChromosomeData; newChromosome.Reheat(); return newChromosome; }
//Used to generate children for child classes of the Chromosome class public Chromosome MakeChild(Chromosome mate, int mutationAmount) { Chromosome newChromosome = CrossOver(mate); for (int i = 0; i < mutationAmount; ++i) newChromosome.Mutate(); newChromosome.Reheat(); return newChromosome; }