[英]How to Implement Logical OR constraint in CPLEX Python
如何在CPLEX Python MP中实现x [0,0] == 0或x [0,0]> = 2这样的约束?
似乎是对semiinteger的工作,但在Watson Studio DO环境中使用的CPLEX Python版本中没有semiinteger_var_matrix()。 我可以使用semiinteger_var_list()可用,但想通过逻辑或约束来教自己。 我尝试了x [0,0]!= 1,但是MP无法处理NE。 所以我认为我可以做到上面显示的逻辑或约束。 查看了doc和docplex.mp.model的来源,但仍无法弄清楚该如何做。 我正处于学习CPLEX Python的早期阶段。
让我给您一个有关巴士故事的小例子:
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示例
正确, semiinteger_matrix
不存在。 但是semiinteger_dict
可以。 所以你可以做类似的事情
x = model.semiinteger_var_dict((i, j) for i in range(I) for j in range(J))
然后,您可以将变量引用为x[0,0]
等。
经典公式(假设u
也是一个上限)如下所示:
introduce fresh binary variable b
post
x <= u * b
x >= l * b
在您的情况下, l=2
。
u
的值取决于问题,因此,使其尽可能小以更好地放松是很重要的。 (有关该主题的介绍性博客文章 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.