线性规划-单纯形法推导

这里写目录标题

  • 线性规划例子
    • 啤酒厂问题
    • 图解法
  • 单纯形法数学推导
    • 将问题标准化并转为矩阵形式
    • 开始推导
  • 实例
    • 图解法
    • 单纯形法

线性规划例子

啤酒厂问题

  • 每日销售上限:100箱啤酒
  • 营业时间:14小时
  • 生产1箱生啤需1小时
  • 生产1箱黑啤需2小时
  • 生啤售价:20美元/箱
  • 黑啤售价:30美元/箱

目标:最大化利润

我们可以根据上述描述,建立数学模型。假设生啤生产 x 1 x_1 x1箱,黑啤生产 x 2 x_2 x2箱,那么就有如下的线性规划式子。
M a x x 1 , x 2 20 × x 1 + 30 × x 2 s . t . x 1 + 2 × x 2 < = 14 x 1 + x 2 < = 100 x 1 , x 2 > = 0 Max_{x_1,x_2} \qquad20 \times x_1 + 30 \times x_2 \\ \qquad s.t. \qquad \qquad x_1 + 2\times x_2<=14 \\\qquad \qquad \qquad x_1+x_2<=100 \\\qquad \qquad \qquad x_1,x_2>=0 Maxx1,x220×x1+30×x2s.t.x1+2×x2<=14x1+x2<=100x1,x2>=0

图解法

通过求解上述的线性规划问题即可得到最优的生产计划。那么如何求解呢?根据图解法可以看出最优值为2400。而且可以观察到随着z的上下平移,最终取到的最优值必定是z与凸多边形(约束域)的某一个顶点相交得到。这样的话如果想求解一个线性规划问题,只需要遍历这个凸多边形(在高维空间中是凸多面体)的每一个顶点,对目标函数值大小进行比较即可。
在这里插入图片描述

单纯形法数学推导

将问题标准化并转为矩阵形式

那么如何将遍历各个顶点的过程转化为数学语言来表述呢,且是否真的需要将所有顶点遍历一遍,有没有更高效的遍历方法?

还是上述的问题,我们可以把问题先化为标准型再写成矩阵形式。
标准型:
M i n x 1 , x 2 − 20 × x 1 − 30 × x 2 s . t . x 1 + 2 × x 2 + x 3 = 14 x 1 + x 2 + x 4 = 100 x 1 , x 2 , x 3 , x 4 > = 0 Min_{x_1,x_2} \qquad-20 \times x_1 - 30 \times x_2 \\ \qquad s.t. \qquad \qquad x_1 + 2\times x_2 + x_3=14 \\\qquad \qquad \qquad x_1+x_2 + x_4 =100 \\\qquad \qquad \qquad x_1,x_2,x_3,x_4>=0 Minx1,x220×x130×x2s.t.x1+2×x2+x3=14x1+x2+x4=100x1,x2,x3,x4>=0

这个问题的矩阵形式为:
Minimize c ⊤ x Subject to: A x = b and x ≥ 0 \text{Minimize} \quad \mathbf{c}^\top \mathbf{x}\\ \text{Subject to:} \quad \mathbf{Ax} = \mathbf{b} \quad \text{and} \quad \mathbf{x} \geq \mathbf{0} MinimizecxSubject to:Ax=bandx0

其中:

c = [ − 20 − 30 0 0 ] , x = [ x 1 x 2 x 3 x 4 ] , b = [ 14 100 ] \mathbf{c} = \begin{bmatrix} -20 \\ -30 \\ 0 \\ 0 \\ \end{bmatrix}, \quad \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \\ \end{bmatrix}, \quad \mathbf{b} = \begin{bmatrix} 14 \\ 100 \\ \end{bmatrix} c= 203000 ,x= x1x2x3x4 ,b=[14100]

约束矩阵 A \mathbf{A} A为:

A = [ 1 2 1 0 1 1 0 1 ] \mathbf{A} = \begin{bmatrix} 1 & 2 & 1 & 0 \\ 1 & 1 & 0 & 1 \\ \end{bmatrix} A=[11211001]
这里的变量 x 3 x_3 x3 x 4 x_4 x4 是松弛变量,用于将不等式约束转换为等式约束。

