我很难理解如何在Matlab调用Gurobi中实现具有线性约束的以下MIQP(混合整数二次编程)。
让我以示意图的方式说明我的设置。
(1) x
是未知,它是大小为225x1
的列向量。
(2) 目标函数(应最小化为wrto x
)
可以重写为
当给定alpha, Q,c
时,我有一个Matlab脚本计算Q,c
(稀疏some_known_parameters1
:
function [alpha, Q,c]=matrix_objective_function(some_known_parameters1)
%...
end
当给定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
呢?
答案 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