忽略约束。如何正确指定它们?

2024-04-29 19:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在GpyOpt中运行一个约束优化。我想尽量减少

在哪里

s.t.至少有一个是非零的,并且不超过3可以等于1。所以我指定了约束条件:

根据参考手册here,我们可以使用numpy函数指定约束。并建议here在调用BayesianOptimization时指定约束。所以我用GpyOpt来表达这个,使用下面的代码

import numpy as np
import GPyOpt
from GPyOpt.methods import BayesianOptimization

seed = 6830
np.random.seed(seed)

def f(x):
    print(np.sum(x[:]), end=" ") # check if constraints are satisfied
    z = np.sum(x)
    return z**2

bounds = [{"name": "x", "type" : "discrete", 
           "domain" : (0, 1), "dimensionality": 10}]

constraints = [{'name' : 'more_than_0','constraint' : '-np.sum(x[:]) + 0.1'},
               {'name' : 'less_than_3','constraint' : 'np.sum(x[:]) - 3'}]

bopt = BayesianOptimization(f, domain=bounds, constraints=constraints)
bopt.run_optimization(max_iter=10)

但是,GpyOpt似乎忽略了这些约束,因为我在控制台中得到了以下输出:

^{pr2}$

它同时包含大于3和0的值。在

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

如果我指定连续域,仍然违反约束。在

传递约束以使其不被忽略的正确方法是什么?在

我使用的是GpyOpt版本1.2.1。在

更新: np.sum(x, 1)而不是{}不能解决这个问题。在

我使用的是python3.6.3,通过pip安装了numpy1.14.2和gpyopt1.2.1。在


Tags: nameimportnumpyheredomainnpseedsum
1条回答
网友
1楼 · 发布于 2024-04-29 19:22:20

我不确定你是在总结x的正确性。约束表达式应该在整个X上工作,并为每个数据点输出一个值数组,然后根据约束检查这些值。在

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

np.sum(x, axis=1)

如果不保留代码,则输出为:

^{pr2}$

没有违规行为。在

相关问题 更多 >