если условие в ампе - PullRequest
0 голосов
/ 07 мая 2019

Я новичок в amp и хочу использовать условие if со следующей информацией:

У меня есть двоичная переменная X [p, r], где {p в P, r в R},Теперь я хочу сделать новое ограничение таким, чтобы использовалась переменная R [p, r], где X [p, r] = 0.Я не знаю, как я могу написать это или даже если усилитель может справиться с этим или нет, я пробовал следующее ограничение, но они не работали:

s.t. a1{r in R, p in P and X[p,r]=0}: 
s.t. a2{r in R p in P and X[p,r]=0};
s.t. a2{r in R ,p in P, and X[p,r]=0};
s.t. a2{r in R, p in P: and X[p,r]=0};

1 Ответ

1 голос
/ 07 мая 2019

Нельзя включить переменную решения в часть ограничения «для всех» (в AMPL - часть внутри {...}).Вместо этого вам нужно встроить в само ограничение логику, которая говорит, что ограничение активно, только если X[p,r] = 0.Способ сделать это зависит от типа ограничения:> =, = или <=.Я напишу каждый случай отдельно, и я сделаю это в общем виде, а не конкретно для вашей проблемы. </p>

В приведенном ниже объяснении я предполагаю, что ограничение записывается как

a[1]y[1] + ... + a[n]y[n] >=/=/<= b, 

, где a[i] и b - константы, а y[i] - переменные решения.Я также предполагаю, что мы хотим, чтобы ограничение сохранялось, если x = 0, где x - двоичная переменная решения, и нам не важно, выполняется ли ограничение, если x = 1.

Пусть M будет новым параметром (константой), равным большому числу.

Ограничения, превышающие или равные:

Ограничение a[1]y[1] + ... + a[n]y[n] >= b.Перепишите его как

a[1]y[1] + ... + a[n]y[n] >= b - Mx.

Тогда, если x = 0, ограничение выполнено, и если x = 1, оно не имеет никакого эффекта, так как правая часть очень отрицательна.

(Если все a[i] неотрицательны, вы можете вместо этого использовать

a[1]y[1] + ... + a[n]y[n] >= bx,

, что является более жестким.)

Ограничения меньше или равны:

Ограничение a[1]y[1] + ... + a[n]y[n] <= b.Перепишите его как

a[1]y[1] + ... + a[n]y[n] <= b + Mx.

Затем, если x = 0, ограничение выполнено, и если x = 1, оно не имеет никакого эффекта, поскольку RHS очень велико.

Равенствоограничения:

Ограничение a[1]y[1] + ... + a[n]y[n] = b.Перепишите его как

a[1]y[1] + ... + a[n]y[n] <= b + Mx
a[1]y[1] + ... + a[n]y[n] >= b - Mx.

Затем, если x = 0, выполняется ограничение равенства, а если x = 1, ограничения не действуют.

Примечание :Если ваша модель относительно велика, т. Е. На ее решение уходит немалое количество времени, вам следует быть осторожным с составами большого типа M.В частности, вы хотите, чтобы M было как можно меньше, но при этом применялась бы логика вышеуказанных ограничений.

...