最优化方法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

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复

Python将大量遥感数据的值缩放指定倍数的方法(推荐)

《Python将大量遥感数据的值缩放指定倍数的方法(推荐)》本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像... 本文介绍基于python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服