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

线性规划简介

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

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

线性规划模型的三要素

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

决策变量
决策变量是指问题中能够改变的量,例如生产多少货物,选择哪条路径等;线性规划的目标就是找到最优的决策变量。
在线性规划中决策变量包括实数变量,整数变量,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


spa

线性规划模型的数学表示

线性规划模型能够写成以下形式:
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 的缩写。

3d

上述模型的矩阵形式以下:
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 维系数矩阵。

code

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

单纯型法:blog

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

在这里插入图片描述

在单纯型法中,咱们经过增长变量等将约束条件变成等式。在编程中,通常支持直接写等式约束小于等于约束

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

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) 做者:少年吉

相关文章
相关标签/搜索