最小化具有非线性约束的二次函数

计算科学 优化 非线性规划
2021-12-20 10:13:16

尝试解决最小化二次函数的问题的好方法(和/或软件包)是什么f(x)=i=1N(xiyi)2, 英石0xi1,并且还有更多的约束,其中一些是非线性的(和不可微的),例如ixi1xi>a<b?

我在考虑N100. FWIW,Matlab 显然使用的是“主动集方法,类似于 Gill 等人的方法”,其性能有些不平衡。

2个回答

如果您有非平滑约束,那么您有一个凸二次目标也无济于事。您需要一个受约束的非光滑求解器。

有关合适的软件,请参阅我的网页
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)]