-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
91 lines (66 loc) · 3.23 KB
/
main.py
File metadata and controls
91 lines (66 loc) · 3.23 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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import config
import contextlib
import os
from utils.plotter import generate_plots
from ga.individual import Individual
from ga.population_generator import generate_population
from ga.genetic_algorithm import (
perform_selection,
crossover_selection,
perform_crossover,
replace_parents,
perform_mutation,
)
from utils.logger import population_info, show_probabilities, show_intervals, show_crossover_selections, \
show_crossover_results, show_mutated
os.makedirs("data", exist_ok=True)
def population_stats(population):
fitness_values = [ind.fitness for ind in population]
x_values = [ind.x for ind in population]
f_max = max(fitness_values)
avg_fitness = sum(fitness_values) / len(fitness_values)
avg_x = sum(x_values) / len (x_values)
return f_max, avg_fitness, avg_x
def main():
population = generate_population()
max_evolution = []
avg_evolution = []
x_evolution = []
avgx_evolution = []
with open("data/evolution.txt", "w") as f:
with contextlib.redirect_stdout(f):
for generation in range(config.STEPS):
elite_individual = max(population, key = lambda ind: ind.fitness)
elite_clone = Individual(elite_individual.chromosome)
selected_population = perform_selection(population)
selected_population[0] = elite_clone
f_max, avg_fitness, avg_x = population_stats(population)
max_evolution.append(elite_individual.fitness)
avg_evolution.append(avg_fitness)
x_evolution.append(elite_individual.x)
avgx_evolution.append(avg_x)
crossover_population = crossover_selection(selected_population)
crossover_results = perform_crossover(crossover_population)
next_generation = replace_parents(selected_population, crossover_results)
mutated_population = perform_mutation(next_generation)
if generation == 0:
population_info(population, "Initial population info:")
show_probabilities(population)
show_intervals(population)
population_info(selected_population, "Population after selection:")
show_crossover_selections(crossover_population)
show_crossover_results(crossover_results, crossover_population)
population_info(next_generation, "Next generation info:")
show_mutated(mutated_population, next_generation)
population_info(mutated_population, "Mutated population info:")
print(f"Generation {generation + 1}: f_max = {elite_individual.fitness}, avg fitness = {avg_fitness}")
population = mutated_population
max_evolution.append(elite_individual.fitness)
avg_evolution.append(avg_fitness)
x_evolution.append(elite_individual.x)
avgx_evolution.append(avg_x)
print(f"Final Generation {config.STEPS + 1}: f_max = {f_max}, avg fitness = {avg_fitness}")
generate_plots(max_evolution, avg_evolution, x_evolution, avgx_evolution)
return population
if __name__ == "__main__":
final_population = main()