使用整数变量,在整数和二次规划的一些技巧之后,整个问题可以转换为 MILP。也许不是您想在您的情况下做的事情,但至少这是一种有保证的全局方法
可以使用线性约束和辅助变量来编写二进制和连续之间的乘法。
二进制多项式可以使用线性约束和辅助变量来编写。
有界整数变量可以使用二进制变量来编写。
内部 QP 的最优解可以使用 KKT 条件编写,涉及和之间的乘积以及互补性。yx
可以使用附加的二进制变量和约束来处理互补约束。
首先规范化符号并假设内部程序是最小化,受约束。最优解由 KKT 条件
cT(y)x+12xTQ(y)xEx≤f
Q(y)x+c(y)+ETλ=0λT(f−Ex)=0λ≥0f−Ex≥0
在满足最优性条件的任何点,目标等于。在我们希望最小化目标的外部程序中,我们因此想要最小化。12(c(y)Tx−fTλ)−12(c(y)Tx−fTλ)
我们注意到,我们有一个等式,其中涉及乘以的二次函数(因此可线性化)、互补性条件(可线性化)和目标中的双线性项(可线性化)。yx
有很多不同的东西可以放在一起。在下面的代码中,我将使用 MATLAB Toolbox YALMIP(免责声明:由我开发)对此进行测试。它具有用于线性化和互补性的 MILP 建模的内置功能。
% Define a random problem
n = 4;
B = randn(n);
B = B*B';
A = ones(1,n);
b = 1;
U = rand(n,1);
L = -rand(n,1);
E = [eye(n);-eye(n)];
f = [U;-L];
% Define decision variables
x = sdpvar(n,1);
% y is modelled as a selection from possible values
PossibleY = [-1;0;1];
Selector = binvar(n,length(PossibleY),'full');
y = Selector*PossibleY;
ConstrainSelection = sum(Selector,2) == 1
% Inner problem min_x c(y)'*x + .5*x'*Q(y)*x
lambda = sdpvar(length(f),1);
c = -y;
Q = 2*(B.*(y*y'));
Stationary = Q*x+c+E'*lambda == 0;
Complementarity = complements(lambda>=0, f - E*x>=0);
Objective = 0.5*(c'*x - f'*lambda);
% Objective we actually maximized in inner and whish o minimize in
% the outer problem
OuterObjective = -Objective;
% Linearize binary*binary and binary*continuous
LinearizedStationary = binmodel([Stationary,[L<=x<=U]]);
[LinearizedObjective,Cuts] = binmodel(OuterObjective,[L<=x<=U]);
% Solve the problem
optimize([LinearizedStationary,
Complementarity,
Cuts,
A*y == b,ConstrainSelection],LinearizedObjective)
% Check that the linearization actually worked
[value(LinearizedObjective) -value(c'*x + .5*x'*Q*x)]
% Small sanity check. Check by solving everything for fixed x, keeping
% kkt conditions, to ensure the new y still renders x optimal.
Objective = value(x)'*y - y'*(B.*(value(x*x')))*y;
[LinearizedObjective,Cuts] = binmodel(Objective);
LinearizedStationary = binmodel([Q*value(x)+c+E'*lambda == 0]);
optimize([Cuts,A*y == b,lambda>=0, lambda'*(f - E*value(x))==0,LinearizedStationary],LinearizedObjective)
value(Objective)