我如何实现 presence_of(x) => absence_of(y)

How do I implement presence_of(x) => absence_of(y)

我正在尝试使用 docplex.cp 解决 Python 中的调度问题。

在我的问题中,我有一个约束条件,即如果存在给定的可选区间变量,则必须不存在其他一些可选区间变量。

我试过这个:

mdl.add( 
        mdl.if_then( 
                    mdl.presence_of(optional_interval_var1), 
                    mdl.equal(mdl.presence_of(optional_interval_var2), 0) 
                   ) 
       )

但是好像不行。我发现在求解器提供的解决方案中没有强制执行此约束。

您可以在 presenceOf

之间使用 <=

例如

from docplex.cp.model import *


model = CpoModel()

itvs1=interval_var(optional = True,
                             start = 1,
                             end   = 10)

itvs2=interval_var(optional = True,
                             start = 10,
                             end   = 15)


model.add(minimize(presence_of(itvs1)+presence_of(itvs2)))

#model.add(presence_of(itvs1)==1)

model.add(presence_of(itvs1)<=presence_of(itvs2))

# Solve the model
sol = model.solve(LogPeriod=1000000,trace_log=True)

res1=sol.get_var_solution(itvs1).is_present()
res2=sol.get_var_solution(itvs2).is_present()

print("itvs1 is present : ",res1)
print("itvs2 is present : ",res2)

给予

itvs1 is present :  False
itvs2 is present :  False

但是如果你取消注释

#model.add(presence_of(itvs1)==1)

然后你得到

itvs1 is present :  True
itvs2 is present :  True