0

我是 Cplex 的新手。我需要同时计算几个间隔之间的重叠。为此,我一次计算两个间隔之间的重叠长度,并保存起点/终点的最大值和最小值。例如,让我们考虑三个区间变量 I1、I2、I3。目标是最大化三者之间的重叠。然后,代码如下:

over1=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)

然后我最大化over1。有了这个,我得到以下错误:

AssertionError:要表示固定间隔,'interval2' 应该是两个整数的元组

实际上,start1 和 end1 是 CP 整数表达式。我没有找到转换或获得价值的方法!有谁知道如何做到这一点?

谢谢,

4

1 回答 1

0

在你的最后一行 start1 和 end1 需要是界限,它们需要是值而不是决策变量。因此,作为一种解决方法,您可以依靠人为的间隔。

因为 OPL 非常接近 docplex,但恕我直言,我的观点更容易让我向您展示 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);
}   

工作正常

于 2020-01-24T16:36:26.893 回答