【发布时间】:2020-03-10 04:53:44
【问题描述】:
我正在使用 DOCPLEX 构建混合整数线性规划 (MILP) 问题,然后通过 Python 上的 CPLEX 解决该问题。但是,在尝试使用 IF-THEN 约束解决 MILP 问题时,我收到以下错误:
DOcplexException: Model.if_then(), nbBus40 >= 3.0 is not discrete
发生这种情况是因为我已将 nbbus40 变量声明为 continuous,如下面的代码所示:
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.continuous_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),(nbbus30>=7)))
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
但是,如果我将 nbbus40 变量保留为 整数,则可以得到 MILP 问题的解决方案,如下所示:
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.add(mdl.if_then((nbbus40>=3),(nbbus30>=7)))
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
结果:
nbBus40 = 0
nbBus30 = 10.0
如何将 DOCPLEX 中的 IF-THEN 约束用于连续变量?
【问题讨论】:
标签: python linear-programming cplex mixed-integer-programming docplex