Поэлементное умножение в среде 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')
1 ответ
Решение
Кажется, что есть проблема, когда вы добавляете квадратный член к линейному члену, а квадратный член находится справа от сложения внутри @constraint
макро.
Есть два решения:
A. напишите квадратный термин как первый:
@constraint(m, (r.*z) + ((c*x) + (p*o)) - d .== g')
Б. определить LHS уравнения снаружи (и теперь порядок терминов не имеет значения)
constr = ((c*x) + (p*o)) + (r.*z) - d
@constraint(m, constr .== g')
В качестве примечания: ваша проблема является квадратичной, поэтому GLPKSolverLP
не решит это, так как не допускает таких ограничений.