как я могу использовать, если условие в усилителе? - PullRequest
0 голосов
/ 24 января 2019

Мне интересно, можно ли использовать оператор в усилителе?У меня есть набор переменных x_{1},...,x_{n} и некоторые ограничения.Теперь у меня есть некоторые ограничения, которые действительны при некоторых обстоятельствах.например, если x_{1}+...+x_{n}=kn+1, где `k - целое число, то ограничение A допустимо.Есть ли способ, которым я могу написать это в Amp?

Другими словами, проблема в том, что я хочу искать слой за слоем в возможном правлении.слой является точечным произведением между точкой x = (x1, ..., xn) и вектором 1 = (1,1,1, ... 1).поэтому

если 1 > = 1, то x должен удовлетворять ограничению A <1, если = 2, то x должен удовлетворять ограничению B <2,.,,это то, что я нашел на сайте AMPL, но это не работает!(n - размерность x и k произвольное целое число) </p>

    subject to Time {if < x,1 > =kn+1}:

    s.t. S1: A<1;

1 Ответ

0 голосов
/ 25 января 2019

Мне не ясно, означает ли ваш пример "ограничение 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.Затем вы можете использовать эту переменную в других ограничениях.Такая хитрость может быть полезна, если у вас есть только несколько логических ограничений, но если у вас их много, будет эффективнее использовать параметры логических ограничений, если они вам доступны.

...