对布尔变量的约束



我正试图用成本上升的cvxpy实现一个单元承诺问题。然而,我正在努力识别上升趋势。(当变量从0切换到任何正值时(换句话说,我有一个变量g,正的,我想确定g何时为0,或者何时g>0.我知道宽容往往更容易,这对我来说并不是什么问题。

以下是一些将其放在上下文中的代码:

import cvxpy as cp
n=50    
g=cp.Variable(n)
ispos=cp.Variable(n,boolean=True)

我需要一个看起来像这样的约束:

当g>0
  • 当g<0
  • 我试着解决下面的问题,但我无法获得CVXPY满意的语法。

    constraints=[ispos == (g>=0)]
    

    我得到以下错误

    异常:无法计算约束或链的真值约束,例如1>=x>=0.

    也尝试过这个:

    constraints+=[ off[t]+(1 if g[t]<=0 else 0)== 1 for t in range (n)]
    

    但我得到以下错误:

    异常:无法计算约束或链的真值约束,例如1>=x>=0.

    您想要:

    ipsos[t] = 0 ==> g[t] >= 0
    ipsos[t] = 1 ==> g[t] <= -0.001
    

    这可以建模为:

    g[t] >= L[t]*ipsos[t]
    g[t] <= -0.001*ipsos[t]+U[t]*(1-ipsos[t])
    g[t] ∈ [L[t],U[t]] 
    

    在这里,我假设下边界L[t]是一个负数。在实践中,我会放弃-0.001这件事,只做:

    g[t] >= L[t]*ipsos[t]
    g[t] <= U[t]*(1-ipsos[t])
    g[t] ∈ [L[t],U[t]] 
    

    最新更新