如何在 DOCPLEX (Python) 中使用嵌套的 IF-THEN 约束?
How to use nested IF-THEN constraints in DOCPLEX (Python)?
我正在使用 python cplex 对我想要的情况进行建模。
在使用它的过程中,出现了一些问题,这些是:
- 我可以在 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 约束?
- 总的来说,我理解不等式可以用作 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
'''
我正在使用 python cplex 对我想要的情况进行建模。 在使用它的过程中,出现了一些问题,这些是:
- 我可以在 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 约束?
- 总的来说,我理解不等式可以用作 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
'''