深入浅出最优化(7) 罚函数法

1 约束最优化问题

1.1 约束最优化问题的基本结构

在我们讨论完无约束最优化问题后,我们接着讨论约束最优化问题。在无约束最优化问题中,我们默认了可行域为 R n R^n Rn,然而在约束最优化问题中,我们需要为可行域做出一些限制,因此衍生出了一些与无约束最优化问题不同的、独有的性质。

一般约束最优化问题的表达为:

{ m i n f ( x ) g i ( x ) ≥ 0 , i ∈ I = { 1 , 2 , . . . , m 1 } h i ( x ) = 0 , j ∈ E = { m 1 + 1 , . . . , m } \begin{cases}minf(x)\\g_i(x)\geq0,i\in I=\{1,2,...,m_1\}\\h_i(x)=0,j\in E=\{m_1+1,...,m\}\end{cases} minf(x)gi(x)0,iI={1,2,...,m1}hi(x)=0,jE={m1+1,...,m}

其中 g ( x ) g(x) g(x)被称为不等式约束,而 h ( x ) h(x) h(x)被称为等式约束。这些约束限定了 f ( x ) f(x) f(x)的可行域为 D = { x ∣ g i ( x ) ≥ 0 , i ∈ I ; h j ( x ) = 0 , j ∈ E } D=\{x|g_i(x)\geq0,i\in I;h_j(x)=0,j\in E\} D={xgi(x)0,iI;hj(x)=0,jE}

解决约束最优化问题的方法主要有罚函数法拉格朗日乘子法。其中罚函数法较为简单,基本思想是将约束最优化问题转化为无约束最优化问题再用为无约束最优化问题的方法求解。

1.2 约束最优化问题实例

约束最优化问题比起理想模型,更多的是在实际生活中尤其是经济学领域的应用模型。比如,在每种原料有限的情况下,如果每种材料需要满足一定配比,如何规划生产可以使得开销最小。因此,约束最优化方法也被称为运筹学

下面提出一个约束最优化问题实例:

  1. 开销函数(最优化的目标函数): y = ( x 1 − 1 ) 2 + ( x 1 − x 2 ) 2 + ( x 2 − x 3 ) 2 y=(x_1-1)^2+(x_1-x_2)^2+(x_2-x_3)^2 y=(x11)2+(x1x2)2+(x2x3)2
  2. 配比限制(等式约束): x 1 ( 1 + x 2 2 ) + x 3 4 − 4 − 3 2 = 0 x_1(1+x_2^2)+x_3^4-4-3\sqrt{2}=0 x1(1+x22)+x34432 =0
  3. 原料限制(不等式约束): − 10 ≤ x i ≤ 10 , i = 1 , 2 , 3 -10\leq x_i\leq 10,i=1,2,3 10xi10,i=1,2,3

在接下来提出的方法中,我们将测试方法对以上实例的求解效果。

2 外点罚函数法

2.1 外点罚函数法步骤

对可行域外的点(即违反约束的点)施加惩罚,内部的点不惩罚,从而使迭代点向可行域D逼近。

如构造函数 F ( x ) = { f ( x ) x ∈ D + ∞ x ∉ D F(x)=\begin{cases}f(x)\quad x\in D\\+∞\quad x\notin D\end{cases} F(x)={f(x)xD+x/D,但这只是理想的情况,而且无法用无约束问题的方法求解。

构造辅助函数 F μ ( x ) = f ( x ) + μ S ( x ) F_\mu(x)=f(x)+\mu S(x) Fμ(x)=f(x)+μS(x) μ \mu μ为罚参数或罚因子, S ( x ) S(x) S(x)的值的大小反映x偏离可行域D的程度。

对于约束 g i ( x ) ≥ 0 , i ∈ I g_i(x)\geq 0,i\in I gi(x)0,iI h i ( x ) = h j ( x ) , j ∈ E h_i(x)=h_j(x),j\in E hi(x)=hj(x),jE,有 g i ( − ) ( x ) = m i n { g i ( x ) , 0 } , i ∈ I g_i^{(-)}(x)=min\{g_i(x),0\},i\in I gi()(x)=min{gi(x),0},iI h j ( − ) = h j ( x ) , j ∈ E h_j^{(-)}=h_j(x),j\in E hj()=hj(x),jE,则 S ( x ) = ∑ i ∈ I [ g i ( − ) ( x ) ] 2 + ∑ j ∈ E [ h j ( − ) ( x ) ] 2 S(x)=\displaystyle\sum_{i\in I}[g_i^{(-)}(x)]^2+\sum_{j\in E}[h_j^{(-)}(x)]^2 S(x)=iI[gi()(x)]2+jE[hj()(x)]2

随着 μ \mu μ不断变大,可行域外的函数值越往可行域边界折叠,像是形成了一堵墙壁,阻止向外迭代。若最优点不在可行域内,最终迭代到的点也会靠近边界。

在这里插入图片描述

步骤:

  1. 选定初始点 x 0 ∈ R n x_0\in R^n x0Rn,初始罚因子 μ 0 > 0 \mu_0>0 μ0>0,放大系数 σ > 1 \sigma>1 σ>1,精度 ϵ > 0 \epsilon>0 ϵ>0,置 k = 0 k=0 k=0
  2. 构造增广目标函数 F μ k ( x ) = f ( x ) + 1 2 μ k S ( x ) F_{\mu_k}(x)=f(x)+\frac{1}{2}\mu_kS(x) Fμk(x)=f(x)+21μkS(x)
  3. x k x_{k} xk为初始点求解无约束最优化问题 m i n F μ k ( x ) minF_{\mu_k}(x) minFμk(x),得解 x k x_k xk
  4. μ k S ( x ) < ϵ \mu_kS(x)<\epsilon μkS(x)<ϵ,则得解 x k x_k xk,停止迭代
  5. μ k + 1 = σ μ k , k = k + 1 \mu_{k+1}=\sigma\mu_k,k=k+1 μk+1=σμk,k=k+1,转步1

2.2 实战测试

对于本节2.1中提出的约束最优化问题, x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3的初值均在 [ 0 , 4 ] [0,4] [0,4]的范围内随机生成,总共生成100组起点。统计迭代成功(在1000步内得到最优解且单次步长搜索迭代次数不超过1000次)的样本的平均迭代步数、平均迭代时间和得到的最优解及开销函数最小值。

迭代步数迭代时间最优解函数最小值
11.95s x 1 = 1.1048   x 2 = 1.1965   x 3 = 1.5349 x_1=1.1048~x_2=1.1965~x_3=1.5349 x1=1.1048 x2=1.1965 x3=1.5349 0.03255 0.03255 0.03255

代码实现

使用共轭梯度PRP+法的外点罚函数法

本博客所有代码在https://github.com/HarmoniaLeo/optimization-in-a-nutshell开源,如果帮助到你,请点个star,谢谢这对我真的很重要!

你可以在上面的GitHub链接或本文集的第一篇文章深入浅出最优化(1) 最优化问题概念与基本知识中找到Function.py和lagb.py

import numpy as np
from Function import Function	#定义法求导工具
from lagb import *	#线性代数工具库
from scipy import linalg

n=3 #x的长度
mu=2 #μ的初值

def func(x):    #目标函数,x是一个包含所有参数的列表
    return (x[0]-1)**2+(x[0]-x[1])**2+(x[1]-x[2])**2

def hj(x):  #构造数组h,第j位是第j+1个等式限制条件计算的值,x是一个包含所有参数的列表
    return np.array([x[0]*(1+x[1]**2)+x[2]**4-4-3*np.sqrt(2)])

def gi(x):  #构造数组g,第i位是第i+1个不等式限制条件计算的值,x是一个包含所有参数的列表
    return np.array([x[0]+10,-x[0]+10])

def S(x):
    h=hj(x)
    g=gi(x)
    return np.sum(np.power(h,2))+np.sum(np.power(np.where(g<0,g,0),2))

def myFunc(x):
    return  func(x)+S(x)*mu*0.5

sigma2=1.5	#放大因子
e2=0.001
x=np.array([2.0,2.0,2.0])	#初值点
k1=0
while mu*S(x)>=e2:
    e=0.001
    beta1=1
    sigma=0.4
    rho=0.55
    tar=Function(myFunc)
    k=0
    d=-tar.grad(x)
    while tar.norm(x)>e:
        a=1
        if not (tar.value(x+a*d)<=tar.value(x)+rho*a*dot(turn(tar.grad(x)),d) and \
            np.abs(dot(turn(tar.grad(x+a*d)),d))>=sigma*dot(turn(tar.grad(x)),d)):
            a=beta1
            while tar.value(x+a*d)>tar.value(x)+rho*a*dot(turn(tar.grad(x)),d):
                a*=rho
            while np.abs(dot(turn(tar.grad(x+a*d)),d))<sigma*dot(turn(tar.grad(x)),d):
                a1=a/rho
                da=a1-a
                while tar.value(x+(a+da)*d)>tar.value(x)+rho*(a+da)*dot(turn(tar.grad(x)),d):
                    da*=rho
                a+=da
        lx=x
        x=x+a*d
        beta=np.max((dot(turn(tar.grad(x)),tar.grad(x)-tar.grad(lx))/(tar.norm(lx)**2),0))	#PRP+
        d=-tar.grad(x)+beta*d
        k+=1
        print(k1,k)
    mu*=sigma2
    k1+=1
print(x)

  • 15
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
重磅,史上最全的阿里云分享的云原生技术学习资料合集,共120份。 一、阿里云开源书合集 2020微服务领域开源数字化报告 阿里巴巴云原生技术与实践13讲 阿里巴巴云原生实践15讲 不一样的双11技术:阿里巴巴经济体云原生实践 深入浅出Kubernetes 云原生架构白皮书 Knative云原生应用开发指南 二、思维图合集 分布式系统大图 分布式系统知识体系大图 架构图思考路径 Go指南大图 三、大咖演讲 阿里巴巴 DevOps 的三架马车:基础设施、运维编排、监控 阿里巴巴 K8s 超大规模实践经验 阿里巴巴 Kubernetes 应用管理实践中的经验与教训 阿里巴巴超大规模神龙裸金属 Kubernetes 集群运维实践 阿里巴巴核心应用落地 Service Mesh 的挑战与机遇 阿里巴巴云原生开源探索与实践司徒放(姬风) 阿里云文件存储:K8s 云原生场景下的共享高性能存储 安全容器的发展与思考 拐点已至, 云原生引领数字化转型升级 拐点已至,云原生引领数字化转型升级易立 函数计算在 双11 小程序场景中的应用 基于 K8s 扩展机制实现 PaaS 平台云原生演进 金融级云原生 PaaS 探索与实践 客如云容器化改造经验 蚂蚁金服双十一 Service Mesh 超大规模落地揭秘 全民双十一:基于容器服务的大促备战 容器混合云趋势与展望 容器上云的攻与守 三维家的 Paas 平台建设与微服务架构 深入 Kubernetes 的“无人区”-蚂蚁金服双十一的调度系统 使用 Kubernetes 运行 MXNet 和 AutoTVM 谐云科技阿里云联合新品解读 云原生应用分发协同实践 Distributed Database on Cloud Edge Kubernetes - 构建边缘云计算基础设施 Improving Resource Efficiency in Kubernetes Clusters Kata Containers 云原生服务的一块坚定基石 OpenKruise — 助力阿里巴巴集团落地 Kubernetes的核心开源技术 OpenKruise — 自动化部署 Kubernetes 应用的新方法 Serverless 弹性容器实例:设计、实现和性能优化 Serverless autoscaling in kubernetes Serverless Deep Learning Inference Service Mesh 在『路口』的产品思考与实践 TiDB Operator 实现原理解析 四、架构师成长系列直播 10分钟高质量完成应用容器化迁移 从 2019 到 2020,Apache Dubbo 年度总结与展望 从代码到部署,云原生应用 DevSecOps 实践 攻克痛点:如何保证复杂微服务架构下的数据一致性 构建安全可靠的微服务 Nacos 在颜铺 SaaS 平台的应用实践 函数计算最佳实践:搭建基于 Serverless 的在线转换工具 函数计算最佳实践:基于函数计算实现 Serverless 自动化运维 函数计算最佳实践:快速开发一个分布式 Puppeteer 网页截图服务 函数计算最佳实践:如何轻松构建弹性高可用的音视频处理系统? 基于 DLedger 构建高可用的 Apache RocketMQ 集群 基于 RocketMQ + Knative 驱动云原生 Serverless 应用 基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台 快速交付云原生应用的 3 种发布策略详解 流量太大容易挂?接入 Sentinel 让 N 个 9 成为可能! 容器化应用痛点剖析:问题诊断、监控及运维 如何借助 Serverless 技术降低闲置计算资源成本 十分钟上线-使用函数计算构建支付宝小程序服务 为什么 RocketMQ 是业务消息的首选 消息队列 Kafka 版差异化特性 云原生时代的在线教育 DevOps 之道 中小企业如何实现在家研发软件 Apache RocketMQ 未来展望 Arthas 在线应用诊断实践 Dubbo 2.7.6 新特性 GitOps之应用安全发布模型实践 Nacos 全新权限控制系统介绍 OAM:云原生时代的应用模型与下一代 DevOps 技术 RocketMQ 新特性揭秘-Request-Reply 模式 RocketMQ Connect 平台的搭建与实践 RocketMQ Go 客户端实践 RocketMQ Operator-K8s 平台自动化部署工具 Serverless 工作流适用场景及最佳实践 Serverless 开发实战--十分钟上线一个 Web 应用 Service Mesh 实践及落地风险控制
精通matlab7光盘内容分享-精通matlab7源程序.rar 本书基于最新的matlab7.x版本,深入浅出,紧密结合实例,对matlab的使用进行了全面且详尽的阐述,并通过大量的实例讲述了如何实现matlab7.x的基本操作和实际使用。全书图文并茂,突出应用,并配有大量的程序实例。全书共分37章进行展开,分为基础篇和实战篇。基础篇为前面的34章,主要讲述matlab的基本使用,分别为:基础入门、matlab桌面、数组及其操作、多维数组及其操作、数据类型概述和数值类型、结构体和元胞数组、字符串、关系运算和逻辑运算、程序控制流、函数、m文件调试和剖析、目录管理和文件i/o、matlab中的时间、矩阵代数、数据分析、数据插值、多项式、三次样条、傅里叶分析、最优化计算、微积分、常微分方程、二维图形、三维图形、使用颜色和光影、图像、声音和视频、图形的打印和导出、句柄图形、图形用户界面(gui)、matlab类和面向对象编程、matlab编程接口、扩展matlab和java、windows应用程序集成、simulink交互式仿真集成环境。实战篇为后面的3章,主要讲述matlab综合应用的实例,分别为:matlab高等数学计算实例、matlab图形绘制实例、matlab扩展编程实例。 本书适合matlab的初、中级读者,可作为高等学校数学、计算机、电子工程、信息工程及相关专业师生的matlab使用参考手册,也可作为广大工程应用人员和开发人员不可多得的参考资料。
深入浅出Python量化交易实战》是一本介绍Python在量化交易领域应用的经典教材。这本书主要分为四个部分,分别是Python语言基础、金融市场数据获取与处理、量化分析方法与策略设计,以及策略回测与优化。 首先,本书对Python语言有较全面的讲解,从语言基础、数据结构、函数、面向对象编程等各个方面进行了介绍。读者可以快速上手Python语言,掌握程序编写技巧,打下编写量化交易策略的良好基础。 其次,本书详细介绍了金融市场数据的获取与处理方法,包括数据来源、数据格式、数据存储与读取等方面。读者可以了解到如何利用Python编写程序获取和处理金融市场数据,为编写量化交易策略做好准备。 接着,本书讲解了量化分析方法与策略设计,包括技术分析、基本面分析、宏观经济分析等多个方面。读者可以学习到各种量化方法和分析工具的使用,以及如何结合市场情况制定有效的量化交易策略。 最后,本书着重介绍了策略回测与优化方法。通过使用Python编写程序对策略进行回测和优化,读者可以了解到策略优化的重要性,以及如何优化策略以达到更加优秀的交易效果。 总的来说,通过《深入浅出Python量化交易实战》这本书的学习,读者可以快速了解Python语言的基础知识,掌握金融市场数据的获取与处理方法,以及深入学习量化分析与策略设计、策略回测与优化等方面的知识。这本书对于想要学习量化交易领域的开发人员、金融从业者以及学习Python语言的读者都是非常有价值的参考教材。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值