计算机软件求解线性规划模型--Python

线性规划简介

线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法。英文缩写LP。

线性规划是运筹学的一个重要分支,广泛应用于军事作战、经济分析、经营管理和工程技术等方面。为合理地利用有限的人力、物力、财力等资源作出的最优决策,提供科学的依据。

线性规划模型的三要素

线性规划模型主要包括三个部分:决策变量、目标函数、约束条件

决策变量
决策变量是指问题中可以改变的量,例如生产多少货物,选择哪条路径等;线性规划的目标就是找到最优的决策变量。
在线性规划中决策变量包括实数变量,整数变量,0-1变量等。

目标函数
目标函数就是把问题中的决策目标量化,一般分为最大化目标函数和最小化目标函数。在线性规划中,目标函数为一个包含决策变量的线性函数,例如
max x 1 + x 2 \text{max}\quad x_1 +x_2 maxx1+x2
约束条件

约束条件是指问题中各种时间,空间,人力,物力等限制。在线性规划中约束条件一般表示为一组包含决策变量的不等式,例如
x 1 + 2 x 2 ≤ 10 4 x 1 + 3 x 2 ≤ 24 \begin{array}{r} x_{1}+2 x_{2} \leq 10 \\ 4 x_{1}+3 x_{2} \leq 24 \end{array} x1+2x2104x1+3x224
此外,决策变量的取值范围称为符号约束,例如:
x 1 ≥ 0 , x 2 ≥ 0 x_1 \geq 0,x_2\geq 0 x10,x20

线性规划模型的数学表示

线性规划模型可以写成如下形式:
max ⁡ z = x 1 + x 2  s.t.  x 1 + 2 x 2 ≤ 10 4 x 1 + 3 x 2 ≤ 24 x 1 , x 2 ≥ 0 \begin{aligned} &\max \quad z=x_{1}+x_{2}\\ &\text { s.t. } \quad x_{1}+2 x_{2} \leq 10\\ &\begin{array}{r} \quad \quad 4 x_{1}+3 x_{2} \leq 24 \\ \quad x_{1}, x_{2} \geq 0 \end{array} \end{aligned} maxz=x1+x2 s.t. x1+2x2104x1+3x224x1,x20
其中, s . t . s.t. s.t. 表示 s u b j e c t    t o subject \; to subjectto 的缩写。

上述模型的矩阵形式如下:
max ⁡ z = c T x  s.t.  A x ≤ b x ≥ 0 \begin{array}{rr} \max & z=c^{T} x \\ \text { s.t. } & A x \leq b \\ & x \geq 0 \end{array} max s.t. z=cTxAxbx0
对于有 n n n 个决策变量, m m m 个约束的线性规划模型, c , x c,x c,x n n n 维列向量, b b b m m m 为列向量, A A A m ∗ n m*n mn 维系数矩阵。

单纯型法标准型与编程过程的“标准型”

单纯型法:

​ 单纯型法思路就是在 可行域的一个顶点处找到一个初始可行解判断该解是不是最优,若不是,则迭代到下一个顶点处进行重复判断。因为最优解的搜索范围从整个可行域缩小到了可行域的有限个顶点,算法的效率得到了极大的提升。

在这里插入图片描述

在单纯型法中,我们通过增加变量等将约束条件变成等式。在编程中,一般支持直接写等式约束小于等于约束

在单纯型法中,我们将最大化目标函数视为标准型。在编程中,我们将最小化目标函数作为标准型。

Python 求解线性规划模型

编程思路:

1. 选择适当的决策变量

在解决实际问题时,把问题归结成一个线性规划数学模型是很重要的一步,但往往也是困难的一步,模型建立得是否恰当,直接影响到求解。而选适当的决策变量,是我们建立有效模型的关键之一。

2.将求解目标简化为求一个目标函数的最大/最小值

能把要求解的问题简化为一个最值问题是能否使用线性规划模型的关键,如果这一点不能达到,之后的工作都有没有意义的。

3. 根据实际要求写出约束条件(正负性,资源约束等)

线性规划的约束条件针对不同的问题有不同的形式,总结来说有以下三种:等式约束、不等式约束、符号约束

考虑以下线性规划问题:
max ⁡ z = 2 x 1 + 3 x 2 − 5 x 3  s.t.  x 1 + x 2 + x 3 = 7 2 x 1 − 5 x 2 + x 3 ≥ 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 , x 2 , x 3 ≥ 0 \begin{array}{r} \max z=2 x_{1}+3 x_{2}-5 x_{3} \\ \text { s.t. } \quad x_{1}+x_{2}+x_{3}=7 \\ 2 x_{1}-5 x_{2}+x_{3} \geq 10 \\ x_{1}+3 x_{2}+x_{3} \leq 12 \\ x_{1}, x_{2}, x_{3} \geq 0 \end{array} maxz=2x1+3x25x3 s.t. x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30
Step1:导入相关函数库:

import numpy as np 
from scipy import optimize as op 

Step2: 定义决策变量:

# 给出变量取值范围
x1=(0,None)  
x2=(0,None)
x3=(0,None)

Step3: 将原问题化为标准形式

注意:编程时默认为最小化目标函数,因此这里改为 ;第二个约束为大于等于约束,这里化为小于等于约束;

Step4: 定义目标函数系数和约束条件系数

c=np.array([-2,-3,5])   # 目标函数系数,3x1列向量

A_ub=np.array([[-2,5,-1],[1,3,1]]) # 不等式约束系数A,2x3维矩阵
B_ub=np.array([-10,12])  # 等式约束系数b, 2x1维列向量
A_eq=np.array([[1,1,1]])  # 等式约束系数Aeq,3x1维列向量
B_eq=np.array([7])   # 等式约束系数beq,1x1数值

Step5: 求解

res=op.linprog(c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) #调用函数进行求解
print('结果如下:\n',res)

完整代码如下:

import numpy as np 
from scipy import optimize as op 
# 给出变量取值范围
x1=(0,None)  
x2=(0,None)
x3=(0,None)
c=np.array([-2,-3,5])   # 目标函数系数,3x1列向量

A_ub=np.array([[-2,5,-1],[1,3,1]]) # 不等式约束系数A,2x3维矩阵
B_ub=np.array([-10,12])  # 等式约束系数b, 2x1维列向量
A_eq=np.array([[1,1,1]])  # 等式约束系数Aeq,3x1维列向量
B_eq=np.array([7])   # 等式约束系数beq,1x1数值
res=op.linprog(c,A_ub,B_ub,A_eq,B_eq,bounds=(x1,x2,x3)) #调用函数进行求解
print('结果如下:\n',res)

结果如下

结果如下:
      con: array([1.80712334e-09])
     fun: -14.571428565645078
 message: 'Optimization terminated successfully.'
     nit: 5
   slack: array([-2.24570584e-10,  3.85714286e+00])
  status: 0
 success: True
       x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])

即,当 x 1 = 6.42857143 , x 2 = 0.571428571 , x 3 = 2.35900788 × 1 0 − 10 x_1=6.42857143,x_2=0.571428571,x_3=2.35900788\times10^{-10} x1=6.42857143,x2=0.571428571,x3=2.35900788×1010 时候目标函数取得最大值。

部分内容参考其他文章
分享自微信公众号 - 数据科学CLUB(jiji8215)
作者:少年吉

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极星~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值