簡體   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