【问题标题】:How to Implement Logical OR constraint in CPLEX Python如何在 CPLEX Python 中实现逻辑或约束
【发布时间】:2019-06-21 20:26:26
【问题描述】:

如何在 CPLEX Python MP 中实现类似 x[0,0] == 0 OR x[0,0] >= 2 的约束?

似乎是 semiinteger 的工作,但 semiinteger_var_matrix() 在我在 Watson Studio DO 环境中使用的 CPLEX Python 版本中不可用。我可以使用可用的 semiinteger_var_list() 但想通过逻辑或约束来自学。我试过 x[0,0] != 1 但 MP 不处理 NE。所以我想我可以按照上面显示的逻辑 OR 约束来做到这一点。查看了文档和 docplex.mp.model 的来源,但无法弄清楚如何做到这一点。我正处于学习 CPLEX Python 的早期阶段。

【问题讨论】:

    标签: python cplex


    【解决方案1】:

    让我举个巴士故事的小例子:

    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 nb buses 40 less than 3 or more than 7")
    
    
    
    mdl.add((nbbus40<=3) + (nbbus40>=7) >=1)
    
    
    mdl.minimize(nbbus40*500 + nbbus30*400)
    
    mdl.solve()
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    

    给了

    nbBus40  =  6.0
    nbBus30  =  2.0
    
    with nb buses 40 less than 3 or more than 7
    nbBus40  =  7.0
    nbBus30  =  1.0
    

    注意:你也可以写

    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 nb buses 40 less than 3 or more than 7")
    
    option1=mdl.binary_var(name='option1')
    option2=mdl.binary_var(name='option2')
    
    mdl.add(option1==(nbbus40<=3))
    mdl.add(option2==(nbbus40>=7))
    
    mdl.add(1==mdl.logical_or(option1,option2))
    
    mdl.minimize(nbbus40*500 + nbbus30*400)
    
    mdl.solve()
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    

    https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/ 上的许多其他小型 docplex Python 示例

    【讨论】:

    【解决方案2】:

    没错,semiinteger_matrix 不存在。但是semiinteger_dict 可以。所以你可以做类似的事情

    x = model.semiinteger_var_dict((i, j) for i in range(I) for j in range(J))
    

    之后您可以将变量引用为x[0,0] 等。

    【讨论】:

      【解决方案3】:

      经典公式,假设还有一个上限 u 看起来像:

      introduce fresh binary variable b
      
      post
      
      x <= u * b
      x >= l * b
      

      在你的情况下l=2。

      u 的值取决于问题,重要的是使其尽可能小以更好地放松。 (关于该主题的介绍性blog-post)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-05
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        • 1970-01-01
        • 2016-01-26
        • 1970-01-01
        相关资源
        最近更新 更多