Мне сложно понять, как реализовать следующее MIQP (смешанное целочисленное квадратичное программирование) с линейными ограничениями в Matlab, вызывающем Gurobi.
Позвольте мне схематически объяснить мои настройки.
(1) x
- это неизвестно , и это вектор-столбец с размером 225x1
.
(2) Целевая функция (которая должна быть сведена к минимуму x
) выглядит как
, который можно переписать как
У меня есть скрипт Matlab, вычисляющий alpha, Q,c
(Q,c
разреженный), когда задано some_known_parameters1
:
function [alpha, Q,c]=matrix_objective_function(some_known_parameters1)
%...
end
(3) Ограничения являются линейными по x
, включают в себя равенства и неравенства и записываются в виде
У меня есть скрипт Matlab, вычисляющий Aeq,beq,Aineq,bineq
(Aeq,Aineq
разреженный), когда задано some_known_parameters2
:
function [Aeq,beq,Aineq,bineq]=constraints(some_known_parameters2)
%...
end
(4) Некоторые компоненты x
могут находиться в {0,1} . У меня есть скрипт Matlab, выдающий строку букв B
(двоичный), C
(непрерывный), когда задано some_known_parameters3
:
function type=binary_continuous(some_known_parameters3)
%...
end
Теперь мне нужно собрать (1) - (4) , используя Gurobi. Я изо всех сил пытаюсь понять, как. Я нашел этот пример, но он выглядит очень загадочным для меня. Ниже я сообщаю о некоторых строках, которые я пытался написать, но они неполные, и я хотел бы, чтобы ваша помощь завершила их.
clear
rng default
%Define some_known_parameters1,
some_known_parameters2,some_known_parameters3 [...]
%1) generate alpha,Q,c,Aeq,beq,Aineq,bineq,type with Q,c,Aeq, Aineq sparse
[alpha, Q,c]=matrix_objective_function(some_known_parameters1)
[Aeq,beq,Aineq,bineq]=constraints(some_known_parameters2)
type=binary_continuous(some_known_parameters3)
%2) Set up Gurobi
clear model;
model.A=[Aineq; Aeq];
model.rhs=full([bineq(:); beq(:)]);
model.sense=[repmat('<', size(Aineq,1),1); repmat('=', size(Aeq,1),1)];
model.Q=Q; %not sure?
model.alpha=alpha; %not sure?
model.c=c; %not sure?
model.vtype=type;
result=gurobi(model); %how do I get just the objective function here without the minimiser?
Вопросы:
(1) Я не уверен насчет
model.Q=Q;
model.alpha=alpha;
model.c=c;
Я просто пытаюсь установить матрицы целевой функции, используя буквы здесь , но это дает мне ошибку. Мне кажется, пример здесь делает
model.Q=Q;
model.obj=c;
Но тогда как мне установить alpha
? Это игнорирует это, потому что это не меняет набор решений?
(2) Как получить в качестве выходных данных, хранящихся в матрице, только минимальное значение целевой функции без соответствующего x
?