单纯形法迭代原理及解的判定

2024-01-05 08:36

本文主要是介绍单纯形法迭代原理及解的判定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写于:2024年1月4日晚
修改:


基于以下线性规划做分析, max ⁡ z = ∑ j = 1 n c j x j s.t.  { ∑ j = 1 n a i j x j ≤ b i ( i = 1 , 2 , … , m ) x j ≥ 0 ( j = 1 , 2 , … , n ) \begin{aligned} & \max \mathrm{z}=\sum_{j=1}^n c_j x_j \\ & \text { s.t. }\left\{\begin{array}{l} \sum_{j=1}^n a_{i j} x_j \leq b_i(i=1,2, \ldots, m) \\ x_j \geq 0(j=1,2, \ldots, n) \end{array}\right. \end{aligned} maxz=j=1ncjxj s.t. {j=1naijxjbi(i=1,2,,m)xj0(j=1,2,,n)

标准化上述线性规划,得: max ⁡ z = ∑ j = 1 n c j x j s.t.  { ∑ j = 1 n a i j x j + x i ′ = b i ( i = 1 , 2 , … , m ) x j ≥ 0 ( j = 1 , 2 , … , n ) \begin{aligned} & \max \mathrm{z}=\sum_{j=1}^n c_j x_j \\ & \text { s.t. }\left\{\begin{array}{l}\sum_{j=1}^n a_{i j} x_j+x_i^{\prime}=b_i(i=1,2, \ldots, m) \\ x_j \geq 0(j=1,2, \ldots, n)\end{array}\right. \end{aligned} maxz=j=1ncjxj s.t. {j=1naijxj+xi=bi(i=1,2,,m)xj0(j=1,2,,n)

为减少变量数以便于表示,将线性规划调整(主要是将松弛变量用 x i x_i xi 表示,其余变量用 x j x_j xj 表示)为 max ⁡ z = ∑ j = 1 n c j x j s.t.  { ∑ i = 1 m P i x i + ∑ j = m + 1 n P j x j = b x j ≥ 0 ( j = 1 , 2 , … , n ) \begin{aligned} & \max \mathrm{z}=\sum_{j=1}^n c_j x_j \\ & \text { s.t. }\left\{\begin{array}{l} \sum_{i=1}^m \mathbf{P}_i x_i+\sum_{j=m+1}^n \mathbf{P}_j x_j=\mathbf{b} \\ x_j \geq 0(j=1,2, \ldots, n) \end{array}\right. \end{aligned} maxz=j=1ncjxj s.t. {i=1mPixi+j=m+1nPjxj=bxj0(j=1,2,,n)

其中, P i \mathbf{P}_i Pi 为 m 维标准单位列向量, P j = [ a 1 , j a 2 , j … a m , j ] \mathbf{P}_j=\left[\begin{array}{c} a_{1, j} \\ a_{2, j} \\ \ldots \\ a_{m, j} \end{array}\right] Pj= a1,ja2,jam,j P = [ 1 0 … 0 a 1 , m + 1 … a 1 n 0 1 … 0 a 2 , m + 1 … a 2 n … … … 0 a l , m + 1 a l j … 0 0 … 1 a m , m + 1 … a m n ] \mathbf{P}=\left[\begin{array}{cccc:ccc}1 & 0 & \ldots & 0 & a_{1, m+1} & \ldots & a_{1 n} \\ 0 & 1 & \ldots & 0 & a_{2, m+1} & \ldots & a_{2 n} \\ \ldots & \ldots & \ldots & 0 & a_{l, m+1} & a_{l j} & \ldots \\ 0 & 0 & \ldots & 1 & a_{m, m+1} & \ldots & a_{m n}\end{array}\right] P= 1000100001a1,m+1a2,m+1al,m+1am,m+1alja1na2namn b = [ b 1 b 2 … b m ] \mathbf{b}=\left[\begin{array}{c}b_1 \\ b_2 \\ \ldots \\ b_m\end{array}\right] b= b1b2bm


单纯形法–迭代原理

设初始基变量中前 m \mathrm{m} m 个为基变量,即 X 0 = ( x 1 0 , x 2 0 , … x m 0 , 0 , … , 0 ) T \mathbf{X}^0=\left(x_1^0, x_2^0, \ldots x_m^0, 0, \ldots, 0\right)^{\mathrm{T}} X0=(x10,x20,xm0,0,,0)T

X 0 \mathbf{X}^0 X0 代入约束方程,得到 ∑ i = 1 m P i x i 0 = b \sum_{i=1}^m \mathbf{P}_i x_i^0=\mathbf{b} i=1mPixi0=b P j = ∑ i = 1 m P i a i j ( j = m + 1 , m + 2 , … , n ) \mathbf{P}_j=\sum_{i=1}^m \mathbf{P}_i a_{i j}(j=m+1, m+2, \ldots, n) Pj=i=1mPiaij(j=m+1,m+2,,n)

再令 θ > 0 \theta>0 θ>0 θ ( P j − ∑ i = 1 m P i a i j ) = 0 \theta\left(\mathbf{P}_j-\sum_{i=1}^m \mathbf{P}_i a_{i j}\right)=0 θ(Pji=1mPiaij)=0

∑ i = 1 m P i x i 0 = b \sum_{i=1}^m \mathbf{P}_i x_i^0=\mathbf{b} i=1mPixi0=b θ ( P j = ∑ i = 1 m P i a i j ) = 0 \theta\left(\mathbf{P}_j=\sum_{i=1}^m \mathbf{P}_i a_{i j}\right)=0 θ(Pj=i=1mPiaij)=0 相加,可得 ∑ i = 1 m P i x i 0 + θ ( P j − ∑ i = 1 m P i a i j ) = ∑ i = 1 m ( x i 0 − θ a i j ) P i + θ P j = b \sum_{i=1}^m \mathbf{P}_i x_i^0+\theta\left(\mathbf{P}_j-\sum_{i=1}^m \mathbf{P}_i a_{i j}\right)=\sum_{i=1}^m\left(x_i^0-\theta a_{i j}\right) \mathbf{P}_i+\theta \mathbf{P}_j=\mathbf{b} i=1mPixi0+θ(Pji=1mPiaij)=i=1m(xi0θaij)Pi+θPj=b

即存在 X 1 = ( x 1 1 − θ a l j , x 2 1 − θ a 2 j , … x m 1 − θ a m j , 0 , 0 , … , θ , … , 0 ) T \mathbf{X}^1=\left(x_1^1-\theta a_{l j}, x_2^1-\theta a_{2 j}, \ldots x_m^1-\theta a_{m j}, 0,0, \ldots, \theta, \ldots, 0\right)^{\mathrm{T}} X1=(x11θalj,x21θa2j,xm1θamj,0,0,,θ,,0)T 满足约束 ∑ j = 1 n P j x j = b \sum_{j=1}^n \mathbf{P}_j x_j=\mathbf{b} j=1nPjxj=b

X 1 \mathbf{X}^1 X1 为基可行解,还需满足:所有分量全部大于等于 0;非零分量个数小于等于 m \mathrm{m} m 个。也就是需要使 x i 1 − θ a i j ( i = 1 , 2 , … , m ) x_i^1-\theta a_{i j}(i=1,2, \ldots, m) xi1θaij(i=1,2,,m) 中至少存在一个等于 0,其余均大于 0 。已知 θ > 0 \theta>0 θ>0,若存在一个 a i j > 0 a_{i j}>0 aij>0,且 θ = min ⁡ { x i a i j ∣ a i j > 0 } \theta=\min \left\{\frac{x_i}{a_{i j}} \mid a_{i j}>0\right\} θ=min{aijxiaij>0},即可满足条件。


基于以上分析,单纯形表中迭代解操作为: x l x_l xl 作为换出变量, x j x_j xj 作为换入变量,通过行倍乘化 a l j a_{lj} alj 为 1,再将 P j \mathbf{P}_j Pj 化为标准单位向量。

P = [ 1 0 … 0 0 0 a 1 , m + 1 a 1 , m + 2 … a 1 , j a 1 , n − 1 a 1 , n 0 1 … 0 0 0 a 2 , m + 1 a 2 , m + 2 … a 2 , j a 2 , n − 1 a 2 , n 0 0 … … 0 0 a 3 , m + 1 a 3 , m + 2 … … a 3 , n − 1 a 3 , n … … … 1 … … … … … [ a l j ] … … 0 0 … … 1 0 a m − 1 , m + 1 a m − 1 , m + 2 … … a m − 1 , n − 1 a m − 1 , n 0 0 … 0 0 1 a m , m + 1 a m , m + 2 … a m , j a m , n − 1 a m , n ] ( m ∗ n ) \mathbf{P}=\left[\begin{array}{cccccc:cccccc} 1 & 0 & \ldots & 0 & 0 & 0 & a_{1, m+1} & a_{1, m+2} & \ldots & a_{1, j} & a_{1, n-1} & a_{1, n} \\ 0 & 1 & \ldots & 0 & 0 & 0 & a_{2, m+1} & a_{2, m+2} & \ldots & a_{2, j} & a_{2, n-1} & a_{2, n} \\ 0 & 0 & \ldots & \ldots & 0 & 0 & a_{3, m+1} & a_{3, m+2} & \ldots & \ldots & a_{3, n-1} & a_{3, n} \\ \ldots & \ldots & \ldots & 1 & \ldots & \ldots & \ldots & \ldots & \ldots & {\left[a_{l j}\right]} & \ldots & \ldots \\ 0 & 0 & \ldots & \ldots & 1 & 0 & a_{m-1, m+1} & a_{m-1, m+2} & \ldots & \ldots & a_{m-1, n-1} & a_{m-1, n} \\ 0 & 0 & \ldots & 0 & 0 & 1 & a_{m, m+1} & a_{m, m+2} & \ldots & a_{m, j} & a_{m, n-1} & a_{m, n} \end{array}\right]_{\left(m* n\right)} P= 100000100000100001000001a1,m+1a2,m+1a3,m+1am1,m+1am,m+1a1,m+2a2,m+2a3,m+2am1,m+2am,m+2a1,ja2,j[alj]am,ja1,n1a2,n1a3,n1am1,n1am,n1a1,na2,na3,nam1,nam,n (mn)


单纯形法–最优性检验

检验当前解是否为最优解,若不是确定换入换出变量。

由线性规划可得:

x i = b i − ( a i , m + 1 x m + 1 + a i , m + 2 x m + 2 + … + a i , n x n ) = b i − ∑ j = m + 1 n a i j x j x_i=b_i-\left(a_{i, m+1} x_{m+1}+a_{i, m+2} x_{m+2}+\ldots+a_{i, n} x_n\right)=b_i-\sum_{j=m+1}^n a_{i j} x_j xi=bi(ai,m+1xm+1+ai,m+2xm+2++ai,nxn)=bij=m+1naijxj

z = ∑ j = 1 n c j x j = ∑ i = 1 m c i x i + ∑ j = m + 1 n c j x j = ∑ i = 1 m c i ⋅ ( b i − ∑ j = m + 1 n a i j x j ) + ∑ j = m + 1 n c j x j = ∑ i = 1 m c i b i − ∑ i = 1 m c i ∑ j = m + 1 n a i j x j + ∑ j = m + 1 n c j x j = ∑ i = 1 m c i b i − ∑ j = m + 1 n ( ∑ i = 1 m c i ⋅ a i j x j − c j ⋅ x j ) = ∑ i = 1 m c i b i + ∑ j = m + 1 n ( c j − ∑ i = 1 m c i a i j ) x j \begin{aligned} & z=\sum_{j=1}^n c_j x_j=\sum_{i=1}^m c_i x_i+\sum_{j=m+1}^n c_j x_j=\sum_{i=1}^m c_i \cdot\left(b_i-\sum_{j=m+1}^n a_{i j} x_j\right)+\sum_{j=m+1}^n c_j x_j=\sum_{i=1}^m c_i b_i-\sum_{i=1}^m c_i \sum_{j=m+1}^n a_{i j} x_j+\sum_{j=m+1}^n c_j x_j \\ & =\sum_{i=1}^m c_i b_i-\sum_{j=m+1}^n\left(\sum_{i=1}^m c_i \cdot a_{i j} x_j-c_j \cdot x_j\right)=\sum_{i=1}^m c_i b_i+\sum_{j=m+1}^n\left(c_j-\sum_{i=1}^m c_i a_{i j}\right) x_j \end{aligned} z=j=1ncjxj=i=1mcixi+j=m+1ncjxj=i=1mci(bij=m+1naijxj)+j=m+1ncjxj=i=1mcibii=1mcij=m+1naijxj+j=m+1ncjxj=i=1mcibij=m+1n(i=1mciaijxjcjxj)=i=1mcibi+j=m+1n(cji=1mciaij)xj

z 0 = ∑ i = 1 m c i b i \mathrm{z}_0=\sum_{i=1}^m c_i b_i z0=i=1mcibi z j = ∑ i = 1 m c i a i j z_j=\sum_{i=1}^m c_i a_{i j} zj=i=1mciaij,于是, z = z 0 + ∑ j = m + 1 n ( c j − z j ) x j = z 0 + ∑ j = m + 1 n σ j x j \mathrm{z}=\mathrm{z}_0+\sum_{j=m+1}^n\left(c_j-z_j\right) x_j=z_0+\sum_{j=m+1}^n \sigma_j x_j z=z0+j=m+1n(cjzj)xj=z0+j=m+1nσjxj

根据如下流程图检验解的情况:
在这里插入图片描述

这篇关于单纯形法迭代原理及解的判定的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

poj 1127 线段相交的判定

题意: 有n根木棍,每根的端点坐标分别是 px, py, qx, qy。 判断每对木棍是否相连,当他们之间有公共点时,就认为他们相连。 并且通过相连的木棍相连的木棍也是相连的。 解析: 线段相交的判定。 首先,模板中的线段相交是不判端点的,所以要加一个端点在直线上的判定; 然后,端点在直线上的判定这个函数是不判定两个端点是同一个端点的情况的,所以要加是否端点相等的判断。 最后

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

Smarty模板执行原理

为了实现程序的业务逻辑和内容表现页面的分离从而提高开发速度,php 引入了模板引擎的概念,php 模板引擎里面最流行的可以说是smarty了,smarty因其功能强大而且速度快而被广大php web开发者所认可。本文将记录一下smarty模板引擎的工作执行原理,算是加深一下理解。 其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者