具有分段线性目标的开源二次规划

计算科学 优化 凸优化 开源的
2021-12-26 23:52:57

我正在寻找一个开源求解器来解决具有附加分段线性目标的二次规划问题,如下所示。问题相当小(是一个维度为 120 的向量)。x

maxx:xTq0xTP0xf(x)

请注意,上面的P0是半正定的,对于\mathbf{x}中的每个变量, f是分段线性的,但不是凸的。对于每个x_ii \in \left\{1, ..., 120\right\}f(x)将是坐标点的向量,例如xxii{1,...,120}f(x)

[(x_0, y_0), (x_1, y_1), ..., (x_N, y_N)]

对于任何给定的xif(xi)如下所示。

在此处输入图像描述

由于f不依赖于x中的任何交叉项,因此上述优化也可以写为

maxx:xTq0xTP0x(f(x1)+...+f(x120))

形式的线性约束。Ax<b

我在 Gurobi 中制定了这个问题,这个问题相当简单,但希望将其与开源求解器进行比较。环顾四周,GLPK 似乎可以解决这个问题,但我没有使用这个库的经验,所以希望能获得一些与这个或替代解决方案相关的信息。

使用 matlab API 的 gurobi 示例问题如下所示。

N = 2;

q_0 = [-3.31e3, -5.07e3];
P_0 = [-0.90e-04  -0.63e-04;
       -0.63e-04  -0.90e-04];

x = [-2.0000e9, -1.0000e9, -0.8000e9, -0.6000e9, -0.4000e9, -0.2500e9,...
    -0.1000e9, -0.0500e9, -0.0250e9, -0.0100e9, -0.0010e9, 0, 0.0010e9,...
    0.0100e9, 0.0250e9, 0.0500e9, 0.1000e9, 0.2500e9, 0.4000e9,...
    0.6000e9, 0.8000e9, 1.0000e9, 2.0000e9];

y = [2.938964e6, 0.753364e6, 0.488104e6, 0.280144e6, 0.129472e6,...
    0.053766e6, 0.011007e6, 0.003751e6, 0.001435e6, 0.000465e6,...
    0.000037e6, 0, 0.000037e6, 0.000465e6, 0.001435e6, 0.003751e6,...
    0.011007e6, 0.053766e6, 0.129472e6, 0.280144e6, 0.488104e6,...
    0.753364e6, 2.938964e6];

params.outputflag = 0;

%formulate model
model.obj = zeros(N, 1);
model.Q = sparse(P_0);
model.A = sparse(zeros(1, N));
model.sense = '=';
model.rhs = 0;
model.ub = repmat(1e9, N, 1);
model.lb = repmat(-1e9, N, 1);
model.modelsense = 'max';

% piecewise tcosts
for i = 1:2
    model.pwlobj(i).var = i;
    model.pwlobj(i).x   = x;
    model.pwlobj(i).y   = x * q_0(i) - y;
end

result = gurobi(model, params);
0个回答
没有发现任何回复~