Мне не ясно, означает ли ваш пример "ограничение A требует, чтобы x_[1]+...+x_[n]=4m+1
, где m
было целым числом", или "если x_[1]+...+x_[n]=4m+1
, где m
- целое число, то ограничение A требует некоторых других условий.будет выполнено ".
Первое тривиально для кода:
var m integer;
s.t. c1: sum{i in 1..n} x_[i] = 4m+1;
Требуется решатель с поддержкой MIP.Из ваших тегов я предполагаю, что вы используете CPLEX, что должно быть хорошо.
Для последнего: AMPL имеет некоторую поддержку логических ограничений, задокументированных здесь .В зависимости от вашей проблемы, иногда также возможно закодировать логические ограничения как линейные целочисленные ограничения.
Например, если переменные x[i]
в вашем примере также являются целыми числами, вы можете настроить их следующим образом:
var m integer;
var r1 integer in 0..1;
var r2 integer in 0..2;
s.t. c1: r2 <= 2*r1; # i.e. r2 can only be non-zero if r1 = 1
s.t. c2: sum{i in 1..n} x_[i] = 4m+r1+r2;
var remainder_is_1 binary;
s.t. c3: remainder_is_1 >= r1-r2;
s.t. c4: remainder_is_1 <= 1-r2/2;
Взятые вместе, эти ограничения гарантируют, что remainder_is_1
равно 1 тогда и только тогда, когда sum{i in 1..n} x_[i] = 4m+1
для некоторого целого числа m.Затем вы можете использовать эту переменную в других ограничениях.Такая хитрость может быть полезна, если у вас есть только несколько логических ограничений, но если у вас их много, будет эффективнее использовать параметры логических ограничений, если они вам доступны.