Zimpl: нелинейное ограничение

У меня есть ограничение типа (в zmpl)

сумма (i,j) в S1: x[i,j]*c[i,j]<=100

где x - двоичная переменная двухмерного размера, а c [i, j] - параметр. Я хотел бы изменить это на

сумма (i,j) в S1: x [i, j] * c [i, сумма (i) x[i,j]]<=100

По сути, параметр во втором индексе зависит от количества выбранных переменных в i-й строке. Есть ли эффективный способ сделать это?

1 ответ

Во-первых: невозможно индексировать параметры с помощью выражений переменных, потому что это также делает их переменными.

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

set S2 := { 0..card(S1) }; # new set to model all possible outcomes of the sum operation

var y[S1] >= 0;   # y models nonnegative coefficients c[i,j]

var z[S2] binary; # models the value of the x-sum 

subto binlink: sum <i,j> in S1: x[i,j] - sum <s> in S2: s * z[s] == 0;
# binlink expresses the outcome of the x-sum in z

subto partition: sum <s> in S2: z[s] == 1; 
# maybe redundant because of binlink, but easy to write

subto coeflink: forall <i,j> in S1: y[i,j] == sum <s> in S2: c[i,s] * z[i,s]
#links continous coefficient variable to coefficient parameter

subto yourcons: sum <i,j> in S1: x[i,j] * y[i,j] <= 100;
# finally...

Обратите внимание, что эта формулировка является нелинейной, но я думаю, что стоит попробовать. Его эффективность в значительной степени зависит от количества "динамических коэффициентов" в вашей формулировке и размера набора S2, определенного в моем ответе.

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