开始推导

x = [ x B , x N ] , A = [ B , N ] , c = [ c B , c N ] T x = [x_B,x_N],A = [B,N],c = [c_B,c_N]^T x=[xB,xN],A=[B,N],c=[cB,cN]T(注意这里的B一定要是一个可逆矩阵),初始化时令 x N x_N xN全为0.
那么原问题可以转化为如下形式
M i n i m i z e c B × x B + c N × x N s . t . B × x B + N × x N = b x B > = 0 , x N > = 0 Minimize \qquad c_B\times x_B + c_N\times x_N \\ s.t.\qquad \qquad \qquad B\times x_B + N\times x_N = b \\ \qquad \qquad \qquad x_B>=0,x_N>=0 MinimizecB×xB+cN×xNs.t.B×xB+N×xN=bxB>=0,xN>=0
将约束条件 B × x B + N × x N = b B\times x_B + N\times x_N = b B×xB+N×xN=b可以等价变形为 x B = B − 1 ( b − N × x N ) = B − 1 b x_B = B^{-1}(b - N\times x_N) = B^{-1}b xB=B1(bN×xN)=B1b
注意:上面用到了 B − 1 B^{-1} B1,这也是为什么说B得是可逆矩阵的原因,在后面的转化还用到了 x N x_N xN初始全为0。

将变换之后的式子带回目标函数 c B × x B + c N × x N c_B\times x_B + c_N\times x_N cB×xB+cN×xN就有 c B × B − 1 ( b − N × x N ) + c N × x N c_B\times B^{-1}(b - N\times x_N) + c_N\times x_N cB×B1(bN×xN)+cN×xN,进一步化简可以得到如下式子(由于在初始化时 x N x_N xN全为0)
c B B − 1 b + ( c N − c B B − 1 N ) x N = c B B − 1 b c_BB^{-1}b +(c_N - c_BB^{-1}N)x_N = c_BB^{-1}b cBB1b+(cNcBB1N)xN=cBB1b
可以观察到,目标函数还有进一步变小的可能,那就是 ( c N − c B B − 1 N ) x N (c_N - c_BB^{-1}N)x_N (cNcBB1N)xN之前由于 x N x_N xN全为0,所以这一项也为0,但如果 x N x_N xN中某一项的系数为负,将该项从0变为非0即可进一步减小目标函数。那么如何变更高效呢?就是找到负系数中,负系数绝对值最大的那一项(在x变化量一致的情况下,负系数绝对值越大,目标函数值下降的就越多)。

那么也可以推出,如果 ( c N − c B B − 1 N ) (c_N - c_BB^{-1}N) (cNcBB1N)全部为正,即使将 x N x_N xN的任意一项由0变为非0,目标函数值也不会降低,这时就可以说已经找到了目标函数的最小值,这也是算法的收敛准则: ( c N − c B B − 1 N ) > = 0 (c_N - c_BB^{-1}N)>=0 (cNcBB1N)>=0

那么假如 ( c N − c B B − 1 N ) i (c_N - c_BB^{-1}N)_i (cNcBB1N)i是负系数中系数绝对值最大的的那一项,对应这一项的变量为 x N i x_{N_{i}} xNi,我们要将其由0变为非0,那么要变为多少呢?
注意到对于 x B x_B xB还有 x B > = 0 x_B>=0 xB>=0的约束。且有 x B = B − 1 ( b − N × x N ) x_B = B^{-1}(b - N\times x_N) xB=B1(bN×xN) x N x_N xN的变化也会引起 x B x_B xB的变化,我们应该使变化之后的 x B x_B xB仍然满足非负性。在 x B > = 0 x_B>=0 xB>=0的情况下, x N x_N xN要变得尽可能大。那么就有如下式子:
B − 1 ( b − N × x N ) > = 0 b − N × x N > = 0 B^{-1}(b - N\times x_N)>=0 \\b - N\times x_N>=0 \\ B1(bN×xN)>=0bN×xN>=0
为了满足上述式子,而 x N i x_{N_{i}} xNi变得又要尽可能多,那么 x N i = m i n { b N } = b j N j x_{N_{i}} = min\{\frac{b}{N} \} = \frac{b_j}{N_j} xNi=min{Nb}=Njbj,这样的话同时就把 x B j x_{B_j} xBj变为0.
如此就完成了一轮迭代,不断迭代知道达到收敛准则为止。迭代的过程其实也是从一个端点替换到另一个端点的过程。

