【问题标题】:How to use Continuous Variables for IF-THEN constraints on DOCPLEX (Python)?如何在 DOCPLEX (Python) 上对 IF-THEN 约束使用连续变量?
【发布时间】: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


    【解决方案1】:

    here复制我的答案:

    您不能将连续变量用于 if-then 约束。

    原因是这样的:'if' 子句可以取值为真或假。取决于此,'then' 子句是否被激活。如果 nbBus40 是连续的,那么 CPLEX 确实必须区分 nbBus40 >= 3 和 nbBus40

    如果 nbBus40 是整数,则区分的情况可以写为 nbBus40 >= 3 和 nbBus40

    解决此问题的典型方法是使用 epsilon 并定义 nbBus40 >= 3 和 nbBus40

    你可以这样写你的约束:

     with Model() as m:
         nbBus40 = m.continuous_var()
         nbBus30 = m.continuous_var()
         helper = m.binary_var()
    
         eps = 1e-3
         m.add(m.if_then(helper == 0, nbBus40 <= 3 - eps))
         m.add(m.if_then(helper == 1, nbBus40 >= 3))
         m.add(m.if_then(helper == 1, nbBus30 >= 7))
         m.solve()
    

    但请注意,拥有这些 eps 经常会遇到数字问题。所以最好避免在连续表达式上使用 if_then。也许您可以详细说明为什么要考虑一小部分公共汽车。很可能还有其他方法可以实现您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-20
      • 2020-06-25
      • 2020-03-22
      • 2019-02-12
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多