首页 > 解决方案 > 我的 cplex 逻辑约束不能正常工作

问题描述

我是 cplex python 的新手。我有一个具有不同约束的模型,除了我的 if-then 约束之外,它们都可以正常工作。x 是一个二进制变量。我的约束解释是

“如果 x[i,j,t1] == 1 (对于 t 在 T 范围内),那么所有 x[j,i,t2]== 0 对于 t2 in[t+1 ,t+2,t+ 3]”。

我的代码:

        for i in I:
            for j in J:
              for t in T:
                mdl.add_constraint(mdl.if_then(x[i,j,t]==1, x[j,i,t+1]+x[j,i,t+2]+y[j,i,t+3]==0))

解决模型后,解决方案就是打破这个规则。关于这个问题没有错误,所以我不明白我做错了什么。

标签: python-3.xcplex

解决方案


要了解正在发生的事情,您可以做的是显示 if then 的所有布尔值。

例如,我可以将此文件中的 ifthen 示例重写为

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()

print("if ",nbbus40.solution_value>=3)
print("then ",nbbus30.solution_value>=7)


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

这使

with if nb buses 40 more than 3  then nbBuses30 more than 7
if  False
then  True

这有助于了解正在发生的事情。


推荐阅读