乘子法时针对外部罚函数法的改进方法,由于外部罚函数法随着罚因子的增大,增广目标函数的Hesse矩阵条件数会逐渐增大,从而导致在实际计算中,数值计算的稳定性也会变得越来越差,难以精确求解。乘子法改由在约束问题的Lagrange函数中加入相应的惩罚,使得在求解无约束问题时,罚因子不必趋于无穷大就能求到约束问题的最优解,而且数值计算的稳定性也能得到很好的保证。
等式约束
等式约束的H乘子法
H乘子法全称为Hesternes乘子法。
首先考虑如下的等式约束问题(用向量形式进行表示)
那么问题(1)的Lagrange函数为
首先需要明确的是,使用乘子法求解问题(1)时的增广目标函数是
下面我们会直接给出一些引理和定理,不会对引理和定理进行证明。
引理1 设
U
是
定理2 在约束问题(1)中,如果最优解
x∗∈Rn
和Lagrange乘子
λ∗∈Rl
满足二阶充分条件(见最优性条件的定理2),那么就存在非负数
μ∗
,使得当
μ≥μ∗
时,
x∗
也是
F(x,λ∗,μ)
的严格局部极小点。
该定理表明,对公式(6)使用外部罚函数法的时候,只要罚因子不小于某一个潜在的非负数,就能保证
F(x,λ∗,μ)
的(局部)极小点恰是(1)的(局部)极小点。
现在求解以(8)为目标函数的无约束极小化问题。
定理3 设对于给定的参数 λ 和 μ , x∗ 是公式(9)的最优解,那么 x∗ 是问题(1)的最优解,且 λ 为相应的Lagrange乘子向量 λ∗ 的充要条件是 h(x∗)=0 ,即 x∗∈D 。
定理2结合定理3说明:如果恰好选取参数 λ 为 λ∗ ,选择 μ≥μ∗ ,然后求解公式(9)而得出的最优解 x∗ 恰好是问题(1)的容许点,那么 x∗ 就是问题(1)的最优解。
算法:等式约束问题的H乘子法
已知:目标函数 f(X) ,等式约束函数 h1(x),h2(x),...,hl(x) ;终止限 ϵ ;常数 θ∈(0,1)
(1)选定初始点 x0 ,乘子向量的初始估计 λ1 ,初始罚因子 μ ,罚因子的放大系数 c(>1) ,置 k=1
(2)以 xk−1 为初始点,求解无约束问题 minxF(x,λk,μ)
(3)若 ||h(xk)||≤ϵ ,则打印 xk ,停止;否则,转(4)
(4)若 ||h(xk)||/||h(xk−1)||≤θ ,则转(5);否则,置 μ=cμ ,然后转(5)
(5)计算 λk+1=λk−2μh(xk) ;置 k=k+1 ,转(2)。
通过以上算法我们知道, λ∗ 是通过迭代求出的,迭代公式为
对于给定的 λ=λk ,设 xk 是公式(9),即
等式约束的P乘子法
P乘子法全称为Powell乘子法,与H乘子法的差别时它对每一个约束使用了不同的罚因子。P乘子法的增广目标函数为
算法:等式约束的P乘子法
已知:目标函数 f(x) ,等式约束函数 h1(x),h2(x),...,hl(x) ;终止限 ϵ ;常熟 θ∈(0,1)
(1)选定初始点 x0 ,乘子向量的初始估计 λ1 ,初始罚因子向量 μ1 ,罚因子的放大系统 c ;置k=1
(2)以 xk−1 为初始点,求解以公式(13)为目标函数的极小化问题minF(x,λk,μk)设其极小点为 xk
(3)若 ||h(xk)||<ϵ ,则打印 xk ,停止;否则转(4)
(4)对 j=1,2,...,l ,一次判别 |hi(xk)hj(xk−1)|<θ 是否成立:若成立,则置 μ(k+1)j=μ(k)j ;否则,置 μ(k+1)j=cμ(k)j ,直至判别结束,然后转(5)
(5)对 j=1,2,...,l 一次计算 λ(k+1)j=λ(k)j−2μ(k+1)jhj(xK) ;置 k+k+1 ,转(2)
计算实践证明,P乘子法比H乘子法效果好。
不等式约束
这里将介绍Rockafellar乘子法,他是把H乘子法巧妙的用到不等式约束问题上而得到的求解仅含不等式约束问题的一种方法。
考虑不等式约束问题
一般约束
对于一般约束问题
可以得到增广目标函数为
乘子迭代公式为
算法:一般约束问题的H乘子法
已知:目标函数 f(x) ,不等式约束函数 s1(x),...,sm(x) ,等式约束函数 h1(x),...,hl(x) ;终止限 ϵ ;尝试 θ∈(0,1) ,设中驰判别函数为ϕk=⎛⎝∑i=1m⎡⎣min⎧⎩⎨si(xk),v(k)i2μ⎫⎭⎬⎤⎦2+∑j=1l[hj(xk)]2⎞⎠1/2
(1)选定初始点 x0 ,乘子向量初始估计 v1 和 λ1 ,初始罚因子 μ ,罚因子方法系数 c(>1) ;计算 ϕ0 ;置 k=1
(2)以 xk−1 为初始点,求解minxF(x,vk,λk,μ)设 xk 为其极小点。
(3)计算 ϕk ,若 ϕk<ϵ ,则输出 xk ,停止;否则,转(4)
(4)若 ϕk/phi(k−1)≤θ ,则转(5);否则,置 μ=cμ ,转(5)
(5)按公式(20)计算乘子 v(k+1)i,...,v(k+1)m,λ(k+1)1,...,λ(k+1)l ,置 k=k+1 ,转(2)