def multiple_chromosome_n_point_crossover(random, mom, dad, args): children = MultipleChromosomeGenome(keys=mom.keys) for key in children.keys: children[key] = set_n_point_crossover(random, [mom[key], dad[key]], args) return children
def multiple_chromosome_set_generator(random, args): """ Generates a candidate in with a genome containing multiple chromosomes. Parameters ---------- random : Random args : dict this dictionary contains an extra key: "keys", which will be the names of the chromosomes. for each argument on <unique_set>, this dictionary must contain the same fields, starting with the values in "keys". Returns ------- MultipleChromosomeGenome """ keys = args.get('keys') candidate = MultipleChromosomeGenome(keys=keys) for key in keys: key_args = { 'representation': args.get("%s_representation" % key), 'max_size': args.get("%s_max_size" % key), 'variable_size': args.get('variable_size') } candidate[key] = set_generator(random, key_args) return candidate
def test_two_chromosomes(self): genome = MultipleChromosomeGenome(["A", "B"]) self.assertIsInstance(genome["A"], list) self.assertIsInstance(genome["B"], list) genome["A"] = [1, 2, 3, 4] genome["B"] = ["A", "B", "C"] self.assertEqual(genome["A"], OrderedSet([1, 2, 3, 4])) self.assertEqual(genome["B"], OrderedSet(["A", "B", "C"])) del genome["A"] self.assertRaises(KeyError, genome.__getitem__, "A")
def test_multiple_chromosome_set_mutation(self): genome = MultipleChromosomeGenome(["A", "B"]) genome["A"] = [1, 2, 3, 4] genome["B"] = [1, 5, 7, 10] representation = list(range(10)) args = { "A_representation": representation, "B_representation": representation, "A_mutation_rate": 1, "B_mutation_rate": 1 } new_individuals = multiple_chromosome_set_mutation(Random(SEED), [genome], args) self.assertEqual(new_individuals[0]["A"], OrderedSet([0, 6, 7, 8])) self.assertEqual(new_individuals[0]["B"], OrderedSet([0, 6, 8, 9]))
def multiple_chromosome_set_mutation(random, individual, args): """ Mutates a given set based on the entries available on the representation. Parameters ---------- random: Random individual: MultipleChromosomeGenome with unique integers in each chromosome args: dict must contain the representation of each chromosome Returns ------- MultipleChromosomeGenome A mutated individual """ new_individual = MultipleChromosomeGenome(keys=individual.keys) for key in individual.keys: representation = args.get('%s_representation' % key) indices = range(len(representation)) indices = _subtract( indices, individual[key] ) # remove indices already present in the individual mutation_rate = args.get('%s_mutation_rate' % key, .1) for value in individual[key]: if random.random() < mutation_rate and len(indices) > 0: index = random.sample(indices, 1)[0] indices.remove(index) new_individual[key].append(index) else: new_individual[key].append(value) assert len(new_individual[key]) == len(individual[key]) new_individual[key] = sorted(new_individual[key]) return new_individual
def test_multiple_chromosome_set_indel(self): genome = MultipleChromosomeGenome(["A", "B"]) genome["A"] = [1, 2, 3, 4] genome["B"] = [1, 5, 7, 10] representation = list(range(10)) args = { "A_representation": representation, "B_representation": representation, "A_indel_rate": 1, "B_indel_rate": 1 } random = Random(SEED) new_individuals = multiple_chromosome_set_indel(random, [genome for _ in range(5)], args) self.assertEqual(new_individuals[0]["A"], OrderedSet([1, 2, 3, 4, 7])) self.assertEqual(new_individuals[0]["B"], OrderedSet([1, 5, 10])) self.assertEqual(new_individuals[1]["A"], OrderedSet([2, 3, 4])) self.assertEqual(new_individuals[1]["B"], OrderedSet([1, 5, 7, 8, 10])) self.assertEqual(new_individuals[2]["A"], OrderedSet([1, 2, 3, 4, 6])) self.assertEqual(new_individuals[2]["B"], OrderedSet([1, 5, 7])) self.assertEqual(new_individuals[3]["A"], OrderedSet([1, 2, 3, 4, 8])) self.assertEqual(new_individuals[3]["B"], OrderedSet([0, 1, 5, 7, 10])) self.assertEqual(new_individuals[4]["A"], OrderedSet([1, 2, 3, 4, 7])) self.assertEqual(new_individuals[4]["B"], OrderedSet([1, 5, 7, 8, 10]))