OPL运筹学条件约束

问题描述 投票:0回答:1

是否有解决方法可以正确表达此模型:

using CP;

int fooSize[0..3]=[2,2,3,2];
dvar interval foo[t in 0..3] size fooSize[t];
dvar int bar[0..3] in 0..1;

dexpr int stop = max(t in 0..3) endOf(foo[t]);

minimize stop;
subject to{
    all(ordered u,v in 0..3: bar[u]==bar[v])
        startOf(foo[u])>=endOf(foo[v]) || startOf(foo[v])>=endOf(foo[u]);
}

OPLIDE 告诉我决策变量

bar
未经授权。我也尝试过:

forall(ordered u,v in 0..3)
    (bar[u]==bar[v]) => (startOf(foo[u])>=endOf(foo[v]) || startOf(foo[v])>=endOf(foo[u]));

但它似乎不起作用,求解器只是挂起几个小时。顺便问一下,我应该如何调试 OPL 模型?如果您需要具体信息,请告诉我。

一般来说,有没有办法根据决策变量的值来调节约束?

constraint-programming
1个回答
1
投票

您不能使用决策变量进行切片。

你可以写:

    using CP;

int fooSize[0..3]=[2,2,3,2];
dvar interval foo[t in 0..3] in 0..10000 size fooSize[t];
dvar int bar[0..3] in 0..1;

dexpr int stop = max(t in 0..3) endOf(foo[t]);

minimize stop;
subject to{
    forall(ordered u,v in 0..3)
        (bar[u]==bar[v]) =>  (startOf(foo[u])>=endOf(foo[v]) || startOf(foo[v])>=endOf(foo[u]));
}

在 CPLEX OPL IDE 内有一个调试器。文档中对此进行了描述:IDE 和 OPL > 入门套件 > 从运筹学到 CPLEX Studio 和 ODM Enterprise。

© www.soinside.com 2019 - 2024. All rights reserved.