首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在使用GpyOpt时添加限制条件?

如何在使用GpyOpt时添加限制条件?
EN

Stack Overflow用户
提问于 2018-01-10 18:05:35
回答 2查看 1.2K关注 0票数 3

目前,我尝试最小化函数,并使用GPyOpt获得优化的参数。

代码语言:javascript
复制
import GPy
import GPyOpt
from math import log
def f(x):
    x0,x1,x2,x3,x4,x5 = x[:,0],x[:,1],x[:,2],x[:,3],x[:,4],x[:,5],
    f0 = 0.2 * log(x0)
    f1 = 0.3 * log(x1)
    f2 = 0.4 * log(x2)
    f3 = 0.2 * log(x3)
    f4 = 0.5 * log(x4)
    f5 = 0.2 * log(x5)
    return -(f0 + f1 + f2 + f3 + f4 + f5) 

bounds = [
    {'name': 'x0', 'type': 'discrete', 'domain': (1,1000000)},
    {'name': 'x1', 'type': 'discrete', 'domain': (1,1000000)},
    {'name': 'x2', 'type': 'discrete', 'domain': (1,1000000)},
    {'name': 'x3', 'type': 'discrete', 'domain': (1,1000000)},
    {'name': 'x4', 'type': 'discrete', 'domain': (1,1000000)},
    {'name': 'x5', 'type': 'discrete', 'domain': (1,1000000)}
]

myBopt = GPyOpt.methods.BayesianOptimization(f=f, domain=bounds)
myBopt.run_optimization(max_iter=100)
print(myBopt.x_opt) 
print(myBopt.fx_opt) 

我想给这个函数添加限制条件。下面是一个例子。

代码语言:javascript
复制
x0 + x1 + x2 + x3 + x4 + x5 == 100000000

我应该如何修改这段代码?

EN

回答 2

Stack Overflow用户

发布于 2018-03-06 18:52:05

GPyOpt只支持c(x0, x1, ..., xn) <= 0形式的约束,所以您能做的最好的事情就是选择一个足够小的值并“夹心”使用它的约束表达式。假设0.1足够小,那么你可以这样做:

代码语言:javascript
复制
(x0 + x1 + x2 + x3 + x4 + x5) - 100000000 <= 0.1
(x0 + x1 + x2 + x3 + x4 + x5) - 100000000 >= -0.1

然后

代码语言:javascript
复制
(x0 + x1 + x2 + x3 + x4 + x5) - 100000000 - 0.1 <= 0
100000000 - (x0 + x1 + x2 + x3 + x4 + x5) - 0.1 <= 0

API将如下所示:

代码语言:javascript
复制
constraints = [
    {
        'name': 'constr_1',
        'constraint': '(x[:,0] + x[:,1] + x[:,2] + x[:,3] + x[:,4] + x[:,5]) - 100000000 - 0.1'
    },
    {
        'name': 'constr_2',
        'constraint': '100000000 - (x[:,0] + x[:,1] + x[:,2] + x[:,3] + x[:,4] + x[:,5]) - 0.1'
    }
]

myBopt = GPyOpt.methods.BayesianOptimization(f=f, domain=bounds, constraints = constraints)
票数 2
EN

Stack Overflow用户

发布于 2018-12-12 14:59:10

我找到了一种更快的方法。

如果需要X0+X1.....Xn ==100000000,只需将X0+X1...Xn-1赋给GpyOpt即可。

在GpyOpt给你(X0+X1...Xn-1)之后,你可以得到Xn = 100000000 - sum(X0+X1.....Xn-1)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48184833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档