Skip to content

Commit 2865a2c

Browse files
committed
More tests for NSGA-II
1 parent 210c345 commit 2865a2c

File tree

2 files changed

+94
-17
lines changed

2 files changed

+94
-17
lines changed

pygad/pygad.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -880,7 +880,7 @@ def __init__(self,
880880
self.select_parents = self.rank_selection
881881
else:
882882
self.valid_parameters = False
883-
raise TypeError(f"Undefined parent selection type: {parent_selection_type}. \nThe assigned value to the 'parent_selection_type' parameter does not refer to one of the supported parent selection techniques which are: \n-sss (for steady state selection)\n-rws (for roulette wheel selection)\n-sus (for stochastic universal selection)\n-rank (for rank selection)\n-random (for random selection)\n-tournament (for tournament selection).\n")
883+
raise TypeError(f"Undefined parent selection type: {parent_selection_type}. \nThe assigned value to the 'parent_selection_type' parameter does not refer to one of the supported parent selection techniques which are: \n-sss (steady state selection)\n-rws (roulette wheel selection)\n-sus (stochastic universal selection)\n-rank (rank selection)\n-random (random selection)\n-tournament (tournament selection)\n-tournament_nsga2: (Tournament selection for NSGA-II)\n-nsga2: (NSGA-II parent selection).\n")
884884

885885
# For tournament selection, validate the K value.
886886
if (parent_selection_type == "tournament"):

tests/test_number_fitness_function_calls.py

Lines changed: 93 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,33 @@
1414
def number_calls_fitness_function(keep_elitism=1,
1515
keep_parents=-1,
1616
mutation_type="random",
17-
mutation_percent_genes="default"):
17+
mutation_percent_genes="default",
18+
parent_selection_type='sss',
19+
multi_objective=False):
1820

1921
actual_num_fitness_calls = 0
20-
def fitness_func(ga, solution, idx):
22+
def fitness_func_no_batch_single(ga, solution, idx):
2123
nonlocal actual_num_fitness_calls
2224
actual_num_fitness_calls = actual_num_fitness_calls + 1
2325
return 1
2426

27+
def fitness_func_no_batch_multi(ga_instance, solution, solution_idx):
28+
nonlocal actual_num_fitness_calls
29+
actual_num_fitness_calls = actual_num_fitness_calls + 1
30+
return [1, 1]
31+
32+
if multi_objective == True:
33+
fitness_func = fitness_func_no_batch_multi
34+
else:
35+
fitness_func = fitness_func_no_batch_single
36+
2537
ga_optimizer = pygad.GA(num_generations=num_generations,
2638
sol_per_pop=sol_per_pop,
2739
num_genes=6,
2840
num_parents_mating=num_parents_mating,
2941
fitness_func=fitness_func,
3042
mutation_type=mutation_type,
43+
parent_selection_type=parent_selection_type,
3144
mutation_percent_genes=mutation_percent_genes,
3245
keep_elitism=keep_elitism,
3346
keep_parents=keep_parents,
@@ -64,46 +77,68 @@ def test_number_calls_fitness_function_default_keep():
6477
actual, expected = number_calls_fitness_function()
6578
assert actual == expected
6679

67-
def test_number_calls_fitness_function_no_keep():
80+
def test_number_calls_fitness_function_no_keep(multi_objective=False,
81+
parent_selection_type='sss'):
6882
actual, expected = number_calls_fitness_function(keep_elitism=0,
69-
keep_parents=0)
83+
keep_parents=0,
84+
parent_selection_type=parent_selection_type,
85+
multi_objective=multi_objective)
7086
assert actual == expected
7187

72-
def test_number_calls_fitness_function_keep_elitism():
88+
def test_number_calls_fitness_function_keep_elitism(multi_objective=False,
89+
parent_selection_type='sss'):
7390
actual, expected = number_calls_fitness_function(keep_elitism=3,
74-
keep_parents=0)
91+
keep_parents=0,
92+
parent_selection_type=parent_selection_type,
93+
multi_objective=multi_objective)
7594
assert actual == expected
7695

77-
def test_number_calls_fitness_function_keep_parents():
96+
def test_number_calls_fitness_function_keep_parents(multi_objective=False,
97+
parent_selection_type='sss'):
7898
actual, expected = number_calls_fitness_function(keep_elitism=0,
79-
keep_parents=4)
99+
keep_parents=4,
100+
parent_selection_type=parent_selection_type,
101+
multi_objective=multi_objective)
80102
assert actual == expected
81103

