线性规划的单纯形法及python实现

1. 线性规划的解

一个线性规划(LP)问题如果有最优解,必定有一个最优解出现在顶点上。

从几何上讲,线性规划的约束集合为凸面体,一个超平面(目标函数的等值面)靠近约束集合时,最先接触到的必然是凸面体的一个顶点或一条边,因此一定有一个最优解出现在顶点上。

2. 线性规划的标准型

线性规划的标准型为:
min ⁡   c T x s . t .   A x = b   x ≥ 0 \begin{align*} \min &~\mathbf{c}^T\mathbf{x}\\ s.t. &~\mathbf{Ax=b}\\ &~\mathbf{x\geq 0} \end{align*} mins.t. cTx Ax=b x0
可以通过以下两个方式转化成标准型:

  1. 将所有不等式约束转化为等式约束:通过增加非负的松弛变量,
  2. 将所有变量转化为非负约束:负约束变量通过引入非负变量,无约束变量使用两个非负变量的差值表示。

对于线性方程组 A x = b \mathbf{Ax=b} Ax=b A ∈ R m × n \mathbf{A}\in\mathbb{R}^{m\times n} ARm×n,通过令 n − m n-m nm个变量为0(非基变量),解出的变量称为基变量,构成一组基本解

3. 初级单纯形法

单纯形法就是在顶点上搜索LP的最优解。求解步骤如下:

  1. 初始化:化成标准型,写出单纯形表,并找一个初始基本解。
    例如(见《运筹学(原书第2版)》(——罗纳德L.拉丁)5.3节):考虑如下标准型:
    max ⁡   12 x 1 + 9 x 2 s . t .   x 1 + x 3   = 1000   x 2 + x 4 = 1500 x 1 + x 2 + x 5 = 1750   4 x 1 + 2 x 2 + x 6 = 4800 x 1 , x 2 , x 3 , x 4 , x 5 , x 6 ≥ 0 \begin{align*} \max ~&12x_1+9x_2\\ s.t. ~&\quad x_1+\quad\quad\quad x_3\quad\quad\quad\quad\quad\quad~=1000\\ &\quad\quad\quad ~x_2+\quad\quad\quad x_4\quad\quad\quad\quad=1500\\ &\quad x_1+x_2+\quad\quad\quad\quad \quad x_5\quad\quad=1750\\ ~&4x_1+2x_2+\quad\quad\quad\quad \quad\quad\quad x_6=4800\\ &x_1,x_2,x_3,x_4,x_5,x_6\geq 0 \end{align*} max s.t.  12x1+9x2x1+x3 =1000 x2+x4=1500x1+x2+x5=17504x1+2x2+x6=4800x1,x2,x3,x4,x5,x60
    先找到一个顶点,即初始基本解。令 x 1 , x 2 = 0 x_1,x_2=0 x1,x2=0为非基变量,可以求解方程组得到初始基本解 x ( 0 ) = ( 0 , 0 , 1000 , 1500 , 1750 , 4800 ) \mathbf{x}^{(0)}=(0,0,1000,1500,1750,4800) x(0)=(0,0,1000,1500,1750,4800)。系数表如下:
x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 x 5 x_5 x5 x 6 x_6 x6
c \mathbf{c} c 12 9 0 0 0 0 b \mathbf{b} b
A \mathbf{A} A 1 0 1 0 0 0 1000
0 1 0 1 0 0 1500
1 1 0 0 1 0 1750
4 2 0 0 0 1 4800
N N N N N N B B B B B B B B B B B B
x ( 0 ) \mathbf{x}^{(0)} x(0) 0 0 1000 1500 1750 4800
  1. 找到可行方向 Δ x \Delta \mathbf{x} Δx

首先因为相邻顶点的紧约束组只相差一个,并且标准型只有等式约束,而等式约束始终是紧约束,所以这里能放松的只有非基变量的非负约束。我们可以有 ( Δ x 1 , Δ x 2 ) = ( 1 , 0 ) , ( 0 , 1 ) (\Delta x_1,\Delta x_2)=(1,0),(0,1) (Δx1,Δx2)=(1,0),(0,1)两种选择。

