@@ -33,25 +33,15 @@ def evaluate(item: str, main_target: str) -> tuple[str, float]:
33
33
34
34
35
35
def crossover (parent_1 : str , parent_2 : str ) -> tuple [str , str ]:
36
- """
37
- Slice and combine two strings at a random point.
38
- >>> random.seed(42)
39
- >>> crossover("123456", "abcdef")
40
- ('12345f', 'abcde6')
41
- """
36
+ """Slice and combine two string at a random point."""
42
37
random_slice = random .randint (0 , len (parent_1 ) - 1 )
43
38
child_1 = parent_1 [:random_slice ] + parent_2 [random_slice :]
44
39
child_2 = parent_2 [:random_slice ] + parent_1 [random_slice :]
45
40
return (child_1 , child_2 )
46
41
47
42
48
43
def mutate (child : str , genes : list [str ]) -> str :
49
- """
50
- Mutate a random gene of a child with another one from the list.
51
- >>> random.seed(42)
52
- >>> mutate("123456", list("ABCDEF"))
53
- '123456'
54
- """
44
+ """Mutate a random gene of a child with another one from the list."""
55
45
child_list = list (child )
56
46
if random .uniform (0 , 1 ) < MUTATION_PROBABILITY :
57
47
child_list [random .randint (0 , len (child )) - 1 ] = random .choice (genes )
@@ -64,27 +54,19 @@ def select(
64
54
population_score : list [tuple [str , float ]],
65
55
genes : list [str ],
66
56
) -> list [str ]:
67
- """
68
- Select the second parent and generate new population.
69
- >>> random.seed(42)
70
- >>> select(("123456", 8), [("abcdef", 4), ("ghijkl", 5)], list("ABCDEF"))
71
- ['ghijkl', '1234B6']
72
- """
57
+ """Select the second parent and generate new population"""
73
58
pop = []
74
59
# Generate more children proportionally to the fitness score.
75
60
child_n = int (parent_1 [1 ] * 100 ) + 1
76
61
child_n = 10 if child_n >= 10 else child_n
77
62
for _ in range (child_n ):
78
- # Randomly select the second parent from the population.
79
- if population_score :
80
- parent_2 = random .choices (
81
- population_score , k = 1 , weights = [score for _ , score in population_score ]
82
- )[0 ][0 ]
83
- child_1 , child_2 = crossover (parent_1 [0 ], parent_2 )
84
- # Append new strings to the population list.
85
- pop .append (mutate (child_1 , genes ))
86
- pop .append (mutate (child_2 , genes ))
87
- return pop [:2 ] # Ensure population size does not exceed N_POPULATION
63
+ parent_2 = population_score [random .randint (0 , N_SELECTED )][0 ]
64
+
65
+ child_1 , child_2 = crossover (parent_1 [0 ], parent_2 )
66
+ # Append new string to the population list.
67
+ pop .append (mutate (child_1 , genes ))
68
+ pop .append (mutate (child_2 , genes ))
69
+ return pop
88
70
89
71
90
72
def basic (target : str , genes : list [str ], debug : bool = True ) -> tuple [int , int , str ]:
0 commit comments