82-
def test_number_calls_fitness_function_both_keep():
104+
def test_number_calls_fitness_function_both_keep(multi_objective=False,
105+
parent_selection_type='sss'):
83106
actual, expected = number_calls_fitness_function(keep_elitism=3,
84-
keep_parents=4)
107+
keep_parents=4,
108+
parent_selection_type=parent_selection_type,
109+
multi_objective=multi_objective)
85110
assert actual == expected
86111

87-
def test_number_calls_fitness_function_no_keep_adaptive_mutation():
112+
def test_number_calls_fitness_function_no_keep_adaptive_mutation(multi_objective=False,
113+
parent_selection_type='sss'):
88114
actual, expected = number_calls_fitness_function(keep_elitism=0,
89115
keep_parents=0,
116+
parent_selection_type=parent_selection_type,
90117
mutation_type="adaptive",
91-
mutation_percent_genes=[10, 5])
118+
mutation_percent_genes=[10, 5],
119+
multi_objective=multi_objective)
92120
assert actual == expected
93121

94-
def test_number_calls_fitness_function_default_adaptive_mutation():
122+
def test_number_calls_fitness_function_default_adaptive_mutation(multi_objective=False,
123+
parent_selection_type='sss'):
95124
actual, expected = number_calls_fitness_function(mutation_type="adaptive",
96-
mutation_percent_genes=[10, 5])
125+
parent_selection_type=parent_selection_type,
126+
mutation_percent_genes=[10, 5],
127+
multi_objective=multi_objective)
97128
assert actual == expected
98129

99-
def test_number_calls_fitness_function_both_keep_adaptive_mutation():
130+
def test_number_calls_fitness_function_both_keep_adaptive_mutation(multi_objective=False,
131+
parent_selection_type='sss'):
100132
actual, expected = number_calls_fitness_function(keep_elitism=3,
101133
keep_parents=4,
134+
parent_selection_type=parent_selection_type,
102135
mutation_type="adaptive",
103-
mutation_percent_genes=[10, 5])
136+
mutation_percent_genes=[10, 5],
137+
multi_objective=multi_objective)
104138
assert actual == expected
105139

106140
if __name__ == "__main__":
141+
#### Single-objective
107142
print()
108143
test_number_calls_fitness_function_default_keep()
109144
print()
@@ -121,3 +156,45 @@ def test_number_calls_fitness_function_both_keep_adaptive_mutation():
121156
print()
122157
test_number_calls_fitness_function_both_keep_adaptive_mutation()
123158
print()
159+
160+
#### Multi-Objective
161+
print()
162+
test_number_calls_fitness_function_no_keep(multi_objective=True)
163+
print()
164+
test_number_calls_fitness_function_keep_elitism(multi_objective=True)
165+
print()
166+
test_number_calls_fitness_function_keep_parents(multi_objective=True)
167+
print()
168+
test_number_calls_fitness_function_both_keep(multi_objective=True)
169+
print()
170+
test_number_calls_fitness_function_no_keep_adaptive_mutation(multi_objective=True)
171+
print()
172+
test_number_calls_fitness_function_default_adaptive_mutation(multi_objective=True)
173+
print()
174+
test_number_calls_fitness_function_both_keep_adaptive_mutation(multi_objective=True)
175+
print()
176+
177+
#### Multi-Objective NSGA-II Parent Selection
178+
print()
179+
test_number_calls_fitness_function_no_keep(multi_objective=True,
180+
parent_selection_type='nsga2')
181+
print()
182+
test_number_calls_fitness_function_keep_elitism(multi_objective=True,
183+
parent_selection_type='nsga2')
184+
print()
185+
test_number_calls_fitness_function_keep_parents(multi_objective=True,
186+
parent_selection_type='nsga2')
187+
print()
188+
test_number_calls_fitness_function_both_keep(multi_objective=True,
189+
parent_selection_type='nsga2')
190+
print()
191+
test_number_calls_fitness_function_no_keep_adaptive_mutation(multi_objective=True,
192+
parent_selection_type='nsga2')
193+
print()
194+
test_number_calls_fitness_function_default_adaptive_mutation(multi_objective=True,
195+
parent_selection_type='nsga2')
196+
print()
197+
test_number_calls_fitness_function_both_keep_adaptive_mutation(multi_objective=True,
198+
parent_selection_type='nsga2')
199+
print()
200+

0 commit comments

Comments
 (0)