实例

对于线性规划问题
m a x 2 x 1 + 3 x 2 s . t . 4 x 1 + x 2 < = 16 − x 1 + x 2 < = 6 x 1 , x 2 > = 0 max \qquad 2x_1 + 3x_2 \\s.t. \qquad 4x_1 + x_2<=16 \\ \qquad -x_1+x_2<=6 \\ \qquad x_1,x_2>=0 max2x1+3x2s.t.4x1+x2<=16x1+x2<=6x1,x2>=0

图解法

利用图解法可以看到红色的线是最优的等值线, x 1 = 2 , x 2 = 8 x_1 = 2,x_2 = 8 x1=2,x2=8.
在这里插入图片描述

单纯形法

将原来的线性规划化为标准型并写为矩阵形式
m i n − 2 x 1 − 3 x 2 s . t . 4 x 1 + x 2 + x 3 = 16 − x 1 + x 2 + x 4 = 6 x 1 , x 2 , x 3 , x 4 > = 0 min \qquad -2x_1 - 3x_2 \\s.t. \qquad 4x_1 + x_2+x_3=16 \\ \qquad -x_1+x_2+x_4=6 \\ \qquad x_1,x_2,x_3,x_4>=0 min2x13x2s.t.4x1+x2+x3=16x1+x2+x4=6x1,x2,x3,x4>=0
其中, x 3 x_3 x3 x 4 x_4 x4是松弛变量。

矩阵形式为:

目标函数: Maximize c ⊤ x \text{Maximize} \quad \mathbf{c}^\top \mathbf{x} Maximizecx
其中, c = [ − 2 − 3 0 0 ] \mathbf{c} = \begin{bmatrix} -2 \\ -3 \\ 0 \\ 0 \end{bmatrix} c= 2300 为目标函数的系数向量。

