首页 > 解决方案 > 如何在 CPLEX Python 中实现逻辑或约束

问题描述

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

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

标签: pythoncplex

解决方案


让我给你一个关于巴士故事的小例子:

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 示例


推荐阅读