【问题标题】:How to convert/get the value of integer expression in cplex?如何在 cplex 中转换/获取整数表达式的值?
【发布时间】:2020-01-24 13:03:24
【问题描述】:

我是 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整数表达式。我没有找到转换或获得价值的方法! 有没有人知道如何做到这一点?

谢谢,

【问题讨论】:

    标签: type-conversion integer overlap cplex docplex


    【解决方案1】:

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

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

    工作正常

    【讨论】:

    • 谢谢,我已尝试实现您的提议,但在 docplex 中我无法分配值 startOf(artificialInterval)==start1;所以我尝试将其添加为约束,但它不起作用......
    猜你喜欢
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多