约束条件: A x = b \mathbf{Ax} = \mathbf{b} Ax=b,其中 A = [ 4 1 1 0 − 1 1 0 1 ] \mathbf{A} = \begin{bmatrix} 4 & 1 & 1 & 0 \\ -1 & 1 & 0 & 1 \end{bmatrix} A=[41111001]是约束系数矩阵, x = [ x 1 x 2 x 3 x 4 ] \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ x_4 \end{bmatrix} x= x1x2x3x4 是决策变量向量, b = [ 16 6 ] \mathbf{b} = \begin{bmatrix} 16 \\ 6 \end{bmatrix} b=[166]是约束右端项向量。
因此,标准型的线性规划问题可以表示为:
Maximize c ⊤ x Subject to A x = b x ≥ 0 \begin{align*} \text{Maximize} \quad & \mathbf{c}^\top \mathbf{x} \\ \text{Subject to} \quad & \mathbf{Ax} = \mathbf{b} \\ & \mathbf{x} \geq 0 \end{align*} MaximizeSubject tocxAx=bx0
那么根据上述单纯形法的推导, x B = [ x 3 , x 4 ] , x N = [ x 1 , x 2 ] , N = [ 4 1 − 1 1 ] , B = [ 1 0 0 1 ] , c B = [ 0 , 0 ] , c N = [ − 2 , − 3 ] x_B = [x_3,x_4],x_N = [x_1,x_2],N = \begin{bmatrix} 4 & 1 \\ -1 & 1 \end{bmatrix},B = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix},c_B = [0,0],c_N = [-2,-3] xB=[x3,x4],xN=[x1,x2],N=[4111],B=[1001],cB=[0,0],cN=[2,3]
初始时令 x N = [ 0 , 0 ] x_N = [0,0] xN=[0,0]
第一轮迭代:
此时 c N − c B B − 1 N = [ − 2 , − 3 ] c_N - c_BB^{-1}N = [-2,-3] cNcBB1N=[2,3]因此选择 x 2 x_2 x2作为入基变量更为高效,且 b − N x N = [ 16 − 4 x 1 − x 2 6 + x 1 − x 2 ] > = 0 b - Nx_N =\begin{bmatrix} 16 - 4x_1 - x_2 \\ 6 +x_1-x_2 \end{bmatrix}>=0 bNxN=[164x1x26+x1x2]>=0 x 2 = 6 x_2 = 6 x2=6并令 x 4 = 0 x_4 = 0 x4=0, x 2 x_2 x2入基, x 4 x_4 x4出基.
经过此轮迭代后,各变量如下
x B = [ x 3 , x 2 ] , x N = [ x 1 , x 4 ] , N = [ 4 0 − 1 1 ] , B = [ 1 1 0 1 ] , c B = [ 0 , − 3 ] , c N = [ − 2 , 0 ] x_B = [x_3,x_2],x_N = [x_1,x_4],N = \begin{bmatrix} 4 & 0 \\ -1 & 1 \end{bmatrix},B = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix},c_B = [0,-3],c_N = [-2,0] xB=[x3,x2],xN=[x1,x4],N=[4101],B=[1011],cB=[0,3],cN=[2,0]
第二轮迭代:
此时 c N − c B B − 1 N = [ − 5 , 3 ] c_N - c_BB^{-1}N = [-5,3] cNcBB1N=[5,3],选择 x 1 x_1 x1作为入基变量更为高效,且 b − N x N = [ 16 − 4 x 1 6 + x 1 ] > = 0 b - Nx_N =\begin{bmatrix} 16 - 4x_1 \\ 6 +x_1 \end{bmatrix}>=0 bNxN=[164x16+x1]>=0 x 1 = 4 x_1 = 4 x1=4并令 x 3 = 0 x_3 = 0 x3=0, x 1 x_1 x1入基, x 3 x_3 x3出基.
经过此轮迭代后,各变量如下
x B = [ x 1 , x 2 ] , x N = [ x 3 , x 4 ] , N = [ 1 0 0 1 ] , B = [ 4 1 − 1 1 ] , c B = [ − 2 , − 3 ] , c N = [ 0 , 0 ] x_B = [x_1,x_2],x_N = [x_3,x_4],N = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix},B = \begin{bmatrix} 4 & 1 \\ -1 & 1 \end{bmatrix},c_B = [-2,-3],c_N = [0,0] xB=[x1,x2],xN=[x3,x4],N=[1001],B=[4111],cB=[2,3],cN=[0,0]
第三轮迭代:
此时 c N − c B B − 1 N = [ 1 , 2 ] c_N - c_BB^{-1}N = [1,2] cNcBB1N=[1,2]都大于0,达到收敛条件,此时令 x N = [ 0 , 0 ] x_N = [0,0] xN=[0,0]解得 x B = [ 2 , 8 ] x_B = [2,8] xB=[2,8]最小值为28.

附:图解法绘图代码

import numpy as np
import matplotlib.pyplot as plt# 定义约束条件
x = np.linspace(0, 10, 400)  # 创建x轴的值
eq1 = 16 - 4*x  # 约束条件1: 4x1 + x2 <= 16 => x2 <= 16 - 4x1
eq2 = 6 + x  # 约束条件2: -x1 + x2 <= 6 => x2 >= -x1 + 6# 画出约束条件
plt.plot(x, eq1, label=r'$4x_1 + x_2 \leq 16$')
plt.plot(x, eq2, label=r'$-x_1 + x_2 \leq 6$')
plt.xlim((0, 10))
plt.ylim((0, 20))
plt.xlabel(r'$x_1$')
plt.ylabel(r'$x_2$')# 标记可行域
plt.fill_between(x, np.minimum(eq1, eq2), where=(eq1 >= 0) & (eq2 >= 0), alpha=0.3)# 添加等值线
x_vals = np.linspace(0, 10, 100)
y_vals = np.linspace(0, 20, 100)
X, Y = np.meshgrid(x_vals, y_vals)
Z = 2*X + 3*Y
max_val = np.max(Z)# 调整等值线范围
plt.contour(X, Y, Z, levels=[28], colors='red')
plt.contour(X, Y, Z, levels=np.linspace(0, 50, 10), colors='grey', linestyles='dashed')# 添加标签和图例
plt.title('Feasible Region with Contour Lines')
plt.legend()
plt.grid(True)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开发短视频电商 AWS OpenSearch Service开发环境申请以及Java客户端介绍

