@@ -30,19 +30,20 @@ function _update_search_region(
3030 y:: Vector{Float64} ,
3131 yN:: Vector{Float64} ,
3232)
33- bounds_to_remove = Vector{Float64}[]
3433 p = length (y)
34+ bounds_to_remove = Vector{Float64}[]
35+ bounds_to_add = Dict{Vector{Float64},Vector{Vector{Vector{Float64}}}}()
3536 for u in keys (U_N)
3637 if all (y .< u)
3738 push! (bounds_to_remove, u)
3839 for l in 1 : p
3940 u_l = _get_child (u, y, l)
4041 N = [
41- k != l ? [yi for yi in U_N[u][k] if yi[l] < y[l]] : [y ]
42+ k == l ? [y] : [ yi for yi in U_N[u][k] if yi[l] < y[l]]
4243 for k in 1 : p
4344 ]
44- if all (! isempty (N[k]) for k in 1 : p if u_l[k] ≠ yN[k])
45- U_N [u_l] = N
45+ if all (! isempty (N[k]) for k in 1 : p if k != l && u_l[k] != yN[k])
46+ bounds_to_add [u_l] = N
4647 end
4748 end
4849 else
@@ -53,27 +54,31 @@ function _update_search_region(
5354 end
5455 end
5556 end
56- for bound_to_remove in bounds_to_remove
57- delete! (U_N, bound_to_remove )
57+ for u in bounds_to_remove
58+ delete! (U_N, u )
5859 end
60+ merge! (U_N, bounds_to_add)
5961 return
6062end
6163
6264function _get_child (u:: Vector{Float64} , y:: Vector{Float64} , k:: Int )
6365 @assert length (u) == length (y)
64- return vcat (u[1 : k- 1 ], y[k], u[k+ 1 : length (y)])
66+ return vcat (u[1 : ( k- 1 ) ], y[k], u[( k+ 1 ) : length (y)])
6567end
6668
6769function _select_search_zone (
6870 U_N:: Dict {Vector{Float64},Vector{Vector{Vector{Float64}}}},
6971 yI:: Vector{Float64} ,
72+ yN:: Vector{Float64} ,
7073)
71- i, j =
72- argmax ([
73- prod (_project (u, k) - _project (yI, k)) for k in 1 : length (yI),
74- u in keys (U_N)
75- ]). I
76- return i, collect (keys (U_N))[j]
74+ upper_bounds = collect (keys (U_N))
75+ p = length (yI)
76+ hvs = [
77+ u[k] == yN[k] ? 0.0 : prod (_project (u, k) .- _project (yI, k)) for
78+ k in 1 : p, u in upper_bounds
79+ ]
80+ k_star, j_star = argmax (hvs). I
81+ return k_star, upper_bounds[j_star]
7782end
7883
7984function optimize_multiobjective! (
@@ -100,7 +105,6 @@ function optimize_multiobjective!(
100105 warm_start_supported = true
101106 end
102107 solutions = Dict {Vector{Float64},Dict{MOI.VariableIndex,Float64}} ()
103- YN = Vector{Float64}[]
104108 variables = MOI. get (model. inner, MOI. ListOfVariableIndices ())
105109 n = MOI. output_dimension (model. f)
106110 yI, yN = zeros (n), zeros (n)
@@ -114,7 +118,7 @@ function optimize_multiobjective!(
114118 return status, nothing
115119 end
116120 _, Y = _compute_point (model, variables, f_i)
117- yI[i] = Y + 1
121+ yI[i] = Y
118122 model. ideal_point[i] = Y
119123 MOI. set (model. inner, MOI. ObjectiveSense (), MOI. MAX_SENSE)
120124 MOI. optimize! (model. inner)
@@ -124,7 +128,7 @@ function optimize_multiobjective!(
124128 return status, nothing
125129 end
126130 _, Y = _compute_point (model, variables, f_i)
127- yN[i] = Y
131+ yN[i] = Y + 1
128132 end
129133 MOI. set (model. inner, MOI. ObjectiveSense (), MOI. MIN_SENSE)
130134 U_N = Dict{Vector{Float64},Vector{Vector{Vector{Float64}}}}()
@@ -136,7 +140,7 @@ function optimize_multiobjective!(
136140 status = MOI. TIME_LIMIT
137141 break
138142 end
139- k, u = _select_search_zone (U_N, yI)
143+ k, u = _select_search_zone (U_N, yI, yN )
140144 MOI. set (
141145 model. inner,
142146 MOI. ObjectiveFunction {typeof(scalars[k])} (),
0 commit comments