0

我在 Scipy Optimize 上,使用 fmin_cobyla 函数。我一直在努力编写以下约束函数:

  1. 确保所有项目总和为 1
  2. 确保所有项目 >= 0

有没有人有见识?例如,对于 fmin_slsqp,我有一个函数:

def w_constraint(w, v, x0, x1):
    return np.sum(w) - 1

以及函数的边界。

但这些不适用于 cobyla。

4

2 回答 2

2

将你的平等表述为一对不等式。意义:

  • x == y变成:
    • x >= y
    • x <= y=-x >= -y

当然,这可能会引入数值问题(伤害多种求解器),但我在 COBYLA 接口的多个实现中看到了这一点(像这样实现了等式约束支持)。

来自NLopt文档的评论:

(底层 COBYLA 代码仅支持不等式约束。等式约束会自动转换为不等式约束对,在这种算法的情况下,这似乎不会导致问题。)

于 2017-01-30T02:39:33.280 回答
0

对于 Scipy.optimize.minimize 函数,以下应该有效:

def constraint_func(x_in):
    constraints_list = []
    constraints_list.append({'type': 'ineq', 'fun': lambda x: np.sum(x)-1})
    constraints_list.append({'type': 'ineq', 'fun': lambda x: -np.sum(x)+1})
    for i in range(len(x_in)):
        constraints_list.append({'type': 'ineq', 'fun': lambda x: x[i]})
    return constraints_list

constraints = constraint_func(x0)

res = scipy.optimize.minimize(fun, x0, method='COBYLA', constraints= constraints)

于 2020-07-16T17:46:17.177 回答