首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOcplexException:需要线性约束,got: docplex.mp.LogicalOrExpr

DOcplexException:需要线性约束,got: docplex.mp.LogicalOrExpr
EN

Stack Overflow用户
提问于 2020-09-24 00:49:10
回答 2查看 324关注 0票数 0

我想用docplex写一个条件约束。约束条件是:

代码语言:javascript
复制
if:
y[(i, j,k)]  == 1 or y[(j, i,k)]  == 1 

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

我以这种方式在docplex中实现了代码:

代码语言:javascript
复制
mdl.add(mdl.if_then(mdl.logical_or(y[(i, j,k)]  == 1 ,y[(j, i,k)]  == 1 ),g[i,j,k]==1))

但是当我运行的时候,我得到了这个错误:

代码语言:javascript
复制
DOcplexException: Expecting linear constraint, got: docplex.mp.LogicalOrExpr(y_13_16_14 == 1,y_16_13_14 == 1)

我如何解决这个错误?

EN

回答 2

Stack Overflow用户

发布于 2020-09-24 02:44:12

可以使用真值,而不是需要线性约束的if_then。

让我从bus example中给你举一个小例子

代码语言:javascript
复制
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) 
票数 0
EN

Stack Overflow用户

发布于 2020-09-24 15:31:10

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

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

代码语言:javascript
复制
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()

结果是:

代码语言:javascript
复制
objective: 2
  "a"=1
  "b"=1
  "c"=1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64032682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档