罚函数法又称乘子法,是将约束优化问题转换为无约束最优化问题的方法之一。其基本思想就是通过在原始的目标函数中添加一个障碍函数(也可以理解成惩罚函数)来代替约束条件中的不等式约束。如果当前解不满足约束条件,就在目标项上加上一个正向的惩罚(这里考虑的都是最小化问题),强迫当前解往可行域的方向走。至于正向惩罚的力度,取决于所用的映射函数,即惩罚函数。
一、非线性规划模型
minf(x) s. t. gi(x)⩽0,i=1,⋯,phj(x)=0,j=1,⋯,q
其中,f(x),gi(x)(i=1,2,⋯,p)和 hj(x)(j=1,2,⋯,q) 是Rn上的连续函数。
!!!注意:后面惩罚函数的选取与这个模型相关,如果不等式约束方向相反惩罚函数就有所不同,也可以理解为该模型就是标准型。
由于约束条件是非线性的,不能用消元法将其转换为无约束问题,在求解时需同时考虑目标函数值下降和满足约束条件。可以通过由目标函数和约束条件组成惩罚函数,将原问题转化为极小化惩罚函数的无约束问题。
二、惩罚函数外点法
惩罚函数基本思想:通过构造惩罚函数将约束问题转化为无约束问题,进而用无约束最优化方法求解。主要分为内点法和外点法。注意:罚函数法对目标函数的凹凸性没有要求,且结合启发式算法(如遗传算法、蚁群算法、禁忌搜索等)几乎可以求解任何问题,因为启发式算法无需目标函数的梯度等信息。外点法不保证搜索点保持在可行域内(搜索范围包括可行域和不可行域),适用于包含不等式约束或等式约束的优化问题。
惩罚函数为:
ϕ(x,r(k))=f(x)+r(k)p∑i=1{max[0,gi(x)]}2
其中,r(k)为趋于无穷大的严格递增正数列,r(k)=Cr(k−1)且C>1,limk→∞r(k)=∞。迭代点在可行域内时,惩罚项为0,惩罚函数等于原函数;迭代点在可行域外时,惩罚项大于0,大于原函数。因此,由于罚因子严格递增,随着迭代进行,可以迫使惩罚项趋于0,从而逼近原函数。

参数选择
初始点x(0),可行域及非可行域内均可。
初始罚因子r(0)的选择对算法的成败和计算效率有显著影响。选取过小,则无约束求解的次数增多,收敛速度慢;选取过大,则非可行域内惩罚函数比原函数大得多,在起作用约束边界处产生尖点,函数形态变坏,从而限制了某些无约束优化方法的使用,导致计算失败。
罚因子递增系数C (一般取C=[5,10])
算法步骤
(1)在n维空间任取初始点x(0) 。
(2)选取初始罚因子r(0),递增系数C,并置k=0。
(3)求解无约束优化问题minϕ(x,r(k)) ,得到最优点x∗k 。
(4)当k=0时转步骤5,否则转步骤6。
(5)置 k=k+1,r(k+1)=Cr(k),x(0)k+1=x∗k 。
(6)由终止准则,若满足则结束算法,输出最优解;否则转步骤5。
三、实例
例1:用外点法求等式约束问题
min12x21+16x22s.t.x1+x2=1
【解】(外点罚函数法)
① 构造罚函数
F(x,Mk)=12x21+16x22+Mk(x1+x2−1)2
② 求偏导
∂F∂x1=x1+2Mk(x1+x2−1)=0(1)
∂F∂x1=13x2+2Mk(x1+x2−1)=0(2)
③ 联立两个偏导式,求驻点,并得到 x1和x2的表达式
联立 (1)和(2),得
x2=3x1(3)
将(3)代回 (1),得到
x1+2Mk(4x1−1)=0
x1=2Mk1+8Mk
根据 (3),得到
x2=3x1=6Mk1+8Mk
x∗=[22Mk+8,62Mk+8]T(4)
④ 令Mk→∞,得到结果
x∗=[14,34]T
例2:求解非线性规划。
min f(X)=x1+x2 s.t. x21−x2≤0−x1≤0
解:构造惩罚函数
P(X,M)=x1+x2+M[max(0,x21−x2)]2+M[max(0,−x1)]2
考察其驻点, 令
∂P∂x1=1+2M[max(0,x21−x2)](2x1)−2M[max(0,−x1)]=0∂P∂x2=1−2M[max(0,x21−x2)]=0
对于可行域外的点 (满足 x1<0,x2<0 ), 可解得驻点
{1+2M(x21−x2)(2x1)+2Mx1=01−2M(x21−x2)=0
解得 ⎧⎨⎩x1=−12(1+M)x2=14(1+M)2−12M 令 M→+∞, 则 {x1→0x2→0, 而 [00]T 是可行点 → 问题的最优解。
例3:用惩罚函数法解如下非线性规划问题。
minf(x1,x2)=2x1+2x2+2s.t.{−x1+x22≤1x2≥5
解:将问题改写为
minf(x1,x2)=2x1+2x2+2s.t.{g1(x)=−x1+x22−1≤0g2(x)=−x2+5≤0
参考文献
- 惩罚函数法
- 最优化方法——乘子法和外点罚函数法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!