如何在 CPLEX python 中编写条件约束?
how to write a conditional constraint in CPLEX python?
我的模型有一个二进制变量 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 建模?
让我分享
中的 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
不涉及任何决策变量。所以这完全取决于数据,在模型构建时已知。
在那种情况下,因果关系相反:如果 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)
我的模型有一个二进制变量 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 建模?
让我分享
中的 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
不涉及任何决策变量。所以这完全取决于数据,在模型构建时已知。
在那种情况下,因果关系相反:如果 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)