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