Поэлементное умножение в среде JuMP

Я пытаюсь реализовать следующее ограничение в среде JuMP:

@constraint(m, ((c*x) + (p*o)) + (r.*z) - d .== g')

К сожалению, я получаю следующую ошибку ERROR: MethodError: no method matching append

Но попытка простого поэлементного умножения не вернет никакой ошибки и правильно реализует ее в модели.

Вот минимальный пример, с которым я работаю.

 m = Model(solver = GLPKSolverLP());
np = 3; #number of products
c = [3 7 5;
     6 5 7;
     3 6 5;
     -28 -40 -32];
g = [200 200 200 -1500];
n = length(g);
o = [1 1 1]';
@variable(m, x[1:np] >= 0);
@variable(m, d[1:n] >= 0);
@variable(m, z[1:n] >= 0);
@variable(m, r[1:n] >= 0);
@variable(m, p[1:n,1:np] >= 0);
@objective(m, Min, sum(d));
@constraint(m, ((c*x) + (p*o)) + (r.*z) - d .== g')

person Marco Repetto    schedule 15.08.2018    source источник


Ответы (1)


Кажется, что возникает проблема, когда вы добавляете квадратичный член к линейному члену, а квадратичный член находится справа от добавления внутри макроса @constraint.

Есть два решения:

A. Запишите квадратичный член первым следующим образом:

@constraint(m, (r.*z) + ((c*x) + (p*o)) - d .== g')

Б. определить левую часть уравнения снаружи (и теперь порядок членов не имеет значения)

constr = ((c*x) + (p*o)) + (r.*z) - d
@constraint(m, constr .== g')

В качестве побочного примечания: ваша проблема квадратичная, поэтому GLPKSolverLP не решит ее, поскольку не допускает таких ограничений.

person Bogumił Kamiński    schedule 15.08.2018