这个算法很反人类,迭代过程相当复杂,最优化老师说:“明确地告诉你要考的。”
起作用集方法适用于消元法和Lagrange方法无法处理的不等式约束二次规化问题。其主要思想是:以已知点为可行点,只考虑将该点的起作用约束,最小化f(x)f(x)f(x),得到新的可行点后重复以上做法。
一、起作用集法适用情形
适用于具有不等式约束的二次规划问题min f(x)=12xTHx+cTxs.t. Ax⩾bmin \ \ \ f(x)=\frac{1}{2}x^THx+c^Tx \\ s.t. \ \ \ Ax\geqslant bmin f(x)=21xTHx+cTxs.t. Ax⩾b
二、起作用集法求解步骤
由于步骤太过繁琐,算法总是跳来跳去,所以在这里我只放上了我自己对于算法的分步与理解。算法可以分为一个初始+三个域,三个域分别为:解δ\deltaδ域、求α^k\widehat\alpha_{k}αk 域、算L乘子λ\lambdaλ域。
(1)初始化:初始可行点x(1)x^{(1)}x(1),作用约束集I(1)I^{(1)}I(1),置k=1k=1k=1;
(2)解增量δ\deltaδ:这时构建增量求解问题:min 12δTHδ+▽f(x(k))Tδs.t. aiδ=0,i∈I(k)min \ \ \ \frac{1}{2}\delta^TH\delta+\triangledown f(x^{(k)})^T\delta \\ s.t. \ \ \ a^{i}\delta= 0, i \in I^{(k)}min 21δTHδ+▽f(x(k))Tδs.t. aiδ=0,i∈I(k) 得到最优解δ(k)\delta^{(k)}δ(k)。此时进行第一次分流分析:
若δ(k)=0\delta^{(k)}=0δ(k)=0,则说明x(k)x^{(k)}x(k)无法再继续变动,则跳到第4步计算L乘子,判断最优解;
若δ(k)≠0\delta^{(k)}\neq 0δ(k)=0,需要对x(k)x^{(k)}x(k)进行变动,则跳到第3步,求解步长。
(3)求步长α^k\widehat\alpha_{k}αk:
上一步求解出了增量δ\deltaδ,这一步将增量视为移动方向ddd,即d(k)=δ(k)d^{(k)}=\delta^{(k)}d(k)=δ(k)。变动过程为:x(k+1)=x(k)+α^kd(k)x^{(k+1)}=x^{(k)}+\widehat\alpha_{k}d^{(k)}x(k+1)=x(k)+αkd(k) 步长的选取首先要保证新点是一个可行点,不能违背x(k)x^{(k)}x(k)的非作用下标集中约束,即:ai(x(k)+α^kd(k))⩾bi , i∉I(k)a^i(x^{(k)}+\widehat\alpha_{k}d^{(k)}) \geqslant b_i \ \ \ , \ \ \ i \notin I_{(k)}ai(x(k)+αkd(k))⩾bi , i∈/I(k) 在特定情况下左侧孤立α^k\widehat\alpha_{k}αk:if aid(k)<0 : α^k=bi−aix(k)aid(k)\mathbf{if} \ \ \ a^i d^{(k)}<0\ \ :\ \ \ \widehat\alpha_{k}=\frac{b_i-a^ix^{(k)}}{a^id^{(k)}}if aid(k)<0 : αk=aid(k)bi−aix(k) 考察所有非作用约束集对应的约束式,可以求出多个α^k\widehat\alpha_{k}αk,进而对其求最小。同时还要注意,最终α^k\widehat\alpha_{k}αk的取值还要跟1进行比较:αk=min(1,α^k)\alpha_{k}=min{(1,\widehat\alpha_{k})}αk=min(1,αk) 得到步长,此时进行第二次分流分析:(这一步无论结果如何都要更新x(k)x^{(k)}x(k),只是一个回去,一个继续)
若αk<1\alpha_{k}<1αk<1,原来非作用约束集中有一个约束式变为作用约束,小数步长直接更新x(k+1)x^{(k+1)}x(k+1)(算法中唯一更新x的地方),返回步骤2,重新计算增量δ\deltaδ;
若αk=1\alpha_{k}=1αk=1,此时的变动不会触动任何非作用约束,1步长直接更新x(k+1)x^{(k+1)}x(k+1)(算法中唯一更新x的地方),跳到第4步计算L乘子,判断最优解。
(4)计算L乘子λ\lambdaλ:
这一步是算法的出口,通过Lagrange方法最后给出的公式计算乘子λ\lambdaλ:λ=Rgk=(AH−1AT)−1AH−1gk\lambda=Rg_k=(AH^{-1}A^T)^{-1}AH^{-1}g_kλ=Rgk=(AH−1AT)−1AH−1gk 其中gk=▽f(x(k))g_k=\triangledown f(x^{(k)})gk=▽f(x(k)),是当前迭代点的梯度。
得到每个作用约束对应的乘子之后,进行第三次分流分析:
若λ<0\lambda<0λ<0,挑选出最小的λ\lambdaλ,在起作用约束集III中去掉下标,返回步骤2计算增量δ\deltaδ。
若λ⩾0\lambda\geqslant0λ⩾0,当前解x(k)x_{(k)}x(k)是最优解。
三、注
这个方法思想简单,但是每一块的计算都很精密,过程很繁琐。考试的时候一定要把思路写清楚。