【问题标题】:Python SciPy: optimization issue fmin_cobyla : one constraint is not respectedPython SciPy:优化问题 fmin_cobyla:不遵守一个约束
【发布时间】:2013-09-17 21:24:37
【问题描述】:

我有以下优化问题:

目标函数非常简单:给定一个向量SPREAD,我尝试找到向量W 以最大化sum(W.SPREAD)

例如,在维度 3 中,这意味着我尝试最大化 w1 x spread1 + w2 x spread2 + w3 x spread3

另外,我有三个约束c1, c2 & c3 不是在W 上,而是在POS 向量上POS = W2POS(W)

例如,在维度 3 中,约束是:

  1. |pos1 + pos2 + pos3| < 5
  2. |pos1| + |pos2| + |pos3| < 500
  3. Max(pos1, pos2, pos3) < 5

我编写了下面的代码来执行一些优化,但是约束 3 没有得到遵守。尊重我的约束,我该如何解决这个问题?

我写了以下代码:

from scipy.optimize import fmin_cobyla
import numpy as np
import pandas as pd

def W2POS(W, PRICE, BETA):
    POS = (PRICE * BETA).T.dot(W)
    return POS

def objective(W, SPREAD, sign = 1):
    er = sum((W * SPREAD.T).sum())
    return sign * er

def c1(x, *args):
    """ abs(sum(c)) < 500    """
    POS = W2POS(x,args[0], args[1]) 
    return POS.apply(abs).sum()

def c2(x, *args):
    """ abs(sum()) < 5    """
    POS = W2POS(x,args[0], args[1]) 
    return 5. - abs(POS.sum())

def c3(x, *args):
    """ abs(max(pos)) < 5   """
    POS = W2POS(x,args[0], args[1]) 
    return 5. - POS.apply(abs).max()

# optim
W0 = np.zeros(shape=(len(BETA), 1))
sign = -1
W = fmin_cobyla(objective, W0, cons = [c1, c2, c3], args=(SPREAD,sign), 
                consargs=(PRICE, BETA), maxfun=100, rhobeg = 0.02).T
print 'Solution:', W
args = [PRICE, BETA]
pos = W2POS(W.T,args[0], args[1]) 
print 'c1 < 5:', abs(pos.sum())[0]
print 'c2 < 500:', pos.apply(abs).sum()[0]
print 'c3 < 5:', pos.apply(abs).apply(max)[0]

您可以使用一些虚拟数据来说明此代码不尊重 c3:http://pastebin.com/gjbeePgt

【问题讨论】:

    标签: python optimization scipy


    【解决方案1】:

    阅读原始 Fortran 77 文件 cobyla2.f(可在 this 包中获得)第 38 行和第 39 行中的文档,说明:

    C1,C2,...,CM 表示最终应该变为非负的约束函数,至少达到 RHOEND 的精度

    如果我正确解释了 fmin_cobylascipy API 文档,RHOEND 默认设置为 1.0E-4

    如果观察到的约束违规确实小于RHOEND,但仍然大到无法接受,解决该问题的一个简单方法是将RHOEND 的值合并到约束公式中,即

    C[i] + RHOEND >= 0
    

    在这种特殊情况下,它确实看起来约束违反大于RHOEND,这已由 new test case in the scipy repository 彻底说明,由 Pauli Virtanen 构建,对应于上述问题。

    为了避免在这种特殊情况下违反约束,解决方案似乎是在 RHOBEG 上使用较小的值开始优化,例如 0.01

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 2010-11-23
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多