簡體   English   中英

如何在 CPLEX python 中編寫條件約束?

[英]how to write a conditional constraint in CPLEX python?

我有一個 model,它有一個二進制變量 x [i] [j] [k]。 我需要添加一個滿足這個條件的約束:


if x[i][j][k1]==1  and  x[j][i][k2]==1 

Then:

 k2-k1>8

我有這段代碼,但我認為它不正確:

  mdl.add((y[(i,j,k)]+y[(j,i,k1)]==2),(k1-k>8) )

我也,把這個:

 mdl.add(mdl.if_then(y[(i,j,k1)]+y[(j,i,k2)]==2, k2-k1>8))

但我收到了這個錯誤:

    raise DOcplexException(resolved_message)

DOcplexException: Expecting linear constraint, got: False

我怎么能用 cplex python API model 這個?

讓我分享一下 if then 的例子

https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/

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 if nb buses 40 more than 3  then nbBuses30 more than 7")

#if then constraint
mdl.add(mdl.if_then(nbbus40>=3,nbbus30>=7))
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()



for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value) 

如果你想看到並且在 if

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 if nb buses 40 more than 3 and less than 7 then nbBuses30 more than 7")

#if then constraint
mdl.add(mdl.if_then((nbbus40>=3) + (nbbus40<=7)>=2,nbbus30>=7))
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()



for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value) 

你也可以重寫

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 if nb buses 40 more than 3 and less than 7 then nbBuses30 more than 7")

#if then constraint
mdl.add((((nbbus40>=3) + (nbbus40<=7)>=2))<=(nbbus30>=7))
mdl.minimize(nbbus40*500 + nbbus30*400)

mdl.solve()



for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value) 

Model.if_then鏈接兩個線性約束。 如果第一個滿意,第二個也會滿意。

就您而言,我了解在k2-k1>8中不涉及決策變量。 所以這完全取決於數據,在 model 構建時已知。

在這種情況下,因果關系反過來:如果 k2-k1>8,則 x[i,j,k1] 和 x[i,j,k2] 都必須等於 1。

那么最簡單的代碼是:

if k2-k1>8:
   m.add(x[i,j,k1] == 1)
   m.add(x[i,j,k2] == 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM