Как ограничить переменную в зависимости от значения другой переменной в Gecode
Я работаю с инструментарием Gecode и хочу смоделировать следующий сценарий.
У меня есть две переменные х и у. В зависимости от значения х, у должно быть определенного значения. Например, если x равен 1, y должен быть 3, если x равен 2, y должен быть 5. Как мне смоделировать это в Gecode?
В настоящее время я использую ограничения reified, чтобы смоделировать эту ситуацию, как можно видеть в этой сути. Суть в том, чтобы использовать 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);
}
Мне было интересно, есть ли лучший способ смоделировать эту ситуацию.
2 ответа
Функциональное преобразование из x в y (т. Е. В такое, где каждому значению x назначается одно значение для y) лучше всего выполнять через ограничение элемента, если это возможно. Ограничение принимает массив, который отображает домен x в домен y, начиная с нулевого индекса.
Для вашего примера вы можете использовать следующее (при условии, что invalid
Int не в области y
):
IntArgs mapping(3, invalid, 3, 5);
element(*this, mapping, x, y);
Одним из способов сделать это является использование логических выражений (например, раздел 7.1.2 "Булевские выражения и отношения" MPG) с использованием конструкции implication ("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 также поддерживает эквивалентность (используя ==
вместо этого, если >>
) для получения этого отношения в обе стороны.