예제 #1
0
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
예제 #2
0
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
예제 #3
0
    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")
예제 #4
0
    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]))
예제 #5
0
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
예제 #6
0
    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]))