我是 Cplex 的新手。我需要同时计算多个间隔之间的重叠。为此,我一次计算两个间隔之间的overlap_length,并保存起点/终点的最大值和最小值。 例如,让我们考虑三个间隔变量 I1、I2、I3。目标是最大化三者之间的重叠。 然后,代码如下:
超过1=mdl.overlap_length(I1,I2(
start1=max(mdl.start_of(I1(,mdl.start_of(I2((
end1=min(mdl.end_of(I1(,mdl.end_of(I2((
over1=mdl.overlap_length(I3,(start1,end1(
然后我最大化超过1。 有了这个,我得到以下错误:
断言错误:为了表示固定间隔,"interval2"应该是两个整数的元组
实际上,start1 和 end1 是 CP 整数表达式。我没有找到转换或获取值的方法! 有没有人知道如何做到这一点?
谢谢
在最后一行中,start1 和 end1 需要是边界,它们必须是值而不是决策变量。因此,作为一种解决方法,您可以依靠人工间隔。
由于 OPL 非常接近文档,但恕我直言,让我向您展示 OPL 的方式更容易。
using CP;
dvar interval I1 in 0..20;
dvar interval I2 in 0..20;
dvar interval I3 in 0..20;
dvar int over1;
dvar int start1;
dvar int end1;
dvar interval artificialInterval;
maximize over1;
subject to
{
over1==overlapLength(I1,I2);
start1==maxl(startOf(I1),startOf(I2));
end1==minl(endOf(I1),endOf(I2));
startOf(artificialInterval)==start1;
endOf(artificialInterval)==end1;
over1==overlapLength(I3,artificialInterval);
}
工作正常