最优化方法Python计算:二次规划的拉格朗日算法

2024-09-05 08:20

本文主要是介绍最优化方法Python计算:二次规划的拉格朗日算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标函数为二次式,约束条件为线性式的最优化问题称为二次规划。其一般形式为
{ minimize 1 2 x ⊤ H x + c ⊤ x s.t.   A e q x − b e q = o A i q x − b i q ≥ o . \begin{cases} \text{minimize}\quad \frac{1}{2}\boldsymbol{x}^\top\boldsymbol{Hx}+\boldsymbol{c}^\top\boldsymbol{x}\\ \text{s.t.\ \ }\quad\quad\quad\boldsymbol{A}_{eq}\boldsymbol{x}-\boldsymbol{b}_{eq}=\boldsymbol{o}\\ \quad\quad\quad\quad\quad\boldsymbol{A}_{iq}\boldsymbol{x}-\boldsymbol{b}_{iq}\geq\boldsymbol{o} \end{cases}. minimize21xHx+cxs.t.  Aeqxbeq=oAiqxbiqo.
其中, H ∈ R n × n \boldsymbol{H}\in\text{R}^{n\times n} HRn×n对称, c ∈ R n \boldsymbol{c}\in\text{R}^n cRn A e q ∈ R l × n \boldsymbol{A}_{eq}\in\text{R}^{l\times n} AeqRl×n b e q ∈ R l \boldsymbol{b}_{eq}\in\text{R}^l beqRl A i q ∈ R m × n \boldsymbol{A}_{iq}\in\text{R}^{m\times n} AiqRm×n b i q ∈ R m \boldsymbol{b}_{iq}\in\text{R}^m biqRm
仅含等式约束的二次规划形如
{ minimize 1 2 x ⊤ H x + c ⊤ x s.t.   A x − b = o . ( 1 ) \begin{cases} \text{minimize}\quad \frac{1}{2}\boldsymbol{x}^\top\boldsymbol{Hx}+\boldsymbol{c}^\top\boldsymbol{x}\\ \text{s.t.\ \ }\quad\quad\quad\boldsymbol{Ax}-\boldsymbol{b}=\boldsymbol{o} \end{cases}.\quad\quad(1) {minimize21xHx+cxs.t.  Axb=o.(1)
假定 H \boldsymbol{H} H对称正定, A ∈ R l × n \boldsymbol{A}\in\text{R}^{l\times n} ARl×n,rank A = l \boldsymbol{A}=l A=l。正定二次式 1 2 x ⊤ H x + c ⊤ x \frac{1}{2}\boldsymbol{x}^\top\boldsymbol{Hx}+\boldsymbol{c}^\top\boldsymbol{x} 21xHx+cx在凸集 Ω = { x ∣ A x − b = o } \Omega=\{\boldsymbol{x}|\boldsymbol{Ax}-\boldsymbol{b}=\boldsymbol{o}\} Ω={xAxb=o}上有唯一满足必要条件的KKT点 ( x 0 λ 0 ) \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix} (x0λ0)。为算得该KKT点,写出问题的拉格朗日函数
L ( x , λ ) = 1 2 x ⊤ H x + c ⊤ x − λ ⊤ ( A x − b ) . L(\boldsymbol{x},\boldsymbol{\lambda})=\frac{1}{2}\boldsymbol{x}^\top\boldsymbol{Hx}+\boldsymbol{c}^\top\boldsymbol{x}-\boldsymbol{\lambda}^\top(\boldsymbol{Ax}-\boldsymbol{b}). L(x,λ)=21xHx+cxλ(Axb).
关于 x \boldsymbol{x} x λ \boldsymbol{\lambda} λ的梯度为
∇ x L ( x , λ ) = H x + c − A ⊤ λ ∇ λ L ( x , λ ) = − A x + b \begin{array}{l} \nabla_{\boldsymbol{x}}L(\boldsymbol{x},\boldsymbol{\lambda})=\boldsymbol{Hx}+\boldsymbol{c}-\boldsymbol{A}^\top\boldsymbol{\lambda}\\ \nabla_{\boldsymbol{\lambda}}L(\boldsymbol{x},\boldsymbol{\lambda})=-\boldsymbol{Ax}+\boldsymbol{b} \end{array} xL(x,λ)=Hx+cAλλL(x,λ)=Ax+b
∇ x L ( x , λ ) = o \nabla_{\boldsymbol{x}}L(\boldsymbol{x},\boldsymbol{\lambda})=\boldsymbol{o} xL(x,λ)=o ∇ λ L ( x , λ ) = o \nabla_{\boldsymbol{\lambda}}L(\boldsymbol{x},\boldsymbol{\lambda})=\boldsymbol{o} λL(x,λ)=o,得线性方程组
{ H x + c − A ⊤ λ = o − A x + b = o , \begin{cases} \boldsymbol{Hx}+\boldsymbol{c}-\boldsymbol{A}^\top\boldsymbol{\lambda}=\boldsymbol{o}\\ -\boldsymbol{Ax}+\boldsymbol{b}=\boldsymbol{o} \end{cases}, {Hx+cAλ=oAx+b=o,
等价地表示为
( H − A ⊤ − A O ) ( x λ ) = ( − c − b ) . \begin{pmatrix}\boldsymbol{H}&-\boldsymbol{A}^\top\\-\boldsymbol{A}&\boldsymbol{O}\end{pmatrix}\begin{pmatrix}\boldsymbol{x}\\\boldsymbol{\lambda}\end{pmatrix} =\begin{pmatrix}-\boldsymbol{c}\\-\boldsymbol{b}\end{pmatrix}. (HAAO)(xλ)=(cb).
系数矩阵 ( H − A ⊤ − A O ) \begin{pmatrix}\boldsymbol{H}&-\boldsymbol{A}^\top\\-\boldsymbol{A}&\boldsymbol{O}\end{pmatrix} (HAAO)称为拉格朗日矩阵。由 H \boldsymbol{H} H对称正定且rank A = l \boldsymbol{A}=l A=l的假设,拉格朗日矩阵可逆,设
( H − A ⊤ − A O ) − 1 = ( Q − R ⊤ − R S ) , \begin{pmatrix}\boldsymbol{H}&-\boldsymbol{A}^\top\\-\boldsymbol{A}&\boldsymbol{O}\end{pmatrix}^{-1}=\begin{pmatrix}\boldsymbol{Q}&-\boldsymbol{R}^\top\\-\boldsymbol{R}&\boldsymbol{S}\end{pmatrix}, (HAAO)1=(QRRS),
根据
( H − A ⊤ − A O ) ( Q − R ⊤ − R S ) = I \begin{pmatrix}\boldsymbol{H}&-\boldsymbol{A}^\top\\-\boldsymbol{A}&\boldsymbol{O}\end{pmatrix}\begin{pmatrix}\boldsymbol{Q}&-\boldsymbol{R}^\top\\-\boldsymbol{R}&\boldsymbol{S}\end{pmatrix}=\boldsymbol{I} (HAAO)(QRRS)=I
算得
{ H Q + A ⊤ R = I − H R ⊤ − A ⊤ S = O − A Q = O A R ⊤ = I \begin{cases} \boldsymbol{HQ}+\boldsymbol{A}^\top\boldsymbol{R}=\boldsymbol{I}\\ -\boldsymbol{H}\boldsymbol{R}^\top-\boldsymbol{A}^\top\boldsymbol{S}=\boldsymbol{O}\\ -\boldsymbol{AQ}=\boldsymbol{O}\\ \boldsymbol{AR}^\top=\boldsymbol{I} \end{cases} HQ+AR=IHRAS=OAQ=OAR=I
由于 A \boldsymbol{A} A行满秩,故 A H − 1 A ⊤ \boldsymbol{AH}^{-1}\boldsymbol{A}^\top AH1A可逆。 ( A H − 1 A ⊤ ) − 1 A H − 1 (\boldsymbol{AH}^{-1}\boldsymbol{A}^\top)^{-1}\boldsymbol{AH}^{-1} (AH1A)1AH1 A ⊤ \boldsymbol{A}^\top A的伪逆。解上列连立式得
{ S = − ( A H − 1 A ⊤ ) − 1 R = − S A H − 1 Q = H − 1 − H − 1 A ⊤ R \begin{cases}\boldsymbol{S}=-(\boldsymbol{AH}^{-1}\boldsymbol{A}^\top)^{-1}\\\boldsymbol{R}=-\boldsymbol{SAH}^{-1}\\\boldsymbol{Q}=\boldsymbol{H}^{-1}-\boldsymbol{H}^{-1}\boldsymbol{A}^\top\boldsymbol{R}\end{cases} S=(AH1A)1R=SAH1Q=H1H1AR
于是,二次规划(1)的KKT点
( x 0 λ 0 ) = ( Q − R ⊤ − R S ) ( − c − b ) = ( − Q c + R ⊤ b R c − S b ) . \begin{pmatrix}\boldsymbol{x}_0\\\boldsymbol{\lambda}_0\end{pmatrix}=\begin{pmatrix}\boldsymbol{Q}&-\boldsymbol{R}^\top\\-\boldsymbol{R}&\boldsymbol{S}\end{pmatrix}\begin{pmatrix}-\boldsymbol{c}\\-\boldsymbol{b}\end{pmatrix}=\begin{pmatrix}-\boldsymbol{Qc}+\boldsymbol{R}^\top\boldsymbol{b}\\\boldsymbol{Rc}-\boldsymbol{Sb} \end{pmatrix}. (x0λ0)=(QRRS)(cb)=(Qc+RbRcSb).
下列代码实现求解等式约束二次规划(1)的拉格朗日算法。

import numpy as np										#导入numpy
def qlag(H, A, b, c):H1 = np.linalg.inv(H)								#H的逆阵S = -np.linalg.inv(np.matmul(np.matmul(A, H1), A.T))R = -np.matmul(np.matmul(S, A), H1)Q = H1 - np.matmul(np.matmul(H1, A.T), R)x0 = -np.matmul(Q, c) + np.matmul(R.T, b)			#最优解lamd0 = np.matmul(R, c) - np.matmul(S, b)			#拉格朗日乘子return x0, lamd0

程序的第2~9行定义的函数qlag实现拉格朗日算法。qlag的4个参数H,A,b和c分别表示二次规划(1)中的正定矩阵 H \boldsymbol{H} H,行满秩阵 A \boldsymbol{A} A,向量 b \boldsymbol{b} b c \boldsymbol{c} c
函数体内的第3行调用numpy.linalg的inv函数计算 H \boldsymbol{H} H的逆阵 H − 1 \boldsymbol{H}^{-1} H1,赋予H1。第4~6行分别计算
S = − ( A H − 1 A ⊤ ) − 1 R = − S A H − 1 Q = H − 1 − H − 1 A ⊤ R \begin{array}{l} \boldsymbol{S}=-(\boldsymbol{AH}^{-1}\boldsymbol{A}^\top)^{-1}\\ \boldsymbol{R}=-\boldsymbol{SAH}^{-1}\\ \boldsymbol{Q}=\boldsymbol{H}^{-1}-\boldsymbol{H}^{-1}\boldsymbol{A}^\top\boldsymbol{R} \end{array} S=(AH1A)1R=SAH1Q=H1H1AR
并赋予S,R和Q。第7、8行分别计算最优解和对应的拉格朗日乘子
x 0 = − Q c + R ⊤ b λ 0 = R c − S b \begin{array}{l} \boldsymbol{x}_0=-\boldsymbol{Qc}+\boldsymbol{R}^\top\boldsymbol{b}\\ \boldsymbol{\lambda}_0=\boldsymbol{Rc}-\boldsymbol{Sb} \end{array} x0=Qc+Rbλ0=RcSb
并赋予x0和lamd0。
例1用qlag函数求解下列二次规划
{ minimize x 1 2 + 2 x 2 2 + x 3 2 − 2 x 1 x 2 + x 3 s.t.   x 1 + x 2 + x 3 = 4 2 x 1 − x 2 + x 3 = 2 . \begin{cases} \text{minimize}\quad x_1^2+2x_2^2+x_3^2-2x_1x_2+x_3\\ \text{s.t.\ \ }\quad\quad\quad x_1+x_2+x_3=4\\ \quad\quad\quad\quad\quad 2x_1-x_2+x_3=2 \end{cases}. minimizex12+2x22+x322x1x2+x3s.t.  x1+x2+x3=42x1x2+x3=2.
:本问题中,
H = ( 2 − 2 0 − 2 4 0 0 0 2 ) , A = ( 1 1 1 2 − 1 1 ) , b = ( 4 2 ) , c = ( 0 0 1 ) \boldsymbol{H}=\begin{pmatrix}2&-2&0\\-2&4&0\\0&0&2\end{pmatrix},\boldsymbol{A}=\begin{pmatrix}1&1&1\\2&-1&1\end{pmatrix},\boldsymbol{b}=\begin{pmatrix}4\\2\end{pmatrix},\boldsymbol{c}=\begin{pmatrix}0\\0\\1\end{pmatrix} H= 220240002 ,A=(121111),b=(42),c= 001
下列代码利用这些数据进行计算。

import numpy as np					#导入numpy
from fractions import Fraction as F	#设置输出格式
np.set_printoptions(formatter={'all':lambda x:str(F(x).limit_denominator())})
H = np.array([[2, -2, 0],			#矩阵H[-2, 4, 0],[0, 0, 2]])
A = np.array([[1, 1, 1],			#矩阵A[2, -1, 1]])
b = np.array([4, 2])				#向量b
c = np.array([0, 0, 1])				#向量c
print(qlag(H, A, b, c))				#计算最优解

程序的第2~4行设置数组输出格式为有理数。5~11设置表示本二次规划问题的矩阵H、A和向量b、c。第12行调用函数qlag,计算本二次规划最优解。运行程序,输出

(array([21/11, 43/22, 3/22]), array([29/11, -15/11]))

意味着最优解 x 0 = ( 21 11 43 22 3 22 ) \boldsymbol{x}_0=\begin{pmatrix}\frac{21}{11}\\\frac{43}{22}\\\frac{3}{22}\end{pmatrix} x0= 11212243223 ,对应的拉格朗日乘子 λ 0 = ( 29 11 − 15 11 ) \boldsymbol{\lambda}_0=\begin{pmatrix}\frac{29}{11}\\-\frac{15}{11}\end{pmatrix} λ0=(11291115)
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

这篇关于最优化方法Python计算:二次规划的拉格朗日算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138430

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert