Как преобразовать / получить значение целочисленного выражения в cplex? - PullRequest
0 голосов
/ 24 января 2020

Я новичок в Cplex. Мне нужно вычислить перекрытие между несколькими интервалами одновременно. Для этого я вычисляю длину перекрытия между двумя интервалами за раз и сохраняю максимальное и минимальное значения начальной / конечной точек. Например, давайте рассмотрим три интервала Vars 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)

А затем я максимизирую оверлей 1. С этим я получаю следующую ошибку:

AssertionError: express фиксированный интервал, 'interval2' должен быть кортежем из двух целых чисел

На самом деле, start1 и end1 являются целочисленными выражениями CP. Я не нашел способа преобразовать или получить значение! Есть кто-нибудь, кто знает, как это сделать?

Спасибо

1 Ответ

0 голосов
/ 24 января 2020

В вашей последней строке 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);
}   

отлично работает

...