python - 从 scipy.optimize 到 nlopt 包使用的优化方法
问题描述
我目前有一个目标函数的黑匣子。它已成功scipy.optimize
用作'status = op.basinhopping(obj,sp,...)',但是,当我尝试使用相同的obj到NLOPT包时,它会给出一条消息
TypeError: <lambda>() takes exactly 1 argument (2 given).
我想 obj forscipy.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 对目标函数的签名有不同的约定。NLopt 中目标函数的文档说
该函数
f
应采用以下形式:def f(x, grad): if grad.size > 0:
等等
因此,您需要创建一个接受两个参数的目标函数,x
并且grad
. 如果grad.size > 0
,该函数必须用渐变填充数组。
推荐阅读
- android - 使用 android:inputType textMultiLine 后无法选择项目
- c++ - 作为我的模板规范的一部分,我需要专门化另一个模板
- regex - 正则表达式重定向两个以相同字符串开头的不同 URL
- syslog - 基于 TLS 的 Syslog-ng 3.30.1
- javascript - 如何开玩笑模拟/监视类的属性
- jquery - ReferenceError:文档未在 Bootstrap.js 上定义
- packet - 如何在将数据包发送到打印机之前对其进行修改?
- linux - 划分文本文件的行值
- php - PHP 在 nginx 重写中保留并传递 $_GET
- javascript - 使用 Robin Herbots 的 Inputmask 时从输入框中获取掩码值