繁体   English   中英

如何在CPLEX Python中实现逻辑或约束

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM