-
Notifications
You must be signed in to change notification settings - Fork 0
/
genetic_main.py
81 lines (64 loc) · 2.72 KB
/
genetic_main.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
from numpy.random import randint
from genetic_algorithm.genetic_algorithm import GeneticAlgorithm
from genetic_algorithm.selection_algos import *
from genetic_algorithm.genetic_operations import mutate, cross
from nutrition_data.nutrition_data_loader import NutritionDataLoader
from iterative_improvement_algorithm.iterative_improvements_algorithm import IterativeImprovementsAlgorithm
from model.model import Model
from model.product import Solution
import json
import pickle
import matplotlib.pyplot as plt
config = json.load(open('config.json'))
selections = {
'ranking': selection_ranking,
'tournament': selection_tournament,
'roulette': selection_roulette
}
def get_loader_from_file(file_name):
loader = NutritionDataLoader(file_name)
loader.initial_preprocessing()
return loader
def generate_initial_solutions(num_initial, loader: NutritionDataLoader):
products_range = config['restrictions']['products_number']
categories = config['categories']
mass_range = config['mass_range']
initial_solutions = []
for _ in range(num_initial):
products_number = randint(products_range[0], products_range[1])
products = loader.generate_products(
categories, [max(1, products_number // len(categories))] * len(categories)
)
solution = Solution()
for product in products:
solution.add(product, randint(mass_range[0], mass_range[1] // len(products)))
initial_solutions.append(solution)
return initial_solutions
def main():
products_loader = get_loader_from_file(config['nutrition_data'])
model = Model(products_loader, config['restrictions'])
initial_improver = IterativeImprovementsAlgorithm(**config['iterative_improvement_config'])
genetic_algorithm = GeneticAlgorithm(
scoring_function=solution_score,
unary_genetic_operation=mutate,
binary_genetic_operation=cross,
model=model,
selection_algorithm=selections[config['selection_method']],
)
initial_population = initial_improver.correct_solutions(
generate_initial_solutions(config['initial_solutions_number'], products_loader)
)
plot_title = "Selection Method: {}".format(config['selection_method'])
plt.title(plot_title)
evolved_population = genetic_algorithm.run_evolution(
epoch_count=config['epoch_count'],
scoring_params=config['scoring_params'],
selection_params=config['selection_params'],
unary_op_params=config['unary_op_params'],
binary_op_params=config['binary_op_params'],
initial_population=initial_population,
)
plt.show()
pickle.dump(evolved_population, open('.pickled/evolved_population.pkl', 'w+b'))
if __name__ == "__main__":
main()