Matlab 调用 Gurobi 中具有线性约束的混合整数二次规划

Mixed Integer Quadratic Programming with linear constraints in Matlab calling Gurobi

我很难理解如何在调用 Gurobi 的 Matlab 中使用线性约束实现以下 MIQP(混合整数二次规划)。

让我以示意图的方式解释一下我的设置。


(1) xunknown,它是一个大小为 225x1 的列向量。


(2) objective 函数(应该最小化到 x)看起来像

可以改写为

我有一个计算 alpha, Q,cQ,c 稀疏)的 Matlab 脚本,当给定 some_known_parameters1 时:

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

%...

end

(3) 约束x中是线性的,包括等式和不等式,写成如下形式

当给出 some_known_parameters2 时,我有一个 Matlab 脚本计算 Aeq,beq,Aineq,bineqAeq,Aineq 稀疏):

function [Aeq,beq,Aineq,bineq]=constraints(some_known_parameters2)

%...

end

(4) x 的一些 组件被限制在 {0,1 }。当给出 some_known_parameters3 时,我有一个 Matlab 脚本生成一串字母 B(二进制),C(连续):

function type=binary_continuous(some_known_parameters3)

%...

end

现在,我需要使用 Gurobi 将 (1)-(4) 放在一起。我很难理解如何。我找到了 this 示例,但对我来说它看起来很神秘。下面我报告了一些我试图写的行,但它们不完整,我希望你能帮助完成它们。

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;

我只是想使用提供的字母设置 objective 函数的矩阵 here but it gives me error. The example here 在我看来

model.Q=Q; 
model.obj=c; 

但是我该如何设置alpha?是不是因为它不改变解决方案的集合而忽略它?

(2) 如何将 objective 函数的最小值作为输出存储在矩阵中,而没有相应的 x

(1) 是的,没有必要传递常量alpha,因为它不影响最优解。 Gurobi 的 MATLAB API 只接受稀疏矩阵。此外 model.obj 始终是问题陈述中的 c 向量:

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

(2) 要获得最优的objective值,首先需要将你的模型传递给gurobi并求解。然后你可以通过 objval 属性访问它:

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