@@ -148,6 +148,10 @@ function _update!(
148148 return
149149end
150150
151+ _isapprox (:: Nothing , :: _DominguezRiosBox ) = false
152+
153+ _isapprox (A:: _DominguezRiosBox , B:: _DominguezRiosBox ) = A. l ≈ B. l && A. u ≈ B. u
154+
151155function minimize_multiobjective! (algorithm:: DominguezRios , model:: Optimizer )
152156 @assert MOI. get (model. inner, MOI. ObjectiveSense ()) == MOI. MIN_SENSE
153157 n = MOI. output_dimension (model. f)
@@ -190,13 +194,22 @@ function minimize_multiobjective!(algorithm::DominguezRios, model::Optimizer)
190194 solutions = SolutionPoint[]
191195 k = 0
192196 status = MOI. OPTIMAL
197+ B_prev = Vector {Union{Nothing,_DominguezRiosBox}} (nothing , n)
193198 while any (! isempty (l) for l in L)
194199 if (ret = _check_premature_termination (model)) != = nothing
195200 status = ret
196201 break
197202 end
198203 i, k = _select_next_box (L, k)
199204 B = L[k][i]
205+ # We check for the repeated search of similar boxes in the same
206+ # optimization direction. If the same box was searched before, we delete
207+ # it from the list of boxes.
208+ if _isapprox (B_prev[k], B)
209+ deleteat! (L[k], i)
210+ continue
211+ end
212+ B_prev[k] = B
200213 # We're going to scale `w` here by `scale` instead of the usual
201214 # `1 / max(...)`. It will show up in a few places bbelow.
202215 w = scale ./ max .(1 , B. u - yI)
0 commit comments