/
multi_objective.jl
69 lines (58 loc) · 1.89 KB
/
multi_objective.jl
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
# multi-objective LL case
function lower_level_decision_making(
status,
parameters::Heuristic,
problem,
information,
options,
results_ll::State{T},
args...;
kargs...
) where T <: AbstractMultiObjectiveSolution
return results_ll.population
end
function upper_level_decision_making(
status::BLState{BLIndividual{T,T}},
parameters,
problem,
information,
options,
solutions,
args...;
kargs...
) where T <: AbstractMultiObjectiveSolution
population_ul = get_ul_population(solutions)
Metaheuristics.get_non_dominated_solutions_perm(population_ul)
end
function upper_level_decision_making(
status::BLState{BLIndividual{U,Union{Metaheuristics.xf_indiv, Metaheuristics.xfgh_indiv}}},
parameters::Heuristic,
problem,
information,
options,
solutions,
args...;
kargs...
) where U <: AbstractMultiObjectiveSolution # where L <: AbstractSolution
population_ul = get_ul_population(solutions)
Metaheuristics.get_non_dominated_solutions_perm(population_ul)
end
function truncate_population!(
status::BLState{BLIndividual{U, L}},
parameters::Heuristic,
problem,
information,
options
) where U <: AbstractMultiObjectiveSolution where L <: AbstractSolution
length(status.population) <= parameters.ul.N && (return)
population_ul = get_ul_population(status.population)
Metaheuristics.environmental_selection!(population_ul, parameters.ul)
# TODO improve performance this part
delete_mask = ones(Bool, length(status.population))
for sol in get_ul_population(status.population)
i = findfirst( s -> s==sol, population_ul)
isnothing(i) && continue
delete_mask[i] = false
end
deleteat!(status.population, delete_mask)
end