stevengj / nlopt

library for nonlinear optimization, wrapping many algorithms for global and local, constrained or unconstrained, optimization
Other
1.86k stars 575 forks source link

COBYLA freezes (though maxeval and maxtime are given) #370

Open tueda opened 3 years ago

tueda commented 3 years ago

I guess setting maxeval or maxtime must guarantee that optimization algorithms finish anyway (or possibly raise an exception). With the following settings, opt.optimize() never returns (though I can make a workaround, for example, by changing the algorithm or putting other stopping criteria).

import nlopt
import numpy as np

def f(x, _grad):
    return (2 - np.cos(x[0]) + x[1] ** 2) ** 2

opt = nlopt.opt(nlopt.LN_COBYLA, 2)
opt.set_min_objective(f)
opt.set_maxeval(668)  # doesn't seems to work
opt.set_maxtime(1.0)  # doesn't seems to work
opt.optimize([0, 0])  # never returns

If I use opt.set_maxeval(667) in the above code, then somehow it returns with the correct answer [0, 0].

Just in case, I am testing with the following versions (on Google Colab):

Python: 3.6.9
nlopt: 2.6.1

(I'm not sure why pip doesn't pick up 2.6.2).

jehelset commented 3 years ago

i also have stalling problem with COBYLA. in my case it seems to get stuck in the trstlp-function (https://github.com/stevengj/nlopt/blob/master/src/algs/cobyla/cobyla.c#L1247-L1250). this function does not take the stop-criteria into account. have problem both on 2.4.2 and master.

reproducer of it stalling is here:

https://github.com/jehelset/nlopt/blob/cobyla_trstlp_stalling/test/cobyla_trstlp_stalling.cpp

sanketdiwale commented 8 months ago

@jehelset @stevengj This problem seems to be happening quite often in problems I am trying to solve using cobyla. Is there a simple workaround to the infinite looping that happens in the trustlp routine? I am not too familiar with the algorithm so don't want to break it with my changes, some advice on what can be done safely would be much appreciated.