-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathsingle_point_crossover.py
More file actions
71 lines (54 loc) · 2.34 KB
/
single_point_crossover.py
File metadata and controls
71 lines (54 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from pygenalgo.genome.chromosome import Chromosome
from pygenalgo.operators.crossover.crossover_operator import CrossoverOperator
class SinglePointCrossover(CrossoverOperator):
"""
Description:
Single-point crossover creates two children chromosomes (offsprings),
by taking two parent chromosomes and cutting them at some, randomly
chosen, site (locus).
It produces very slow mixing, compared with multipoint or uniform crossover.
"""
def __init__(self, crossover_probability: float = 0.9) -> None:
"""
Construct a 'SinglePointCrossover' object with
a given probability value.
:param crossover_probability: (float).
"""
# Call the super constructor with the provided
# probability value.
super().__init__(crossover_probability)
# _end_def_
def crossover(self, parent1: Chromosome, parent2: Chromosome) -> tuple[Chromosome, Chromosome]:
"""
Perform the crossover operation on the two input parent chromosomes.
:param parent1: (Chromosome).
:param parent2: (Chromosome).
:return: child1 and child2 (as Chromosomes).
"""
# If the crossover probability is higher than a uniformly
# random value and the parents aren't identical apply the
# changes.
if (parent1 != parent2) and self.is_operator_applicable():
# Select randomly the crossover point.
locus: int = self.rng.integers(1, high=len(parent1), dtype=int)
# Construct 1st offspring genome list at locus.
genome_1 = [x.clone() for x in parent1.genome[:locus] +
parent2.genome[locus:]]
# Construct 2nd offspring genome list at locus.
genome_2 = [y.clone() for y in parent2.genome[:locus] +
parent1.genome[locus:]]
# Create two NEW offsprings.
child1 = Chromosome(genome_1)
child2 = Chromosome(genome_2)
# Increase the crossover counter.
self.inc_counter()
else:
# Otherwise each child will point
# to a deepcopy of a single parent.
child1 = parent1.clone()
child2 = parent2.clone()
# _end_if_
# Return the two offsprings.
return child1, child2
# _end_def_
# _end_class_