如何在 DOCPLEX (Python) 中使用嵌套的 IF-THEN 约束?

How to use nested IF-THEN constraints in DOCPLEX (Python)?

我正在使用 python cplex 对我想要的情况进行建模。 在使用它的过程中,出现了一些问题,这些是:

  1. 我可以在 CPLEX 中使用嵌套的 IF-THEN 约束吗?

首先,我可以在下面找到如何使用基本的 IF-THEN 约束。

但是,即使在那里我也找不到使用嵌套 IF-THEN 约束的方法,所以我做了一些思考。

引用上面的答案来解释,我想如下情况:

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.add(mdl.if_then(((nbbus40>=3) and (nbbus40<=7)),(nbbus30>=7)))**
mdl.minimize(nbbus40*500 + nbbus30*400)

如果我尝试上面代码的第 5 行,我不能使用嵌套的 IF-THEN 约束吗?

如果这是错误的,我应该如何使用嵌套的 IF-THEN 约束?

  1. 总的来说,我理解不等式可以用作 CPLEX 中的约束。 比如我要给出A=1的条件,我可以同时给出条件A>=1和条件A<=1来满足。 我的问题是,有没有办法只使用等号来指定(约束)一个值(我认为 1 个约束中的 2 个条件是浪费)?

谢谢。

Making optimization simple with python you relied on if then but you should try if then (v2)

用你的模型我会写

mdl.add((mdl.logical_and((nbbus40>=3),(nbbus40<=7)))<=(nbbus30>=7))

而不是

mdl.add(mdl.if_then(((nbbus40>=3) and (nbbus40<=7)),(nbbus30>=7)))

完整示例:

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)

print()
print("with if nb buses 40 more than 3  and less than 7 then nbBuses30 more than 7")

#if then constraint

mdl.add((mdl.logical_and((nbbus40>=3),(nbbus40<=7)))<=(nbbus30>=7))

mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()

 

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value) 

'''

which gives

nbBus40  =  6.0
nbBus30  =  2.0

with if nb buses 40 more than 3  and less than 7 then nbBuses30 more than 7
nbBus40  =  8.0
nbBus30  =  0.0

'''