public void Mutation(IntArrayChromosomes intChromosomes, double mutationrate, List <int> _elitelist, int chromosomeMaxNumber) { Random random = new Random(); for (int i = 0; i < POPULATION; i++) { double rndnum = random.NextDouble(); if (rndnum <= mutationrate && !_elitelist.Contains <int>(i)) { intChromosomes.SetChromosome(i, random.Next(0, CHROMOSOMESIZE), random.Next(0, chromosomeMaxNumber)); } } }
// 染色体を初期状態にセットする public void SetUpChromosomes() { System.Random random = new System.Random(); for (int i = 0; i < POPULATION; i++) { for (int j = 0; j < CHROMOSOME_SIZE / 20; j++) { int rule = 0; for (int k = 0; k < MOORE_NEIGHBORHOOD; k++) { rule += random.Next(0, 2) * FastPower(CELL_STATE_SIZE, k); } rule += random.Next(0, CELL_STATE_SIZE) * FastPower(CELL_STATE_SIZE, MOORE_NEIGHBORHOOD); intArrayChromosomes.SetChromosome(i, j, rule); } } }
// 突然変異 public void Mutation(IntArrayChromosomes intChromosomes, double mutationrate, int chromosomeMaxNumber) { System.Random random = new System.Random(); for (int i = 0; i < POPULATION; i++) // Change { double rndnum = random.NextDouble(); if (rndnum <= mutationrate) { int startIndex = random.Next(0, (int)(CHROMOSOME_SIZE * (1 - MUTATION_RANGE))); for (int j = startIndex; j < startIndex + CHROMOSOME_SIZE * MUTATION_RANGE; j++) { intChromosomes.SetChromosome( i, random.Next(0, CHROMOSOME_SIZE), random.Next(0, chromosomeMaxNumber)); } } } }