forked from ahmedfgad/GeneticAlgorithmPython
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_number_fitness_function_calls.py
121 lines (105 loc) · 5.56 KB
/
test_number_fitness_function_calls.py
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import pygad
actual_num_fitness_calls_default_keep = 0
actual_num_fitness_calls_no_keep = 0
actual_num_fitness_calls_keep_elitism = 0
actual_num_fitness_calls_keep_parents = 0
num_generations = 100
sol_per_pop = 10
num_parents_mating = 5
def number_calls_fitness_function(keep_elitism=1,
keep_parents=-1,
mutation_type="random",
mutation_percent_genes="default"):
actual_num_fitness_calls = 0
def fitness_func(ga, solution, idx):
nonlocal actual_num_fitness_calls
actual_num_fitness_calls = actual_num_fitness_calls + 1
return 1
ga_optimizer = pygad.GA(num_generations=num_generations,
sol_per_pop=sol_per_pop,
num_genes=6,
num_parents_mating=num_parents_mating,
fitness_func=fitness_func,
mutation_type=mutation_type,
mutation_percent_genes=mutation_percent_genes,
keep_elitism=keep_elitism,
keep_parents=keep_parents,
suppress_warnings=True)
ga_optimizer.run()
if keep_elitism == 0:
if keep_parents == 0:
# 10 (for initial population) + 100*10 (for other generations) = 1010
expected_num_fitness_calls = sol_per_pop + num_generations * sol_per_pop
if mutation_type == "adaptive":
expected_num_fitness_calls += num_generations * sol_per_pop
elif keep_parents == -1:
# 10 (for initial population) + 100*num_parents_mating (for other generations)
expected_num_fitness_calls = sol_per_pop + num_generations * (sol_per_pop - num_parents_mating)
if mutation_type == "adaptive":
expected_num_fitness_calls += num_generations * (sol_per_pop - num_parents_mating)
else:
# 10 (for initial population) + 100*keep_parents (for other generations)
expected_num_fitness_calls = sol_per_pop + num_generations * (sol_per_pop - keep_parents)
if mutation_type == "adaptive":
expected_num_fitness_calls += num_generations * (sol_per_pop - keep_parents)
else:
# 10 (for initial population) + 100*keep_elitism (for other generations)
expected_num_fitness_calls = sol_per_pop + num_generations * (sol_per_pop - keep_elitism)
if mutation_type == "adaptive":
expected_num_fitness_calls += num_generations * (sol_per_pop - keep_elitism)
print("Expected number of fitness function calls is {expected_num_fitness_calls}.".format(expected_num_fitness_calls=expected_num_fitness_calls))
print("Actual number of fitness function calls is {actual_num_fitness_calls}.".format(actual_num_fitness_calls=actual_num_fitness_calls))
return actual_num_fitness_calls, expected_num_fitness_calls
def test_number_calls_fitness_function_default_keep():
actual, expected = number_calls_fitness_function()
assert actual == expected
def test_number_calls_fitness_function_no_keep():
actual, expected = number_calls_fitness_function(keep_elitism=0,
keep_parents=0)
assert actual == expected
def test_number_calls_fitness_function_keep_elitism():
actual, expected = number_calls_fitness_function(keep_elitism=3,
keep_parents=0)
assert actual == expected
def test_number_calls_fitness_function_keep_parents():
actual, expected = number_calls_fitness_function(keep_elitism=0,
keep_parents=4)
assert actual == expected
def test_number_calls_fitness_function_both_keep():
actual, expected = number_calls_fitness_function(keep_elitism=3,
keep_parents=4)
assert actual == expected
def test_number_calls_fitness_function_no_keep_adaptive_mutation():
actual, expected = number_calls_fitness_function(keep_elitism=0,
keep_parents=0,
mutation_type="adaptive",
mutation_percent_genes=[10, 5])
assert actual == expected
def test_number_calls_fitness_function_default_adaptive_mutation():
actual, expected = number_calls_fitness_function(mutation_type="adaptive",
mutation_percent_genes=[10, 5])
assert actual == expected
def test_number_calls_fitness_function_both_keep_adaptive_mutation():
actual, expected = number_calls_fitness_function(keep_elitism=3,
keep_parents=4,
mutation_type="adaptive",
mutation_percent_genes=[10, 5])
assert actual == expected
if __name__ == "__main__":
print()
test_number_calls_fitness_function_default_keep()
print()
test_number_calls_fitness_function_no_keep()
print()
test_number_calls_fitness_function_keep_elitism()
print()
test_number_calls_fitness_function_keep_parents()
print()
test_number_calls_fitness_function_both_keep()
print()
test_number_calls_fitness_function_no_keep_adaptive_mutation()
print()
test_number_calls_fitness_function_default_adaptive_mutation()
print()
test_number_calls_fitness_function_both_keep_adaptive_mutation()
print()