我想用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)我如何解决这个错误?
发布于 2020-09-24 02:44:12
可以使用真值,而不是需要线性约束的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) 发布于 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‘:
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"=1https://stackoverflow.com/questions/64032682
复制相似问题