我如何实现 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
我正在尝试使用 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