1. 基本概念

罚函数法又称乘子法,是将约束优化问题转换为无约束最优化问题的方法之一。其基本思想就是通过在原始的目标函数中添加一个障碍函数(也可以理解成惩罚函数)来代替约束条件中的不等式约束。如果当前解不满足约束条件,就在目标项上加上一个正向的惩罚(这里考虑的都是最小化问题),强迫当前解往可行域的方向走。至于正向惩罚的力度,取决于所用的映射函数,即惩罚函数。

2. 数学定义

考虑约束优化问题:

1) 对于等式约束问题,

可采用前面提到的拉格朗日乘子法。这里我们做一些简化,对每个约束项采用相同的权重,定义如下辅助函数:

其中,δ

\deltaδ为足够大的正数。注意,这里的约束项都加了平方。前面我们提过了,不满足约束要加上一个正向的惩罚。为了保证正向这个条件,同时方便后期求导,就给约束项加上了平方。

从而,问题(1)被转化为无约束问题:

min

F

1

(

x

,

δ

)

\min F_1(x, \delta)minF1​(x,δ) (3)

显然,(3)取最优解时,h

j

(

x

)

h_j (x)hj​(x)趋近于0。因为如果不这样的话,δ

h

j

2

(

x

)

\delta \sum h_j ^2 (x)δ∑hj2​(x)将是非常大的正数,那一定存在更小的值。由此可见,求解问题(3)就能得到问题(1)的近似解。

2)对于不等式约束问题,

思路与上面基本思想一致,也是引入辅助函数:

F

(

x

,

δ

)

=

f

(

x

)

+

i

=

1

m

I

(

g

i

(

x

)

)

F(x, \delta)=f(x)+\sum_{i=1} ^m I(g_i(x))F(x,δ)=f(x)+∑i=1m​I(gi​(x)) (5)

其中,I

(

u

)

I(u)I(u)即为惩罚函数(等式约束时可以理解惩罚函数为平方函数,即I

(

u

)

=

u

2

I(u)=u^2I(u)=u2),其须符合如下特性:

在可行域内,惩罚函数值等于一个趋近于0的值

不在可行域内,惩罚函数值等于一个很大的正数

对于不等式约束,引入惩罚函数的意义在于可以将约束条件直接写入到目标函数里面,这样我们直接求新的函数的极小值就可以了,而不必借助于未知乘子。这种方法统称为罚函数法。

3. 罚函数法

可分为两类:内点法和外点法。主要区别就在于惩罚函数的定义。

3.1 内点法

内点法比较完美主义,思想十分直观。满足约束就惩罚为0,不满足就正无穷大,看你老不老实。其设定的惩罚函数需要满足如下要求,

I

(

u

)

=

