我正在尝试 NLopt 并创建了以下最小工作示例,该示例始终失败并显示
RoundoffLimited: NLopt roundoff-limited
:
import numpy as np
import nlopt
dim = 1
def obj_func(x, grad):
return float( (x[0]-0.5)**2 )
opt = nlopt.opt(nlopt.LN_COBYLA, dim)
opt.set_min_objective(obj_func)
lb = np.zeros(dim)
ub = np.ones(dim)
opt.set_lower_bounds(lb)
opt.set_upper_bounds(ub)
opt.set_ftol_rel(1e-6)
x0 = np.random.uniform(low=lb, high=ub)
xopt = opt.optimize(x0)
我完全不知道我在这里做错了什么,因为基本上所有其他 MWE 看起来都很相似。
您需要提供有关绝对收敛标准的信息,在您的情况下可能是:
opt.set_ftol_abs(1e-10)
最终代码如下所示:
import numpy as np
import nlopt
dim = 1
def obj_func(x, grad):
return (x[0] - 0.5)**2
opt = nlopt.opt(nlopt.LN_COBYLA, dim)
opt.set_min_objective(obj_func)
lb = np.zeros(dim)
ub = np.ones(dim)
opt.set_lower_bounds(lb)
opt.set_upper_bounds(ub)
opt.set_ftol_abs(1e-10)
x0 = np.random.uniform(low=lb, high=ub)
xopt = opt.optimize(x0)
print(xopt)
#[0.50000118]