文章目录 创建域1.创建域2.输入配置部署选项数据节点网络精细访问控制访问策略 获取域端点数据如何插入到OpenSearch ServiceJava连接OpenSearch Servicespring-data-opensearchelasticsearch-rest-high-level-clientopensearch-rest-clientopensearch-java 因为是开发测试使用…

[Linux] nginx的location和rewrite

一、Nginx常用的正则表达式 符号作用^匹配输入字符串的起始位置$ 匹配输入字符串的结束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” 匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”&#xff0c;但不能匹配“o”?匹配前面的字…

图像清晰度 和像素、分辨率、镜头的关系

关于图像清晰度的几个知识点分享。 知识点 清晰度 清晰度指影像上各细部影纹及其边界的清晰程度。清晰度&#xff0c;一般是从录像机角度出发&#xff0c;通过看重放图像的清晰程度来比较图像质量&#xff0c;所以常用清晰度一词。 而摄像机一般使用分解力一词来衡量它“分解被…

linux通过命令切换用户

在Linux中&#xff0c;你可以使用su&#xff08;substitute user或switch user&#xff09;命令来切换用户。这个命令允许你临时或永久地以另一个用户的身份运行命令。以下是基本的用法&#xff1a; 基本切换到另一个用户&#xff08;需要密码&#xff09;&#xff1a;su [用户…

数据科学实践:探索数据驱动的决策

写在前面 你是否曾经困扰于如何从海量的数据中提取有价值的信息?你是否想过如何利用数据来指导你的决策,让你的决策更加科学和精确?如果你有这样的困扰和疑问,那么你来对了地方。这篇文章将引导你走进数据科学的世界,探索数据驱动的决策。 1.数据科学的基本原则 在我们…

第四届传智杯初赛(莲子的机械动力学)

题目描述 题目背景的问题可以转化为如下描述&#xff1a; 给定两个长度分别为 n,m 的整数 a,b&#xff0c;计算它们的和。 但是要注意的是&#xff0c;这里的 a,b 采用了某种特殊的进制表示法。最终的结果也会采用该种表示法。具体而言&#xff0c;从低位往高位数起&#xf…

【linux】yum安装时: Couldn‘t resolve host name for XXXXX

yum 安装 sysstat 报错了&#xff1a; Kylin Linux Advanced Server 10 - Os 0.0 B/s | 0 B 00:00 Errors during downloading metadata for repository ks10-adv-os:- Curl error (6): Couldnt resolve host nam…

微信小程序 长按录音+录制视频

<view class"bigCircle" bindtouchstart"start" bindtouchend"stop"><view class"smallCircle {{startVedio?onVedio:}}"><text>{{startVedio?正在录音:长按录音}}</text></view> </view> <…

排序算法:【选择排序]

一、选择排序——时间复杂度 定义&#xff1a;第一趟排序&#xff0c;从整个序列中找到最小的数&#xff0c;把它放到序列的第一个位置上&#xff0c;第二趟排序&#xff0c;再从无序区找到最小的数&#xff0c;把它放到序列的第二个位置上&#xff0c;以此类推。 也就是说&am…

微服务测试是什么?

微服务测试是一种特殊的测试类型&#xff0c;因为它涉及到多个独立的服务。以下是进行微服务测试的一般性步骤&#xff1a; 1. 确定系统架构 了解微服务架构对成功测试至关重要。确定每个微服务的职责、接口、依赖项和通信方式。了解这些信息可以帮助您更好地规划测试用例和测…

