主要内容

多线性约束的二次规划

这个例子展示了quadprog“激活集”与默认情况相比,算法在存在许多线性约束的情况下执行“interior-point-convex”算法。进一步,拉格朗日乘子“激活集”算法在非活动约束下完全为零,这在寻找活动约束时很有帮助。

问题描述

创建一个伪随机二次问题N变量和10 * N线性不等式约束。指定N = 150

rng默认的%为了重现性N = 150;rng默认的A = randn([10*N,N]);b = 10*ones(size(A,1),1);f = sqrt(N)*rand(N,1);H = 18*eye(N) + randn(N);H = H + H';

检查得到的二次矩阵是否为凸矩阵。

ee = min(eig(H))
Ee = 3.6976

所有的特征值都是正的,所以是二次式x ' * H * x是凸的。

不包含线性等式约束或边界。

Aeq = [];Beq = [];Lb = [];Ub = [];

用两种算法解决问题

设置选项以使用quadprog“激活集”算法。该算法需要一个初始点。设置初始点x0是一个长度为0的向量N

Opts = optimoptions(“quadprog”“算法”“激活集”);x0 = 0 (N,1);

计时解决方案。

tic [xa,fvala,eflag,output,lambdaa] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,opts);
满足约束条件的最小值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。<停止标准细节>
toc
运行时间为0.042058秒。

将解决方案时间与默认时间进行比较“interior-point-convex”算法。

tic [xi,fvali,eflagi,output,lambdai] = quadprog(H,f,A,b);
满足约束条件的最小值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。<停止标准细节>
toc
运行时间为2.305694秒。

有效集的算法在具有许多线性约束的问题上要快得多。

检查拉格朗日乘数

“激活集”该算法只报告了与线性约束矩阵相关的拉格朗日乘子结构中的少数非零项。

nnz (lambdaa.ineqlin)
Ans = 14

相比之下,“interior-point-convex”算法返回一个包含所有非零元素的拉格朗日乘子结构。

nnz (lambdai.ineqlin)
Ans = 1500

几乎所有的拉格朗日乘数都小于N *每股收益大小。

nnz(abs(lambdai.ineqlin) > N*eps)
Ans = 20

换句话说,“激活集”算法给出了拉格朗日乘子结构中主动约束的明确指示,而“interior-point-convex”算法没有。

另请参阅

|

相关的话题