我使用fmin_cobyla函数进行Scipy Optimize。我一直在努力编写约束函数:
有没有人有洞察力?例如,对于fmin_slsqp,我有一个函数:
def w_constraint(w, v, x0, x1):
return np.sum(w) - 1
以及函数中的界限。
但是这些人不会对cobyla工作。
答案 0 :(得分:1)
将你的平等表达为一对不平等。含义:
x == y
变为:
x >= y
x <= y
= -x >= -y
当然这可能会引入数字问题(伤害多种解决方案),但我在COBYLA接口的多个实现中看到了这一点(这样实现了等式约束支持)。
NLopt的文档中的评论:
(基础COBYLA代码仅支持不等式约束。等式约束自动转换为不等式约束对,在此算法的情况下似乎不会引起问题。)
答案 1 :(得分: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)