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