1
|
|
|
"""Contain PsoAlgorithm.""" |
2
|
|
|
# pylint: disable=redefined-variable-type |
|
|
|
|
3
|
1 |
|
import logging |
4
|
|
|
|
5
|
1 |
|
from grortir.main.model.core.optimization_status import OptimizationStatus |
6
|
1 |
|
from grortir.main.pso.process_validator import ProcessValidator |
7
|
1 |
|
from grortir.main.pso.whole_group_pso import WholeGroupPso |
8
|
|
|
|
9
|
1 |
|
LOG = logging.getLogger(__name__) |
10
|
|
|
|
11
|
|
|
|
12
|
1 |
|
class PsoAlgorithm: |
13
|
|
|
"""Optimize process with different strategies. |
14
|
|
|
|
15
|
|
|
Attributes: |
16
|
|
|
process (AbstractProcess): process |
17
|
|
|
""" |
18
|
|
|
|
19
|
1 |
|
def __init__(self, process, grouping_strategy, optimization_startegy, |
20
|
|
|
number_of_particle=40): |
21
|
1 |
|
self.process = process |
22
|
1 |
|
self.grouping_strategy = grouping_strategy |
23
|
1 |
|
self.optimization_strategy = optimization_startegy |
24
|
1 |
|
self.process_validator = ProcessValidator() |
25
|
1 |
|
self.whole_group_pso = WholeGroupPso(self.process, number_of_particle) |
26
|
|
|
|
27
|
1 |
|
def run(self): |
28
|
|
|
"""Run algorithm.""" |
29
|
1 |
|
self.process_validator.validate(self.process) |
30
|
1 |
|
self.process.optimizationStatus = OptimizationStatus.in_progress |
31
|
1 |
|
number_of_groups = self.grouping_strategy.get_actual_numbers_of_groups() |
32
|
1 |
|
for current_group_number in range(number_of_groups): |
33
|
1 |
|
current_stages = self.grouping_strategy.get_items_from_group( |
34
|
|
|
current_group_number) |
35
|
1 |
|
group_optimization_strategy = self.optimization_strategy. \ |
36
|
|
|
get_group_optimization_strategy(current_stages, self.process) |
37
|
1 |
|
self.whole_group_pso.optimize(current_stages, |
38
|
|
|
group_optimization_strategy) |
39
|
1 |
|
self._post_processing() |
40
|
|
|
|
41
|
1 |
|
def _post_processing(self): |
|
|
|
|
42
|
1 |
|
final_status = OptimizationStatus.success |
43
|
1 |
|
statuses = "" |
44
|
1 |
|
costs = "" |
45
|
1 |
|
for stage in self.grouping_strategy.ordered_stages: |
46
|
1 |
|
statuses += str(stage.optimization_status) + ", " |
47
|
1 |
|
costs += str(stage.get_cost()) + ", " |
48
|
1 |
|
if stage.optimization_status != OptimizationStatus.success: |
49
|
1 |
|
LOG.debug("Failed stage: " + str(stage)) |
50
|
1 |
|
final_status = OptimizationStatus.failed |
51
|
1 |
|
self.process.optimization_status = final_status |
52
|
1 |
|
LOG.info('Final status of process optimization: ' + str(final_status)) |
53
|
1 |
|
LOG.info('Statuses of stages: ' + statuses[:-3]) |
54
|
|
|
LOG.info('Costs of stages: ' + costs[:-3]) |
55
|
|
|
|