FMIN_COBYLA上的约束函数(scipy optimize)

时间:2017-01-29 20:54:42

标签: python optimization scipy convex-optimization quadratic-programming

我使用fmin_cobyla函数进行Scipy Optimize。我一直在努力编写约束函数:

  1. 确保所有项目总计为1
  2. 确保所有商品> = 0
  3. 有没有人有洞察力?例如,对于fmin_slsqp,我有一个函数:

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

    以及函数中的界限。

    但是这些人不会对cobyla工作。

2 个答案:

答案 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)