ip ssl证书怎么更换ip地址

ip ssl证书是一种数字证书&#xff0c;为只有公网ip地址的站点建立安全、加密的通信通道。它通常由权威的证书颁发机构&#xff08;CA&#xff09;颁发&#xff0c;并用于验证网站的身份和安全性。ip ssl证书的主要目的是保护敏感信息&#xff0c;如信用卡号、用户名和密码等&a…

IO部分笔记

IO 概述 IO: 存储和读取数据的解决方案 作用: 用于读写文件中的数据(可以读写文件, 或网络中的数据) IO流的分类 按流的方向: 输入流, 输出流 按操作文件类型: 字节流: 可以操作所有类型的文件 字符流: 只能操作纯文本文件 纯文本文件: windows自带的记事本打开能读懂…

react Hooks(useRef、useMemo、useCallback)实现原理

Fiber 上篇文章fiber简单理解记录了react fiber架构&#xff0c;Hooks是基于fiber链表来实现的。阅读以下内容时建议先了解react fiber。 jsx -> render function -> vdom -> fiber树 -> dom vdom 转 fiber 的过程称为 recocile。diff算法就是在recocile这个过程…

认识lambda架构(架构师考试复习)

Lambda架构主要分为三层&#xff0c;批处理层、加速层和服务层。 如下图所示&#xff1a; &#xff08;1&#xff09;批处理层&#xff08;Batch Layer&#xff09;&#xff1a;存储数据集&#xff0c;在数据集上预先计算查询函数&#xff0c;并构建查询对应的view。Batch Lay…

mysql 5.7 Unknown column ‘password‘ in ‘field list‘

问题现象&#xff1a; 执行sql : select user&#xff0c;host,password from user&#xff1b;时提示 ERROR 1054(42S22):Unknown column password in field list 现象如下图所示&#xff1a; mysql 5.7开始 密码字段用&#xff1a;authentication_string

Redis哨兵模式:什么是哨兵模式、哨兵模式的优缺点、哨兵模式的主观下线和客观下线、投票选举、Redis 哨兵模式搭建

文章目录 什么是哨兵模式哨兵模式的优缺点主观下线和客观下线投票选举哨兵模式场景应用Redis version 6.0.5 集群搭建下载文件环境安装解压编译配置文件启动关闭密码设置 什么是哨兵模式 哨兵模式是Redis的高可用解决方案之一&#xff0c;它旨在提供自动故障转移和故障检测的功…

2023年四川网信人才技能大赛 实操赛Writeup

文章目录 Crypto比base64少的baseaffine简单的RSA Misc不要动我的flagSimpleUSB猜猜我是谁不聪明的AI Pwngetitezbbstack Reverse谁的DNA动了Dont Touch Me Weblittle_gamejustppbezbbssmart 题目附件&#xff0c;文章末尾微信公众号点点关注亲&#xff0c;谢谢亲~ 题目附件链接…

C++ Qt开发:PushButton按钮组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍QPushButton按钮组件的常用方法及灵活运用。 …

电子眼+无人机构建平安城市视频防控监控方案

电子眼&#xff08;也称为监控摄像机&#xff09;可以通过安装在城市的不同角落&#xff0c;实时监控城市的各个地方。它们可以用于监测交通违法行为、监控公共场所的安全以及实时监测特定区域的活动情况。通过电子眼的应用&#xff0c;可以帮助警方及时发现并响应各类安全事件…

Ubuntu安装TensorRT

文章目录 1. 安装CUDAa. 下载CUDAb. 安装CUDAc. 验证CUDA 2. 安装CUDNNa. 下载CUDNNb. 安装CUDNNc. 验证CUDNN 3. 安装TensorRTa. 下载TensorRTb. 解压TensorRTc. 安装TensorRTd. 安装uff和graphsurgeone. 验证是否安装成功f. 备注 关注公众号&#xff1a;『AI学习星球』 回复&…