DOcplexException:应为线性约束,Get:docplex.mp.LogicalOrExpr

2024-05-19 12:36:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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)

如何解决错误


Tags: or代码addif错误方式条件linear
2条回答

Model.logical_or返回一个表达式,如果其中一个参数为true,则等于1Model.if_then需要线性约束,因此需要将表达式转换为约束,例如,write(Model.logical_or(a,b) ==1)

在这个小示例中,我声明当a或b等于1时,c等于1(请注意,逻辑运算符(如logical_或logical_)和接受二进制变量时,无需在此处添加“==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

如果不需要线性约束,可以使用真值

让我给你们举一个关于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) 

相关问题 更多 >