浅谈线性规划:No.2 单纯形法及matlab代码实现

本文详细介绍单纯形法的基本概念、求解步骤及MATLAB实现。包括线性规划的标准型转换、单纯形表的构建与迭代过程,以及如何通过MATLAB进行线性规划问题的求解。

 目录

一、 相关概念及定理

二、基本思路

三、线性规划的标准型

四、单纯形法求解

       1. 建立单纯形表

        2. 确定离基变量

        3. 确定离基变量

        4. 确立新的单纯形表

        5. 迭代

         6. 得到最优解

 五、matlab代码实现


         单纯形法的难点主要在于其计算的规则复杂与繁琐。因此,要学好单纯形法,我们必须明确其核心概念,并且牢记其运算规则,如果能理解其运作的原理那么久更加好了!因此,本文将从概念定理出发,并介绍其基本思路,再进行具体求解过程的整理,最后也会给出线性规划matlab具体的代码实现

        想要快速熟练地掌握与掌握单纯形法,要牢记每个符号与概念的涵义噢~

一、 相关概念及定理

        在介绍单纯形法之前,我们需要对其相关基本概念进行一个简单的介绍:

        1)基矩阵:系数矩阵A中任意m列的m阶(m 为 约束条件的个数)的非奇异(线性无关)子矩阵,称为线性规划问题的一个基,B表示。基矩阵的列为基向量,用Pj表示。

        2)基变量:与基向量Pj横向对应的变量xj称为基变量,其余的变量为非基变量。

        3)基解令非基变量为零,对m个基变量求解。对应的基矩阵能够求得唯一的一组解。

        4)可行解:满足约束条件AX=b, X≥0的解。

        5)最优解:使目标函数最优的可行解

        6)最优基:最优基对应的最优解

        以下为各种解之间的关系:

        同时,我们也给大家介绍一下线性规划的基本定理(可先跳过,学习完整章再回来理解):

                定理1. 若线性规划问题存在可行域,则其可行域一定是凸集。
                定理2. 线性规划问题的基可行解对应可行域的顶点。
                定理3. 若可行域有界,线性规划的目标函数一定可以在可行域的顶点上达到最优。
                定理4. 线性规划如果有可行解,则一定有基可行解;如果有最优解,则一定有基可行解是最优解。 

二、基本思路

        单纯形法的基本思路是:先找到一个可以得到目标函数的可行解,然后在这个初始可行解的基础上,保持方程组有解的情况去对解进行优化可行解,最后得到全局的最优解。

tips: 单纯形法的这个思路与我们后面学习到的对偶单纯形法有着异曲同工之处。

        以下是线性规划单纯形法的具体求解过程

三、线性规划的标准型

a.标准型的三种形式

         线性规划的标准型主要有三种:代数式、向量式、矩阵式。这三种标准型所表达的内容都相同,即目标函数、约束条件。标准型除了形式,还有其他的要求:目标函数要求极大化(max)、约束条件为等式、右端常数项bi ≥ 0、决策变量满足非负性

        1)代数式:

        2)向量式:

         3)矩阵式:

 b. 标准型转化方法

        在实际中,我们的线性规划最开始很可能不符合标准型的要求,如目标函数求最小值、变量xi无约束等。据此,我们有相应的方法对其进行约束并转化为标准型:

        1)极小化目标: minZ=CX,则令 Z'=-Z,转为求 maxZ'=-CX
        2)某一资源 : bi<0:则以-1乘该约束两端,使之满足非负性的要求
        3)对于≤约束:则在左端加上一个非负松弛变量,使其为等式
        4)对于≥约束:则在左端减去一个非负剩余变量,使其为等式
        5) 无非负约束:令xk=x'k-x"k , (x'k≥0, x"k ≥0)

c. 案例

        有如下线性规划题目:

                目标函数: maxZ = 3{x}_1 + 5{x}_2

                ​​​​约束条件:                     \left\{\begin{matrix} 2{x}_1 \leq 16 & \\ 2{x}_2 \leq 10 & \\ 3{x}_1 +4{x}_2 \leq32 & \end{matrix}\right.        x1, x2≥0

        上述约束条件中为 ≤约束 ,这代表 等式右端 所代表的资源盈余,因此我们需要在 等式左端 分别为其加上一个松弛变量,使其变为等式:

                                                        \left\{\begin{matrix} 2{x}_1 +{x}_3 = 16& & & & \\ {x}_2 + {x}_4 = 10 & & & & \\ 3{x}_1 +4{x}_2 + {x}_5 = 32 & & & & \end{matrix}\right.

四、单纯形法求解

        终于终于终于终于进入正题了!单纯形法的准确求解是我们解决学好线性规划不可或缺的部分,也是我们学习后续对偶规划、整数规划的重要基础。因此,快一起好好学起来叭!

        笔者只介绍我们最常用的单纯形法中的表格法(对于代数法如果有兴趣的话可以自行了解)

       1. 建立单纯形表

        将标准型化为单纯性表。

{c}_j35000{\theta }_i
{C}_B{X}_Bb{x}_1{x}_2{x}_3{x}_4{x}_5
0{x}_31620100
0{x}_41001010
0{x}_53234001
{\sigma}_j35000

         参数解释:

                {c}_j:各变量的价值系数。

                {C}_B:当前基变量的价值系数。

                {X}_B:当前基变量。

                b:资源向量。

                {\sigma}_j:用于确定进基变量的检验数,找到最大的检验数对应的变量作为进基变量;{\sigma}_j = {c}_j-{C}_B B^{-1}{P}_j 。其中,B^{-1}{P}_j 为当前单纯形表中系数矩阵的列向量,如B^{-1}{P}_1 = (2,0,3)^{T} 

                {\theta}_i:用于确定离基变量。在确定进基变量{x}_k后,我们需要计算出{\theta }_i_k的值。取最小的{\theta }_i_k

所对应的{x}_i作为离基变量。{\theta}_i_k = \frac{​{b}_i}{​{a}_i_k} ,其中,{a}_i_k为系数矩阵中i行k列的值。

        2. 确定离基变量

        1)根据公式 {\sigma}_j = {c}_j-{C}_B B^{-1}{P}_j ,计算出所有非基变量的检验数,基变量的检验数为0。

        2)若所有σj≤0, 则问题已得到最优解。否则,进入下一步计算

        3)在大于0的检验数中, 若某个{\sigma }_k所对应的系数列向量{P}_k′≤0, 则此问题是无界解, 停止计算, 否则转入下步。

        4)找到最大的检验数{\sigma }_k所对应的变量{x}_k,作为进基变量。在案例中,{x}_2所对应的检验数最大,因此将{x}_2作为进基变量:

