【问题标题】:DOcplexException: Expecting linear constraint, got: docplex.mp.LogicalOrExprDOcplexException:期望线性约束,得到:docplex.mp.LogicalOrExpr
【发布时间】:2021-01-09 22:24:46
【问题描述】:

我想使用 docplex 编写条件约束。约束是:

if:
y[(i, j,k)]  == 1 or y[(j, i,k)]  == 1 

then:
g[i,j,k]==1

我是这样实现docplex中的代码的:

mdl.add(mdl.if_then(mdl.logical_or(y[(i, j,k)]  == 1 ,y[(j, i,k)]  == 1 ),g[i,j,k]==1))

但是当我运行我得到这个错误:

DOcplexException: Expecting linear constraint, got: docplex.mp.LogicalOrExpr(y_13_16_14 == 1,y_16_13_14 == 1)

我该如何解决这个错误?

【问题讨论】:

    标签: python cplex docplex


    【解决方案1】:

    您可以使用真值代替需要线性约束的 if_then。

    让我给你一个来自bus example的小例子

    from docplex.mp.model import Model
    
    mdl = Model(name='buses')
    nbbus40 = mdl.integer_var(name='nbBus40')
    nbbus30 = mdl.integer_var(name='nbBus30')
    mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
    mdl.minimize(nbbus40*500 + nbbus30*400)
    
    mdl.solve()
    
    for v in mdl.iter_integer_vars():
       print(v," = ",v.solution_value)
    
    
    
    #if then constraint
    mdl.add(mdl.logical_or(nbbus40<=2,nbbus30<=2 )<=(nbbus30>=7))
    mdl.minimize(nbbus40*500 + nbbus30*400)
    
    mdl.solve()
    
     
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value) 
    

    【讨论】:

      【解决方案2】:

      Model.logical_or 返回一个 表达式 ,如果其中一个参数为真,则等于 1; Model.if_then 需要一个线性约束,所以需要将表达式转化为约束,例如写成(Model.logical_or(a,b) ==1)

      在这个小例子中,我声明当 a 或 b 等于 1 时 c 等于 1(请注意,逻辑运算符如logical_or 或logical_and 接受二进制变量,无需在此处添加'==1':

      m = Model()
      [a,b,c] = m.binary_var_list(keys=['a', 'b', 'c'], name=str)
      # if a or b then c
      m.add(m.if_then(m.logical_or(a,b) == 1, c==1))
      m.maximize(a+b)
      m.solve()
      m.print_solution()
      

      结果是:

      objective: 2
        "a"=1
        "b"=1
        "c"=1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多