如何在CPLEX python中编写条件约束?

2024-05-19 10:21:58 发布

您现在位置: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对此进行建模


Tags: and代码模型addif错误二进制k2
2条回答

Model.if_then从左到右链接两个线性约束。如果第一个满意,第二个也会满意

在您的情况下,我理解在k2-k1>8中没有涉及决策变量。所以这完全依赖于数据,在模型构建时就知道了

在这种情况下,因果关系反过来起作用:如果k2-k1>;那么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)

让我来分享一下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) 

相关问题 更多 >

    热门问题