{c}_j35000{\theta }_i
{C}_B{X}_Bb{x}_1{x}_2{x}_3{x}_4{x}_5
0{x}_31620100
0{x}_410010105
0{x}_532340018
{\sigma}_j35000

        3. 确定离基变量

        1)计算逐行计算 {\theta }_i 值:{b}_1 对应的{a}_1_1 为0,因此不予计算;{\theta}_2 = 10 / 2 = 5{\theta}_3 = 32 / 4 = 8

{c}_j35000{\theta }_i
{C}_B{X}_Bb{x}_1{x}_2{x}_3{x}_4{x}_5
0{x}_31620100
0{x}_410010105
0{x}_532340018
{\sigma}_j35000

        2)挑选最小 的 {\theta} 值对应的行变量作为离基变量,{x}_4

        4. 确立新的单纯形表

        1)确定新的基变量,经过{x}_2进基、{x}_5 离基后,新的基变量 {X}_B = ({x}_3, {x}_2, {x}_5)^{T}

        2)对矩阵进行初等行变换(记得也要对b进行同等变换),使基变量主元为1,主列其余变为0:

{c}_j35000{\theta }_i
{C}_B{X}_Bb{x}_1{x}_2{x}_3{x}_4{x}_5
0{x}_316201008
5{x}_250101/20
0{x}_512300-214
{\sigma}_j300-5/20

        5. 迭代

        重复2、3、4的操作,直到求出最优解判定该线性规划问题无解/有无穷解。

        第二次迭代:{x}_1进基、{x}_5离基

{c}_j35000{\theta }_i
{C}_B{X}_Bb{x}_1{x}_2{x}_3{x}_4{x}_5
0{x}_316201008
5{x}_250101/20
0{x}_512300-214
{\sigma}_j300-5/20

        第三次迭代:检验数均 ≤ 0 线性规划达到最优解。

{c}_j35000{\theta }_i
{C}_B{X}_Bb{x}_1{x}_2{x}_3{x}_4{x}_5
0{x}_380014/3-2/3
5{x}_250101/20
3{x}_14100-2/31/3
{\sigma}_j000-5/2-1

         6. 得到最优解

        根据最后的单纯形表,我们可以得到最优解:X = (4, 5, 8, 0, 0)^{T},目标函数取得最大值:Z = 37。

        同时,根据初始单纯形表,我们可以得到最优基矩阵:

                                                  \begin{pmatrix} 1 & 0 &2 \\ 0 & 2 & 0\\ 0 & 4 & 3 \end{pmatrix}

        同时,从最末的单纯性表中,我们可以得到最优基矩阵的逆B^{-1}

                                {X}_N = B^{-1}I         =>        B^{-1} = {X}_N

        因此,原始基变量 在 最末矩阵中 对应的子矩阵即 最优基矩阵的逆B^{-1}

                                                \begin{pmatrix} 1 & \frac{4}{3} &-\frac{2}{3} \\ 0 & \frac{1}{2} & 0\\ 0 & -\frac{2}{3}& \frac{1}{3} \end{pmatrix}

 五、matlab代码实现

        在matlab中,我们使用 linprog() 函数对线性规划问题进行求解。linprog在matlab官方说明文档中有详细的解释。以下是我总结了较为普遍的用法:

[x,val] = linprog(f,A,b,Aeq,beq,lb,ub) 

返回值:x 是 该线性规划取得最优解时的 变量取值、val 是线性规划取得最优解时的 目标函数值。

f :目标函数所表示的向量。注意我们需要将目标函数变为 求最小值的形式

A:表示为 不等式约束的系数矩阵( ≤ 的关系)

b:表示为 不等式约束的资源向量( ≤ 的关系)

Aeq:表示为 等式约束的稀疏矩阵

beq:表示为 等式约束的资源向量

lb:变量下界所表示的向量

ub:变量的上界所表示的向量

        以本文的案例为例,使用matlab求解:

        目标函数:    maxZ = 3{x}_1 + 5{x}_2       =>        minZ = -3{x}_1 - 5{x}_2

        约束条件:        \left\{\begin{matrix} 2{x}_1 \leq 16 & \\ 2{x}_2 \leq 10 & \\ 3{x}_1 +4{x}_2 \leq32 & \end{matrix}\right.

        变量下界:        [0,0],  变量无上届。

   本文中案例具体matlab实现代码如下所示:

clear;
clc;
f = [-3,-5];
A = [2,0;0,2;3,4];
b = [16;10;32];
Aeq = [];
beq = [];
lb = [0,0];
ub = [];
[x,val] = linprog(f,A,b,Aeq,beq,lb,ub)

代码运行结果与先前单纯形法结果相同(需要将 val 取反): 

后续将整理单纯形法中的大M法相关知识点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值