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

Matlab中带线性约束的混合整数二次规划调用Gurobi,matlab,optimization,gurobi,quadratic-programming,mixed-integer-programming,Matlab,Optimization,Gurobi,Quadratic Programming,Mixed Integer Programming,我很难理解如何在Matlab中调用Gurobi实现以下带有线性约束的MIQP(混合整数二次规划) 让我用图解的方式解释一下我的设置 (1)x是未知的,它是一个大小为225x1的列向量 (2)目标函数(应最小化至x)如下所示 可以重写为 我有一个Matlab脚本计算alpha,Q,c(Q,csparse),当给出一些已知参数1时: function [alpha, Q,c]=matrix_objective_function(some_known_parameters1) %... e

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

让我用图解的方式解释一下我的设置


(1)
x
未知的,它是一个大小为
225x1
的列向量


(2)目标函数(应最小化至
x
)如下所示

可以重写为

我有一个Matlab脚本计算
alpha,Q,c
Q,c
sparse),当
给出一些已知参数1
时:

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

%...

end

(3)约束在
x
中是线性的,包括等式和不等式,并以

我有一个Matlab脚本,当给定一些已知参数2时,计算Aeq、beq、Aineq、bineq(
Aeq、Aineq
sparse):

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

%...

end
function type=binary_continuous(some_known_parameters3)

%...

end

(4)某些
x
的组件被限制在{0,1}中。我有一个Matlab脚本,当给定一些已知参数3时,它会生成一个字母串
B
(二进制),
C
(连续):

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

%...

end
function type=binary_continuous(some_known_parameters3)

%...

end

现在,我需要使用Gurobi将(1)-(4)组合起来。我很难理解怎么做。我找到了一个例子,但对我来说它看起来很神秘。下面我报告了一些我试图写的行,但它们不完整,我希望您帮助完成它们

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?
我只是想用提供的字母来设置目标函数的矩阵,但它给了我错误。在我看来,这个例子似乎在起作用

model.Q=Q; 
model.obj=c; 
但是,如何设置
alpha
?它是否因为不改变解决方案集而忽略它

(2)如何将目标函数的最小值存储在矩阵中作为输出,而不使用相应的
x

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

model.Q = sparse(Q); 
model.obj = c;
(2) 要获得最佳目标值,首先需要将模型传递给gurobi并求解它。然后,您可以通过属性访问它:

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

你不应该期望能够给古洛比一些黑箱目标。这是NLP领域的情况(在NLP领域内部发生了某种形式的分化;例如Ipopt/Bonmin)。古洛比需要这个目标以其自身的形式。这是什么形式取决于您的lib/wrapper。在低级形式中,通常类似于
0.5*x'Qx+q'x
,带有q psd(凸QP;这可能是gurobi支持的唯一一种;忽略SOCP泛化)。如果这让你头疼,那就找一些更高级的包装器。例如,Gurobi的Python API支持
expr=QuadExpr(x*x+y+y)
@sascha谢谢:我的问题很基本,我想:(a)我认为我的目标函数可以重写为
Q+x'Hx
(我已经将此添加到我的问题中);(b) 我仍然不明白如何完成上面的步骤3)和4)。对于这个低级视图,这些都在中进行了解释。把你的目标带进来,设定
obj=some_-vec
objcon=some_-vec
Q=some_-matrix
。然后(4)只是一个字符串,看起来像是BBC(二进制,二进制,连续)。边界是向量
lb
ub
。vtypes是字符串。lb ub是向量。(-1,1),然后(1,3)和(2,3)之间的3个变量将是lb=[-1,1,2]和ub=[1,3,3]。这是一个建模问题。我建议你去买一些整数编程的书。您可以使用一个二进制变量,并用术语
x=1-2*binVar
替换所有发生的事件。那么x将在{1,1}中。是的,这在低级形式中很烦人(但是没有包装器/库支持是没有出路的)。但是任何人都不应该在这个层次上进行原型设计。