3

考虑以下问题:

import numpy
import scipy.optimize


def f(x):
    return (x[0] == 1)*(x[1] + 2)**2 - (x[0] == 0)*(x[1] + 1)**2


kwargs = {
        'method': 'trust-constr',
        'jac': False,
        'bounds': [(0, 1), (0, 1)],
    }


m = scipy.optimize.minimize(f, numpy.array([1, 0]), **kwargs).x
print(m)
# [0.91136811 0.19026955]  <- wrong result

我想在空间上优化这个功能

  • x[0] \in {0,1}
  • x[1] \in [0,1]

有没有办法指定 x[0] 不应该是一个真实的值(即行上的一个值[0,1]),而只能是 0 或 1?

我目前的做法是执行 N 次优化,每个 x[0] 选项一个。问题是,如果有多个分类变量,这会迅速爆发。

4

1 回答 1

0

有什么方法可以指定 x[0] 不应该是一个实际值(即行 [0,1] 上的一个值),而只能是 0 或 1?

wrapdisc是一个瘦包装器包,可让您使用各种scipy.optimize优化器优化分类、整数和浮点变量。它将这些变量中的每一个编码为浮点数。它的自述文件中有一个使用示例。有了它,您不必调整目标函数或执行n次优化。

于 2021-12-13T01:07:06.403 回答