约束优化算法是一类专门处理目标函数在存在约束条件下求解最优解的方法。为了更好地理解约束优化算法,我们需要了解一些核心概念和基本方法。
约束优化的核心概念
- 可行域(Feasible Region):
- 比喻:想象你在一个园艺场里种植不同种类的植物,但只有特定区域可以种植。可行域就是这些允许种植的区域。
- 技术细节:可行域是满足所有约束条件的所有点的集合。若约束条件为 g i ( x ) ≤ 0 g_i(x) \leq 0 gi(x)≤0 和 h j ( x ) = 0 h_j(x) = 0 hj(x)=0 ,则可行域可以表示为 { x ∣ g i ( x ) ≤ 0 , h j ( x ) = 0 } \{ x \, | \, g_i(x) \leq 0, \, h_j(x) = 0 \} {x∣gi(x)≤0,hj(x)=0} 。
- 拉格朗日乘子法(Lagrange Multipliers):
- 比喻:假设你在调整种植区域时,既想保持植物健康生长(目标函数),又要遵循园艺场的规定(约束条件)。拉格朗日乘子法就像在这两者之间找到一个平衡点。
- 技术细节:拉格朗日乘子法引入拉格朗日乘子 λ \lambda λ ,构造拉格朗日函数 L ( x , λ ) = f ( x ) + λ g ( x ) L(x, \lambda) = f(x) + \lambda g(x) L(x,λ)=f(x)+λg(x) 。通过求解 ∇ L = 0 \nabla L = 0 ∇L=0 可以找到约束优化问题的解。
常用的约束优化算法
- 罚函数法(Penalty Method):
- 比喻:罚函数法就像在种植区域外种植植物时会受到罚款,这样你会尽量保持在可行域内。
- 技术细节:将约束条件转换为目标函数的一部分,加上一个惩罚项,使得在违反约束条件时目标函数的值变得很大。例如,对于约束 g ( x ) ≤ 0 g(x) \leq 0 g(x)≤0 ,构造目标函数 f ( x ) + 1 2 ρ max ( 0 , g ( x ) ) 2 f(x) + \frac{1}{2}\rho \max(0, g(x))^2 f(x)+21ρmax(0,g(x))2 ,其中 ρ \rho ρ 是罚参数。
- 障碍函数法(Barrier Method):
- 比喻:障碍函数法就像在可行域边界设置了障碍物,防止你越过边界。
- 技术细节:引入障碍函数 ϕ ( x ) \phi(x) ϕ(x) ,当 x x x 靠近约束边界时,障碍函数值趋于无穷大。例如,对于约束 g ( x ) ≤ 0 g(x) \leq 0 g(x)≤0 ,构造目标函数 f ( x ) − μ log ( − g ( x ) ) f(x) - \mu \log(-g(x)) f(x)−μlog(−g(x)) ,其中 μ \mu μ 是障碍参数。
- 拉格朗日乘子法(Lagrangian Method):
- 比喻:拉格朗日乘子法就像同时调整种植区域和遵守规定的权重,使两者达到平衡。
- 技术细节:构造拉格朗日函数 L ( x , λ , ν ) = f ( x ) + ∑ λ i g i ( x ) + ∑ ν j h j ( x ) L(x, \lambda, \nu) = f(x) + \sum \lambda_i g_i(x) + \sum \nu_j h_j(x) L(x,λ,ν)=f(x)+∑λigi(x)+∑νjhj(x) ,通过求解 ∇ L = 0 \nabla L = 0 ∇L=0 可以找到问题的鞍点,从而求解优化问题。
实例一
让我们通过一个实例来具体了解约束优化的过程:
假设我们要最小化函数 f ( x ) = x 1 2 + x 2 2 f(x) = x_1^2 + x_2^2 f(x)=x12+x22 ,但有约束 g ( x ) = x 1 + x 2 − 1 ≤ 0 g(x) = x_1 + x_2 - 1 \leq 0 g(x)=x1+x2−1≤0 。
- 罚函数法:
- 构造罚函数: P ( x ) = x 1 2 + x 2 2 + 1 2 ρ max ( 0 , x 1 + x 2 − 1 ) 2 P(x) = x_1^2 + x_2^2 + \frac{1}{2}\rho \max(0, x_1 + x_2 - 1)^2 P(x)=x12+x22+21ρmax(0,x1+x2−1)2 。
- 当 x 1 + x 2 ≤ 1 x_1 + x_2 \leq 1 x1+x2≤1 时,无惩罚项;当 x 1 + x 2 > 1 x_1 + x_2 > 1 x1+x2>1 时,有惩罚项,导致目标函数值增加。【目标是使目标函数最小】
- 障碍函数法:
- 构造障碍函数: B ( x ) = x 1 2 + x 2 2 − μ log ( 1 − x 1 − x 2 ) B(x) = x_1^2 + x_2^2 - \mu \log(1 - x_1 - x_2) B(x)=x12+x22−μlog(1−x1−x2) 。
- 当 x 1 + x 2 x_1 + x_2 x1+x2 接近 1 1 1 时, − log ( 1 − x 1 − x 2 ) -\log(1 - x_1 - x_2) −log(1−x1−x2) 的值趋于无穷大,使得目标函数值增大。
- 拉格朗日乘子法:
- 构造拉格朗日函数: L ( x , λ ) = x 1 2 + x 2 2 + λ ( x 1 + x 2 − 1 ) L(x, \lambda) = x_1^2 + x_2^2 + \lambda (x_1 + x_2 - 1) L(x,λ)=x12+x22+λ(x1+x2−1) 。
- 求解 ∇ L = 0 \nabla L = 0 ∇L=0 得到: 2 x 1 + λ = 0 2x_1 + \lambda = 0 2x1+λ=0 , 2 x 2 + λ = 0 2x_2 + \lambda = 0 2x2+λ=0 , x 1 + x 2 − 1 = 0 x_1 + x_2 - 1 = 0 x1+x2−1=0 。
- 解得 x 1 = x 2 = 1 2 , λ = − 1 x_1 = x_2 = \frac{1}{2} ,\lambda = -1 x1=x2=21,λ=−1。
实例二
我们需要最小化函数 f ( x , y ) = x + 3 y f(x, y) = x + \sqrt{3}y f(x,y)=x+3y ,并且满足约束条件 x 2 + y 2 = 1 x^2 + y^2 = 1 x2+y2=1 。
罚函数法
-
构造罚函数:
首先,我们将约束条件转换为一个惩罚项。对于约束条件 x 2 + y 2 = 1 x^2 + y^2 = 1 x2+y2=1 ,我们可以构造以下罚函数: P ( x , y ) = ( x 2 + y 2 − 1 ) 2 P(x, y) = (x^2 + y^2 - 1)^2 P(x,y)=(x2+y2−1)2这里,我们使用平方形式来确保任何违约束的情况都会被显著地惩罚。
-
构造新的目标函数:
将惩罚项加入到目标函数中,形成新的目标函数: F ( x , y ) = x + 3 y + ρ 2 ( x 2 + y 2 − 1 ) 2 F(x, y) = x + \sqrt{3}y + \frac{\rho}{2} (x^2 + y^2 - 1)^2 F(x,y)=x+3y+2ρ(x2+y2−1)2其中, ρ \rho ρ 是一个正的罚参数,用来调整惩罚项的权重。
-
求解优化问题:
我们的目标是找到使新的目标函数 F ( x , y ) F(x, y) F(x,y) 最小的 x x x 和 y y y 值。
-
图 6.1 的解释
图的描述
这两个图展示了二次罚函数在不同罚参数 σ \sigma σ 值时的等高线图。等高线图是一种展示三维地形的方法,其中每条线表示函数值相同的点的集合。
- 左图 (a) σ = 1 \sigma = 1 σ=1:
- 这个图显示了当罚参数 σ = 1 \sigma = 1 σ=1 时的情况。等高线显示目标函数在不同点的值分布。
- 右图 (b) σ = 10 \sigma = 10 σ=10:
- 这个图显示了当罚参数 σ = 10 \sigma = 10 σ=10 时的情况。我们可以看到等高线的形状和分布与左图有明显的不同。
图的含义
1. 罚函数的作用
罚函数的目的是将违反约束条件的解显著地惩罚,使得优化过程更倾向于在可行域内找到最优解。罚参数 σ \sigma σ 控制了这个惩罚的强度。
- 低罚参数 σ = 1 \sigma = 1 σ=1:惩罚强度较低,等高线分布较为平缓。违反约束条件的解不会受到很大的惩罚,因此优化过程可能会在可行域外找到较低的函数值点。
- 高罚参数 σ = 10 \sigma = 10 σ=10:惩罚强度较高,等高线分布较为陡峭。违反约束条件的解会受到显著的惩罚,因此优化过程更倾向于在可行域内找到最优解。
2. 等高线的变化
等高线的形状和分布反映了目标函数值在不同点的变化情况。
- 左图 (a):当 σ = 1 \sigma = 1 σ=1 时,等高线较为平滑,表明目标函数值的变化较为缓慢,罚函数的影响较小。
- 右图 (b):当 σ = 10 \sigma = 10 σ=10 时,等高线变得更为密集和复杂,表明目标函数值在靠近约束边界时变化迅速,罚函数的影响显著增加。
详细解析
为了更好地理解这个图,让我们回顾一下罚函数法的目标函数形式:
F ( x , y ) = x + 3 y + σ 2 ( x 2 + y 2 − 1 ) 2 F(x, y) = x + \sqrt{3}y + \frac{\sigma}{2} (x^2 + y^2 - 1)^2 F(x,y)=x+3y+2σ(x2+y2−1)2
- 原始目标函数: f ( x , y ) = x + 3 y f(x, y) = x + \sqrt{3}y f(x,y)=x+3y
- 罚函数: P ( x , y ) = σ 2 ( x 2 + y 2 − 1 ) 2 P(x, y) = \frac{\sigma}{2} (x^2 + y^2 - 1)^2 P(x,y)=2σ(x2+y2−1)2
随着 σ \sigma σ 的增加,罚函数的影响变得更加显著。这意味着在优化过程中,违反约束条件 x 2 + y 2 = 1 x^2 + y^2 = 1 x2+y2=1 的点会被显著地惩罚,使得优化算法更倾向于找到满足约束条件的最优解。
直观解释
想象你在平地上行走(左图 (a)),地面比较平坦,因此你可以随意移动。但是,当地面上突然出现很多山谷和山峰(右图 (b)),你就会倾向于沿着较为平坦的区域移动,以避免爬山或下谷。高罚参数 σ \sigma σ 就像这些山谷和山峰,迫使你在可行域内找到最优路径。
总结
- 低罚参数 σ \sigma σ 使得优化过程在可行域外也能找到较低的目标函数值点,但可能不满足约束条件。
- 高罚参数 σ \sigma σ 强制优化过程在可行域内找到最优解,因为违反约束条件的点会被显著惩罚。
- 左图 (a) σ = 1 \sigma = 1 σ=1:
二次罚函数法算法详解
基本概念
- 目标函数:我们想最小化的函数。例如, f ( x , y ) = x + 3 y f(x, y) = x + \sqrt{3}y f(x,y)=x+3y 。
- 约束条件:限制条件,必须满足。例如, x 2 + y 2 = 1 x^2 + y^2 = 1 x2+y2=1 。
罚函数法通过将约束条件转换为惩罚项,加入到目标函数中,从而形成新的目标函数。这个新目标函数在每次迭代时会逐步增加惩罚力度,使得解最终满足约束条件。
步骤解析
第一步:初始化
- 给定初始罚参数 σ 1 > 0 \sigma_1 > 0 σ1>0:
- 这是初始的惩罚参数。惩罚参数决定了违反约束条件时受到的惩罚程度。
- 例如,设定 σ 1 = 1 \sigma_1 = 1 σ1=1。
- 设定初始点 x 0 x^0 x0:
- 这是我们开始优化的初始猜测值。
- 例如, x 0 = [ 0.5 , 0.5 ] x^0 = [0.5, 0.5] x0=[0.5,0.5] 。
- 设定迭代次数 k ← 1 k \leftarrow 1 k←1:
- 这是一个计数器,用于跟踪迭代次数。
- 设定惩罚因子增长系数 ρ > 1 \rho > 1 ρ>1:
- 这是一个用来增加惩罚参数的因子,每次迭代后惩罚参数会乘以这个因子。
- 例如,设定 ρ = 10 \rho = 10 ρ=10。
第二步:迭代过程
while
循环:- 这个循环会持续运行,直到满足某个收敛准则(例如,目标函数值变化很小,或达到最大迭代次数)。
- 以当前点为初始点,求解新的点:
-
我们要最小化新的目标函数 P E ( x , σ k ) P_E(x, \sigma_k) PE(x,σk) ,找到新的 x k + 1 x^{k+1} xk+1 。
-
新的目标函数形式为:
P E ( x , σ k ) = f ( x ) + σ k 2 ( x 2 + y 2 − 1 ) 2 P_E(x, \sigma_k) = f(x) + \frac{\sigma_k}{2} (x^2 + y^2 - 1)^2 PE(x,σk)=f(x)+2σk(x2+y2−1)2
-
使用数值优化方法(如梯度下降法)来求解这个新的目标函数。
-
- 更新罚参数:
- 计算新的罚参数 σ k + 1 = ρ σ k \sigma_{k+1} = \rho \sigma_k σk+1=ρσk。
- 更新迭代次数:
- k ← k + 1 k \leftarrow k + 1 k←k+1 。
- 结束迭代:
- 当满足收敛准则时,结束
while
循环。
- 当满足收敛准则时,结束
详细解释与实例
初始化
我们设定初始参数:
σ 1 = 1 , x 0 = [ 0.5 , 0.5 ] , ρ = 10 , k = 1 \sigma_1 = 1, \quad x^0 = [0.5, 0.5], \quad \rho = 10, \quad k = 1 σ1=1,x0=[0.5,0.5],ρ=10,k=1
迭代过程
假设我们要最小化以下目标函数:
f ( x , y ) = x + 3 y f(x, y) = x + \sqrt{3}y f(x,y)=x+3y
并且满足约束条件:
x 2 + y 2 = 1 x^2 + y^2 = 1 x2+y2=1
第一次迭代
-
构造新的目标函数:
P E ( x , σ 1 ) = x + 3 y + 1 2 σ 1 ( x 2 + y 2 − 1 ) 2 P_E(x, \sigma_1) = x + \sqrt{3}y + \frac{1}{2} \sigma_1 (x^2 + y^2 - 1)^2 PE(x,σ1)=x+3y+21σ1(x2+y2−1)2
其中 σ 1 = 1 \sigma_1 = 1 σ1=1。
-
求解新目标函数:
使用数值优化方法找到最小化 P E ( x , 1 ) P_E(x, 1) PE(x,1) 的 x x x 和 y y y 值。
假设我们找到新的点 x 1 x^1 x1 。 -
更新罚参数:
σ 2 = ρ σ 1 = 10 × 1 = 10 \sigma_2 = \rho \sigma_1 = 10 \times 1 = 10 σ2=ρσ1=10×1=10
-
更新迭代次数:
k ← 2 k \leftarrow 2 k←2
第二次迭代
-
构造新的目标函数:
P E ( x , σ 2 ) = x + 3 y + 1 2 σ 2 ( x 2 + y 2 − 1 ) 2 P_E(x, \sigma_2) = x + \sqrt{3}y + \frac{1}{2} \sigma_2 (x^2 + y^2 - 1)^2 PE(x,σ2)=x+3y+21σ2(x2+y2−1)2
其中 σ 2 = 10 \sigma_2 = 10 σ2=10。
-
求解新目标函数:
使用数值优化方法找到最小化 P E ( x , 10 ) P_E(x, 10) PE(x,10) 的 x x x 和 y y y 值。
假设我们找到新的点 x 2 x^2 x2 。 -
更新罚参数:
σ 3 = ρ σ 2 = 10 × 10 = 100 \sigma_3 = \rho \sigma_2 = 10 \times 10 = 100 σ3=ρσ2=10×10=100
-
更新迭代次数:
k ← 3 k \leftarrow 3 k←3
这个过程不断重复,直到满足收敛准则为止。
什么是收敛准则
收敛准则是用来决定优化算法何时停止迭代的标准。常见的收敛准则包括以下几种:
- 目标函数值变化很小:
- 如果在连续的迭代中,目标函数的值变化很小(小于某个阈值),则认为算法已收敛,可以停止迭代。
- 例如,设定阈值为 ϵ \epsilon ϵ,如果 ∣ f ( x k + 1 ) − f ( x k ) ∣ < ϵ |f(x^{k+1}) - f(x^k)| < \epsilon ∣f(xk+1)−f(xk)∣<ϵ,则停止迭代。
- 梯度值很小:
- 如果目标函数的梯度(或导数)值很小,表示已经到达了极值点附近,则可以停止迭代。
- 例如,如果 ∥ ∇ f ( x k ) ∥ < ϵ \|\nabla f(x^k)\| < \epsilon ∥∇f(xk)∥<ϵ,则停止迭代。
- 迭代次数达到上限:
- 如果迭代次数达到了预先设定的最大迭代次数,则停止迭代。
- 例如,设定最大迭代次数为 N N N,如果 k ≥ N k \geq N k≥N,则停止迭代。