在Matlab中称为Gurobi的具有线性约束的混合整数二次规划

时间:2018-11-12 19:01:40

标签: matlab optimization gurobi quadratic-programming mixed-integer-programming

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

让我以示意图的方式说明我的设置。


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


(2) 目标函数(应最小化为wrto x

enter image description here

可以重写为

enter image description here

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

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

%...

end

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

当给定Aeq,beq,Aineq,bineq时,我有一个Matlab脚本计算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

现在,我需要使用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;

我只是想使用here提供的字母来设置目标函数的矩阵,但这给了我错误。在我看来,here这个例子

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

但是我该如何设置alpha?是否因为它不会更改解决方案集而忽略它?

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

1 个答案:

答案 0 :(得分:1)

(1)是的,没有必要传递常数alpha,因为它不会影响最佳解决方案。 Gurobi的MATLAB API仅接受稀疏矩阵。此外,model.obj始终是问题语句中的c向量:

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

(2)为了获得最佳目标值,您首先需要将模型传递给gurobi并对其求解。然后,您可以通过objval属性访问它:

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