尝试解决最小化二次函数的问题的好方法(和/或软件包)是什么, 英石,并且还有更多的约束,其中一些是非线性的(和不可微的),例如?
我在考虑. FWIW,Matlab 显然使用的是“主动集方法,类似于 Gill 等人的方法”,其性能有些不平衡。
尝试解决最小化二次函数的问题的好方法(和/或软件包)是什么, 英石,并且还有更多的约束,其中一些是非线性的(和不可微的),例如?
我在考虑. FWIW,Matlab 显然使用的是“主动集方法,类似于 Gill 等人的方法”,其性能有些不平衡。
如果您有非平滑约束,那么您有一个凸二次目标也无济于事。您需要一个受约束的非光滑求解器。
有关合适的软件,请参阅我的网页
http://www.mat.univie.ac.at/~neum/glopt/software_l.html#nonsm 。
你在评论中说你不能让它工作,因为它不够二次。我看不出有任何理由。该问题很容易编码为混合整数二次程序。
如果我理解您的问题定义,您希望将变量的总和限制为大于阈值。引入一个二进制变量来指示 x 是否大于 a,并引入另一个变量 z,当它成立时它应该等于 x,否则为零,并使用新变量的总和。
使用 MATLAB 工具箱 YALMIP 连接 CPLEX(或 Gurobi 或任何其他 MIQP 求解器),问题在几分之一秒内就可以轻松解决。这里是一个随机示例,使用手动导出的模型和利用 YALMIP 中的高级建模功能的模型实现
% Create random data
N = 100;
y = rand(N,1);
a = rand(N,1);
b = rand(1);
% Decision variables
x = sdpvar(N,1);
z = sdpvar(N,1);
d = binvar(N,1);
% Define objective
Objective = (x-y)'*(x-y)
% High-level model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [implies(x-a>=0,d), implies(d,z==x), implies(1-d,z==0)]
Con3 = [sum(z) <= b];
% Solve problem
solvesdp([Con1,Con2,Con3],Objective)
% display solution
[double(x) a double(z)]
% Manually derived model
Con1 = [0 <= x <= 1,0 <= z <=1];
Con2 = [x-a <= d, -(1-d) <= x-z <= 1-d, z <= d];
Con3 = [sum(z) <= b];
Objective = (x-y)'*(x-y)
solvesdp([Con1,Con2,Con3],Objective)
[double(x) a double(z)]