【问题标题】:Constraint functions on FMIN_COBYLA (scipy optimize)FMIN_COBYLA 上的约束函数(scipy 优化)
【发布时间】:2017-01-29 20:54:42
【问题描述】:

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

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

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

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

以及函数中的边界。

但这些不适用于 cobyla。

【问题讨论】:

  • "所有项目总和为 1" 是一个等式约束。 fmin_cobyla 不处理等式约束。
  • 谢谢你,@WarrenWeckesser,你能帮我确保它们都大于 0 吗?

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


【解决方案1】:

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

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

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

来自NLopt文档的评论:

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

【讨论】:

  • 谢谢@sascha;我对 scipy 很陌生,你能在我的约束函数中写下我必须返回的内容吗?
  • @GuilhermeNazarethdeSouza 查看文档。他们并没有那么糟糕。甚至包括例子。 (永远记住:“这不起作用”不是有用的错误消息!)
【解决方案2】:

对于 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)

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2010-11-23
    • 1970-01-01
    • 2014-07-13
    • 2011-09-26
    • 2015-09-26
    • 2016-05-27
    • 2019-02-10
    • 1970-01-01
    相关资源
    最近更新 更多