Python GpyOpt忽略约束。指定它们的正确方法是什么?

Python GpyOpt忽略约束。指定它们的正确方法是什么?,python,optimization,constraints,bayesian,gpyopt,Python,Optimization,Constraints,Bayesian,Gpyopt,我想在GpyOpt中运行约束优化。说吧,我想最小化 在哪里 s、 t.至少一个非零,且不超过3可以等于1。因此,我指定了约束条件: 根据参考手册,我们似乎可以使用numpy函数指定约束。建议我们可以在调用BayesianOptimization时指定约束条件。因此,我使用以下代码在GpyOpt中表示这一点 将numpy导入为np 导入GPyOpt 从GPyOpt.methods导入贝叶斯优化 种子=6830 np.随机种子(种子) def f(x): 打印(np.sum(x[:]),end

我想在
GpyOpt
中运行约束优化。说吧,我想最小化

在哪里

s、 t.至少一个非零,且不超过3可以等于1。因此,我指定了约束条件:

根据参考手册,我们似乎可以使用
numpy
函数指定约束。建议我们可以在调用
BayesianOptimization
时指定约束条件。因此,我使用以下代码在
GpyOpt
中表示这一点

将numpy导入为np
导入GPyOpt
从GPyOpt.methods导入贝叶斯优化
种子=6830
np.随机种子(种子)
def f(x):
打印(np.sum(x[:]),end=“”)#检查约束是否满足
z=np.和(x)
返回z**2
边界=[{“名称”:“x”,“类型”:“离散”,
“域”:(0,1),“维数”:10}]
约束=[{'name':'more_than_0','constraint':'-np.sum(x[:])+0.1'},
{'name':'less_than_3','constraint':'np.sum(x[:])-3'}]
bopt=贝叶斯优化(f,域=边界,约束=约束)
bopt.运行优化(最大iter=10)
但是,
GpyOpt
似乎忽略了这些约束,因为我在控制台中得到了以下输出:

6.0 1.0 5.0 7.0 3.0 2.0 2.0 0.0 1.0 3.0 1.0 1.0 1.0 0.0 2.0 
其中包含3以上的值和0

如果我将
np.sum(x[:])
显式写为
x[:,0]+x[:,1]+…
,行为不会改变

如果我指定continuous domain,约束仍然会被违反

传递约束的正确方法是什么,以使它们不会被忽略

我使用的是
GpyOpt
1.2.1版

更新:
np.sum(x,1)
而不是
np.sum(x[:])
不能解决这个问题


我使用的是Python 3.6.3,通过pip安装了numpy 1.14.2和GPyOpt 1.2.1。

我不确定您是否总结了x的正确性。约束表达式应该在整个X上工作,并输出每个数据点的值数组,然后每个值都根据约束进行检查

当我将两个表达式中的求和更改为:

np.sum(x, axis=1)
并保持代码完整,否则输出为:

1.0 2.0 1.0 2.0 2.0 2 2 2 2 1 2 2 1 2 1

没有冲突。

您使用的是什么版本的Python/GpyOpt/numpy?这并不能解决我的问题,但由于您无法复制它,我希望它可以与不同的版本相关。@NickTo、Python 3.6、GPyOpt 1.2.1、Numpy 1.13从Github安装开发版本并更改我求和的方式修复了问题。