繁体   English   中英

Python SciPy:优化问题fmin_cobyla:不遵守一个约束

[英]Python SciPy: optimization issue fmin_cobyla : one constraint is not respected

我有以下优化问题:

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

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

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

例如,在第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

阅读原始Fortran 77文件cobyla2.f软件包中提供)第38和39行中的文档,内容如下:

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

如果我解释SciPy的 API文档fmin_cobyla正确, RHOEND是默认设置为1.0E-4。

如果观察到的约束违规确实小于RHOEND但仍然不可接受,那么对该问题的简单解决方案是将RHOEND的值纳入约束公式中,即

C[i] + RHOEND >= 0

在这个特定的情况下,它出现像约束违反大于RHOEND ,已经由一示出的彻底新的测试情况下,在存储库SciPy的 ,由泡利Virtanen的构造,并且对应于上述的问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM