簡體   English   中英

在約束 DOcplex python 之間創建和/或邏輯

[英]Creating and/or logic between constraints DOcplex python

我正在嘗試將我的約束從 Cplex OPT 工作室轉移到 DOcplex Python。

約束之間的邏輯是 - 如果其中 1 個不滿足所有決策變量,則需要為 0。

在 Cplex Studio 中,它看起來像這樣:

forall(r in risk_list) (0.2 * sum (i in funds) x[i][r]* risk[i] >=  r - 0.005) && (sum(i in funds)  x[i][r] == 5)|| sum (i in funds)x[i][r]==0;

如何在約束之間定義“OR”“AND”邏輯?

從 OPL 遷移到 python 並不總是一個好主意 您還可以從 python 調用 OPL model

但在 docplex 中,您可以使用邏輯約束。

請參閱如何在 CPLEX Python 中實現邏輯 OR 約束

動物學.py

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*460 + nbbus30*360)

mdl.solve()

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

print()
print("with the logical constraint")

nbKindOfBuses = mdl.integer_var(name='nbKindOfBuses')
mdl.add(nbKindOfBuses==(nbbus40>=1)+(nbbus30>=1))

mdl.minimize(nbbus40*460 + nbbus30*360+(nbKindOfBuses-1)*(500))

mdl.solve()

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

zooifthen.py

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) 

暫無
暫無

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

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