Как ограничить переменную в зависимости от значения другой переменной в Gecode

Я работаю с набором инструментов Gecode и хочу смоделировать следующий сценарий.

У меня есть две переменные x и y. В зависимости от значения x, y должен иметь определенное значение. Например. если x равно 1, y должно быть 3, если x равно 2, y должно быть 5. Каким должно быть Я моделирую это в Gecode?

В настоящее время я использую овеществленные ограничения для моделирования этой ситуации, насколько это возможно. можно увидеть в этой сути. Суть заключается в использовании BoolVar и двух объединенных ограничений для установки соответствующих значений.

for (IntVarValues i(x); i(); ++i) {
    BoolVar b = BoolVar(*this, 0, 1);
    rel(*this, x, IRT_EQ, i.val(), b);
    rel(*this, y, IRT_EQ, f(i.val), b);
}

Мне было интересно, есть ли лучший способ смоделировать эту ситуацию.


person dvberkel    schedule 26.04.2014    source источник


Ответы (2)


Функциональное преобразование x в y (то есть такое, при котором каждому значению x присваивается одно значение y) лучше всего выполнять с помощью ограничение элемента, когда это возможно. Ограничение принимает массив, который отображает область значений x в область значений y, начиная с нулевого индекса.

В вашем примере вы можете использовать следующее (при условии, что invalid является int не в домене y):

IntArgs mapping(3,  invalid, 3, 5);
element(*this, mapping, x, y);
person Zayenz    schedule 28.04.2014

Один из способов сделать это - использовать логические выражения (например, раздел 7.1.2 MPG «Логические выражения и отношения») с использованием конструкции импликации («if else») с >>. Вот примеры, которые вы упомянули.

// if x == 1 then y == 3
rel(*this, (x == 1) >> (y == 3)); 
// if x == 2 then y == 5
rel(*this, (x == 2) >> (y == 5)); 

Обратите внимание, что Gecode также поддерживает эквивалентность (используя == вместо >>) для получения этого отношения в обоих направлениях.

person hakank    schedule 26.04.2014
comment
Обратите внимание, что использование логических выражений - это всего лишь еще один синтаксис для построения повторных выражений. - person Zayenz; 28.04.2014