从 scipy.optimize 到 nlopt 包使用的优化方法
Optimization methods used from scipy.optimize to nlopt package
我目前有一个 objective 功能的黑匣子。它已在 scipy.optimize
和 'status=op.basinhopping(obj,sp,...)' 中成功使用,但是,当我尝试使用相同的 obj 到 NLOPT 包时,它给出了
的消息
TypeError: <lambda>() takes exactly 1 argument (2 given).
我假设obj for scipy.optimize
有两个参数,一个是函数本身,另一个是每个维度的微分,而NLOPT方法中使用的obj只需要函数本身。如果我是对的,我应该如何修改 obj 以便它可以在 NLOPT 中使用?
我使用 NLOPT
的代码
sys.path.insert(0,os.path.join(os.getcwd(),"build/R_ulp"))
import foo as foo_square
reload(foo_square)
sp=np.zeros(foo_square.dim)+args.startPoint
obj=lambda X:foo_square.R(* X)
opt = nlopt.opt(nlopt.GN_CRS2_LM, foo_square.dim)
opt.set_min_objective(obj)
opt.set_lower_bounds(-1e9)
opt.set_upper_bounds(1e9)
opt.set_stopval(0)
opt.set_xtol_rel(1e-9)
opt.set_initial_step(1)
opt.set_population(0)
opt.set_maxeval(100000)
status = opt.optimize([0.111111111]*foo_square.dim)
SciPy 优化器和 NLopt 对 objective 函数的签名有不同的约定。 documentation for the objective function in NLopt 说
The function f
should be of the form:
def f(x, grad):
if grad.size > 0:
等等
因此您需要创建一个 objective 函数,它接受两个参数,x
和 grad
。如果grad.size > 0
,函数必须用梯度填充数组。
我目前有一个 objective 功能的黑匣子。它已在 scipy.optimize
和 'status=op.basinhopping(obj,sp,...)' 中成功使用,但是,当我尝试使用相同的 obj 到 NLOPT 包时,它给出了
TypeError: <lambda>() takes exactly 1 argument (2 given).
我假设obj for scipy.optimize
有两个参数,一个是函数本身,另一个是每个维度的微分,而NLOPT方法中使用的obj只需要函数本身。如果我是对的,我应该如何修改 obj 以便它可以在 NLOPT 中使用?
我使用 NLOPT
sys.path.insert(0,os.path.join(os.getcwd(),"build/R_ulp"))
import foo as foo_square
reload(foo_square)
sp=np.zeros(foo_square.dim)+args.startPoint
obj=lambda X:foo_square.R(* X)
opt = nlopt.opt(nlopt.GN_CRS2_LM, foo_square.dim)
opt.set_min_objective(obj)
opt.set_lower_bounds(-1e9)
opt.set_upper_bounds(1e9)
opt.set_stopval(0)
opt.set_xtol_rel(1e-9)
opt.set_initial_step(1)
opt.set_population(0)
opt.set_maxeval(100000)
status = opt.optimize([0.111111111]*foo_square.dim)
SciPy 优化器和 NLopt 对 objective 函数的签名有不同的约定。 documentation for the objective function in NLopt 说
The function
f
should be of the form:def f(x, grad): if grad.size > 0:
等等
因此您需要创建一个 objective 函数,它接受两个参数,x
和 grad
。如果grad.size > 0
,函数必须用梯度填充数组。