这个算法很反人类,迭代过程相当复杂,最优化老师说:“明确地告诉你要考的。” 起作用集方法适用于消元法和Lagrange方法无法处理的不等式约束二次规化问题。其主要思想是:以已知点为可行点,只考虑将该点的起作用约束,最小化
f
(
x
)
f(x)
f(x),得到新的可行点后重复以上做法。
一、起作用集法适用情形
适用于具有不等式约束的二次规划问题
m
i
n
f
(
x
)
=
1
2
x
T
H
x
+
c
T
x
s
.
t
.
A
x
⩾
b
min \ \ \ f(x)=\frac{1}{2}x^THx+c^Tx \\ s.t. \ \ \ Ax\geqslant b
minf(x)=21xTHx+cTxs.t.Ax⩾b
(1)初始化:初始可行点
x
(
1
)
x^{(1)}
x(1),作用约束集
I
(
1
)
I^{(1)}
I(1),置
k
=
1
k=1
k=1; (2)解增量
δ
\delta
δ:这时构建增量求解问题:
m
i
n
1
2
δ
T
H
δ
+
▽
f
(
x
(
k
)
)
T
δ
s
.
t
.
a
i
δ
=
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)}
min21δ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
δ,这一步将增量视为移动方向
d
d
d,即
d
(
k
)
=
δ
(
k
)
d^{(k)}=\delta^{(k)}
d(k)=δ(k)。变动过程为:
x
(
k
+
1
)
=
x
(
k
)
+
α
^
k
d
(
k
)
x^{(k+1)}=x^{(k)}+\widehat\alpha_{k}d^{(k)}
x(k+1)=x(k)+αkd(k) 步长的选取首先要保证新点是一个可行点,不能违背
x
(
k
)
x^{(k)}
x(k)的非作用下标集中约束,即:
a
i
(
x
(
k
)
+
α
^
k
d
(
k
)
)
⩾
b
i
,
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:
i
f
a
i
d
(
k
)
<
0
:
α
^
k
=
b
i
−
a
i
x
(
k
)
a
i
d
(
k
)
\mathbf{if} \ \ \ a^i d^{(k)}<0\ \ :\ \ \ \widehat\alpha_{k}=\frac{b_i-a^ix^{(k)}}{a^id^{(k)}}
ifaid(k)<0:αk=aid(k)bi−aix(k) 考察所有非作用约束集对应的约束式,可以求出多个
α
^
k
\widehat\alpha_{k}
αk,进而对其求最小。同时还要注意,最终
α
^
k
\widehat\alpha_{k}
αk的取值还要跟1进行比较:
α
k
=
m
i
n
(
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
λ:
λ
=
R
g
k
=
(
A
H
−
1
A
T
)
−
1
A
H
−
1
g
k
\lambda=Rg_k=(AH^{-1}A^T)^{-1}AH^{-1}g_k
λ=Rgk=(AH−1AT)−1AH−1gk 其中
g
k
=
▽
f
(
x
(
k
)
)
g_k=\triangledown f(x^{(k)})
gk=▽f(x(k)),是当前迭代点的梯度。 得到每个作用约束对应的乘子之后,进行第三次分流分析:
若
λ
<
0
\lambda<0
λ<0,挑选出最小的
λ
\lambda
λ,在起作用约束集
I
I
I中去掉下标,返回步骤2计算增量
δ
\delta
δ。 若
λ
⩾
0
\lambda\geqslant0
λ⩾0,当前解
x
(
k
)
x_{(k)}
x(k)是最优解。