接着根据线性规划的可行方向的性质可知,可行方向满足 A Δ x = 0 \mathbf{A}\Delta\mathbf{x}=\mathbf{0} AΔx=0,将上面两种情况分别代入,可以求解一个线性方程算出基变量的方向。

然后由 Δ f = c T Δ x \Delta f=\mathbf{c}^T\Delta \mathbf{x} Δf=cTΔx可以算出每个方向对函数值的优化情况。

x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 x 5 x_5 x5 x 6 x_6 x6
c \mathbf{c} c 12 9 0 0 0 0 b \mathbf{b} b
A \mathbf{A} A 1 0 1 0 0 0 1000
0 1 0 1 0 0 1500
1 1 0 0 1 0 1750
4 2 0 0 0 1 4800
N N N N N N B B B B B B B B B B B B
x ( 0 ) \mathbf{x}^{(0)} x(0) 0 0 1000 1500 1750 4800 c T x = 0 \mathbf{c}^T\mathbf{x}=0 cTx=0
x 1 x_1 x1 Δ x \Delta \mathbf{x} Δx 1 0 -1 0 -1 -4 Δ f = 12 > 0 \Delta f=12>0 Δf=12>0
x 2 x_2 x2 Δ x \Delta \mathbf{x} Δx 0 1 0 -1 -1 -2 Δ f = 9 > 0 \Delta f=9>0 Δf=9>0
  1. 判断最优性
    根据每个方向的 Δ f \Delta f Δf可知函数值还可以继续优化,不能优化则迭代停止。
  2. 确定步长
    根据可行方向有负值,可知约束集在此处有界。如果找到一个可以无限移动的方向,说明约束集无界,停止迭代。
    这里取 x 1 x_1 x1 Δ x \Delta \mathbf{x} Δx作为迭代方向。现在让 x ( 0 ) \mathbf{x}^{(0)} x(0)点沿着可行方向移动,直到有一个基变量最先降为0,因此步长为 λ = 1000 \lambda=1000 λ=1000
  3. 新顶点和基
    新顶点为 x ( 1 ) = x ( 0 ) + λ Δ x = ( 0 , 0 , 1000 , 1500 , 1750 , 4800 ) + 1000 × ( 1 , 0 , − 1 , 0 , − 1 , − 4 ) = ( 1000 , 0 , 0 , 1500 , 750 , 800 ) \begin{align*} \mathbf{x}^{(1)}&=\mathbf{x}^{(0)}+\lambda \Delta \mathbf{x}\\ &=(0,0,1000,1500,1750,4800)+1000\times(1,0,-1,0,-1,-4)\\ &=(1000,0,0,1500,750,800)\end{align*} x(1)=x(0)+λΔx=(0,0,1000,1500,1750,4800)+1000×(1,0,1,0,1,4)=(1000,0,0,1500,750,800)
    此时, x 1 x_1 x1入基成为新的基变量, x 3 x_3 x3出基成为非基变量,新基为 { x 1 , x 4 , x 5 , x 6 } \{ x_1, x_4, x_5, x_6\} { x1,x4,x5,x6}。回到第二步,继续寻找可行方向,判断是否能继续优化。迭代过程如下:
x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 x 5 x_5 x5 x 6 x_6 x6
c \mathbf{c} c 12 9 0 0 0 0 b \mathbf{b} b
A \mathbf{A} A 1 0 1 0 0 0 1000
0 1 0 1 0 0 1500
1 1 0 0 1 0 1750
4 2 0 0 0 1 4800
t = 0 t=0 t=0 N N N N N N B B B B B B B B B B B B
x ( 0 ) \mathbf{x}^{(0)} x(0) 0 0 1000 1500 1750 4800 c T x = 0 \mathbf{c}^T\mathbf{x}=0 cTx=0
x 1 x_1 x1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值