Смешанное целочисленное квадратичное программирование с линейными ограничениями в Matlab, вызывающем Gurobi - PullRequest
0 голосов
/ 12 ноября 2018

Мне сложно понять, как реализовать следующее MIQP (смешанное целочисленное квадратичное программирование) с линейными ограничениями в Matlab, вызывающем Gurobi.

Позвольте мне схематически объяснить мои настройки.


(1) x - это неизвестно , и это вектор-столбец с размером 225x1.


(2) Целевая функция (которая должна быть сведена к минимуму x) выглядит как

enter image description here

, который можно переписать как

enter image description here

У меня есть скрипт Matlab, вычисляющий alpha, Q,c (Q,c разреженный), когда задано some_known_parameters1:

function [alpha, Q,c]=matrix_objective_function(some_known_parameters1)

%...

end

(3) Ограничения являются линейными по x, включают в себя равенства и неравенства и записываются в виде enter image description here

У меня есть скрипт 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?

1 Ответ

0 голосов
/ 15 ноября 2018

(1) Вы правы, нет необходимости передавать константу альфа, поскольку она не влияет на оптимальное решение.MATLAB API Gurobi принимает только разреженные матрицы.Более того, model.obj всегда является вектором c в постановке задачи:

model.Q = sparse(Q); 
model.obj = c;

(2) Чтобы получить оптимальное объективное значение, вам сначала нужно передать модель в gurobi и решить ее.Затем вы можете получить к нему доступ через атрибут objval :

results = gurobi(model);
val = results.objval + alpha
...