我在 Scipy Optimize 上,使用 fmin_cobyla 函数。我一直在努力编写以下约束函数:
- 确保所有项目总和为 1
- 确保所有项目 >= 0
有没有人有见识?例如,对于 fmin_slsqp,我有一个函数:
def w_constraint(w, v, x0, x1):
return np.sum(w) - 1
以及函数的边界。
但这些不适用于 cobyla。
我在 Scipy Optimize 上,使用 fmin_cobyla 函数。我一直在努力编写以下约束函数:
有没有人有见识?例如,对于 fmin_slsqp,我有一个函数:
def w_constraint(w, v, x0, x1):
return np.sum(w) - 1
以及函数的边界。
但这些不适用于 cobyla。
将你的平等表述为一对不等式。意义:
x == y
变成:
x >= y
x <= y
=-x >= -y
当然,这可能会引入数值问题(伤害多种求解器),但我在 COBYLA 接口的多个实现中看到了这一点(像这样实现了等式约束支持)。
来自NLopt文档的评论:
(底层 COBYLA 代码仅支持不等式约束。等式约束会自动转换为不等式约束对,在这种算法的情况下,这似乎不会导致问题。)
对于 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)