{

u

0

0

u

>

0

I(u) = {\infinu≤00u>0I(u)={∞0​u≤0u>0​

我们从它的函数图像(下图的红线)也可以看出,就好像是一堵墙一样的函数,在没有违反约束时,函数值为0,当违反约束时,函数值为正无穷。即在可行域边界时,惩罚力度会发生突变。由此也带来了一个问题,那就是惩罚函数在某些点上是不可导的,因此在求函数极小值的时候我们没法通过普通的微分法来确定函数的极小值。

为了规避这个问题,我们可以用一个光滑的函数来近似这个这个完美的函数。比如上图中的几条蓝色曲线表示的函数来近似这个函数。这样一个近似的函数的表达式如下:

I

(

u

)

=

1

t

l

o

g

(

u

)

I(u) = - \dfrac{1}{t} log(-u)I(u)=−t1​log(−u)

其中 ,t是用于调整近似程度的参数。从图中可以看出,t越大近似效果越好。

那要怎样理解这种方法呢?

相当于在可行域的边界筑起一道很高的“围墙”,当迭代点靠近边界时,目标函数徒然增大,以示惩罚,阻止迭代点穿越边界,这样就可以将最优解“挡”在可行域之内了。

也正因为这一点,使用该方法必须保证初始值在可行域内,这一点也极大的限制了该方法的使用。

3.2 外点法

相比内点法,外点法要成熟的多。既然前面太极端了,那就折中一下:满足约束的时候惩罚为0没错,不满足的时候,惩罚跟当前的偏离程度呈正相关,毕竟狗急了还跳墙呢,咱也不能逼得太狠了是吧!其设定的惩罚函数需要满足如下要求,

I

(

u

)

=

max

{

0

,

u

}

=

{

u

u

0

0

u

>

0

I(u) = \max\{0, -u\}={uu≤00u>0I(u)=max{0,−u}={u0​u≤0u>0​

这个函数大家应该都很熟悉了,深度学习里常用的ReLU函数关于y轴对称一下就是这个了。这里的惩罚力度是固定的,为了方便调节针对性的调整惩罚力度,同时方便求导,调整一下,

I

(

u

)

=

δ

(

max

{

0

,

u

}

)

2

I(u) = \delta (\max\{0, -u\})^2I(u)=δ(max{0,−u})2

其中,δ

\deltaδ为足够大的正数,为惩罚因子。内点法是不需要惩罚因子的,因为内点法的惩罚为无穷大,乘以一个正数也还是无穷大。可以看到,外点法的惩罚力度取决于惩罚因子δ

\deltaδ的大小。

相比于内点法,外点法可以从非可行解出发,逐步移动到可行域内,这就意味着使用外点法不需要提供初始可行解。这一点在实际问题求解中十分关键,毕竟对于复杂问题,找到一组可行解还是有一定难度的。但是,外点法多了一个超参:惩罚因子,如何设定合适的惩罚因子也会极大的影响最终的结果。

原文链接:https://blog.csdn.net/SkullSky/article/details/107621121

python内点法_最优化问题(三) 之 外点法(罚函数法)相关推荐

  1. python核心理念_《三天搞定Python基础概念之第一天》中文版

    前言: 首先,非常感谢Jiang老师将其分享出来!本课件非常经典! 经过笔者亲测,竟然确实只要三天,便可管中窥豹洞见Python及主要库的应用.实属难得诚意之作! 其次,只是鉴于Jiang老师提供的原 ...

  2. 冒泡排序 python内置_除了冒泡排序,你知道Python内建的排序算法吗?

    选自hackernoon,作者:Brandon Skerritt,机器之心编译,参与:高璇.思源.对于编程算法,可能很多读者在学校第一个了解的就是冒泡排序,但是你真的知道 Python 内建排序算法 ...

  3. python 定义变量_第三章(第2节):变量和常量

    变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型,比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型. 所谓常量就是不能改变 ...

  4. python 内推_用Python实现内推外插法

    用Python实现内推外插法 用 Python 实现内推外插法 Author Z Date 2015 12 3 import numpy as np class node object def ini ...

  5. python 内推_网易有道2017内推编程题 洗牌(python)

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  6. python 内推_[宜配屋]听图阁

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  7. python宇晨_第三十届全国青少年科技创新大赛青少年科技创意作品中学组.PDF

    第三十届全国青少年科技创新大赛青少年科技创意作品中学组 附件3 第三十届全国青少年科技创新大赛 青少年科技创意作品中学组和大学组 二.三等奖获奖名单 一.中学组科技创意作品 (按奖项和作品编号排序) ...

  8. pytest测试框架_聊聊 Python 的单元测试框架(三):最火的 pytest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 一.介绍 本篇文章是<聊聊 Python 的单元测试框架>的第三篇,前两篇分别介绍了标准库 unittes ...

  9. python内置标准库不可以处理的文件是_精华 | 140种Python标准库、第三方库和外部工具都有了...

    原标题:精华 | 140种Python标准库.第三方库和外部工具都有了 作者 | 宋天龙 来源 | 大数据(ID:hzdashuju) [导读]Python数据工具箱涵盖从数据源到数据可视化的完整流程 ...

  10. python序列类型包括哪三种映射类型_python序列类型包括哪三种_后端开发

    python中表达式4+0.5值的数据类型为?_后端开发 python中表达式4+0.5值的数据类型为浮点型,因为4是整型,0.5是浮点型,在python中规定整型和浮点型相加,结果是浮点型,这是为了 ...

最新文章

  1. MVC3项目依赖文件错误解决
  2. php5模块怎么下载,centos源码编译php5 mcrypt模块步骤详解
  3. Node+Vue实现对数据的增删改查
  4. 【渝粤教育】 国家开放大学2020年春季 2064管理学基础 参考试题
  5. 细数阿里云服务器的十二种典型应用场景
  6. 2016年事记与感悟
  7. sql出现无法启动(model数据库)
  8. #include #import @class 讲解
  9. Struts,Spring 等开源项目svn 地址
  10. wildfly access log 开启
  11. C语言实现九九乘法表(四种情况)
  12. linux下搭建radius服务器,CentOS下Radius服务器搭建
  13. python信息安全书籍_2018年信息安全从业者书单推荐
  14. 机器学习原来如此有趣:如何用深度学习进行语音识别 #精选APPLEAR
  15. Hadoop数字统计
  16. vivox21支持html,vivo X21支持快充吗_vivo X21支持无线充电吗-太平洋IT百科
  17. C++中抽象类的简单使用
  18. cmap用法,很详细(转)
  19. win7安装eclipse
  20. 计算机软件由程序数据和文档组成其中主体是,chap03 计算机软件

热门文章

  1. Excel易用宝-安装与激活
  2. Mysql之sql注入
  3. 计算机键盘灯光怎么关闭,电脑关机键盘灯一直亮着解决方法
  4. app软件怎么开发 盘点3种app制作方式
  5. 单片机破解的常用方法及应对策略
  6. 深度学习--激活函数之sigmoid激活函数
  7. SRA数据下载以及转换格式
  8. 结构梁配筋最牛插件_结构设计最让人困惑的问题解析汇总
  9. 集成电路和芯片的联系与区别
  10. J2EE框架(StrutsHibernateSpring)的理解