Как ограничить переменную в зависимости от значения другой переменной в 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 также поддерживает эквивалентность (используя == вместо этого, если >>) для получения этого отношения в обе стороны.

Другие вопросы по тегам