最优化方法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常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1