数学建模 所用到的算法 python 实现

线性规划

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

启示

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

实例1:普通问题

某机床厂生产甲、乙两种机床,每台销售后的利润分别为4000元与3000元。生产甲机床需用A、B机器加工,加工时间分别为每台2小时和1小时;生产乙机床需用A、B、C三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时数分别为A机器10小时、B机器8小时和C机器7小时,问该厂应生产甲、乙机床各几台,才能使总利润最大?
思路
在一组线性约束条件的限制下,求一线性目标函数最大或最小的问题。
求解
  约束条件
{ 2 x 1 + x 2 ≤ 10 x 1 + x 2 ≤ 8 x 2 ≤ 7 x 1 , x 2 ≥ 0 \begin{cases} 2x_1+x_2 \leq 10 \\ x_1 + x_2 \leq 8 \\ x_2 \leq 7 \\ x_1,x_2 \geq 0 \\ \end{cases} 2x1+x210x1+x28x27x1,x20
  目标函数
m a x    z = 4 x 1 + 3 x 2 max \ \ z=4x_1+3x_2 max  z=4x1+3x2
python使用scipy.optimize.linprog

linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simplex', callback=None, options=None)

其中标准式

使最小化:     c^T * x

        服从:   A_ub * x <= b_ub
                      A_eq * x == b_eq

代码

#! /usr/bin/python3
# 导入一下包,没有的自行pip
import numpy
from scipy import optimize

c = [-4, -3]
A_ub = [[2, 1], [1, 1], [0, 1]]
b_ub = [10, 8, 7]
A_eq = None
b_eq = None
bounds = [[0, None], [0, None]]
result = optimize.linprog(c, A_ub, b_ub, A_eq, b_eq, bounds)
print(result)

结果

     con: array([], dtype=float64)
     fun: -25.999999999841215
 message: 'Optimization terminated successfully.'
     nit: 5
   slack: array([8.02451439e-11, 3.92690325e-11, 1.00000000e+00])
  status: 0
 success: True
       x: array([2., 6.])

fun最大值:26
array最优解: x 1 = 2 , x 2 = 6 x_1=2,x_2=6 x1=2x2=6

实例2:可以转换线性规划的问题

很多看起来不是线性规划的问题也可以通过变换变成线性规划的问题来解决。如:
m i n   ∣ x 1 ∣ + ∣ x 2 ∣ + ⋅ ⋅ ⋅ + ∣ x n ∣ s . t .    A x < b min \ \left | x_1 \right |+\left | x_2 \right |+···+\left | x_n \right | \\ s.t. \ \ Ax < b\\ min x1+x2++xns.t.  Ax<b
其中 x = [ x 1 . . . x n ] T x=[x_1 ...x_n]^T x=[x1...xn]T、A和b为相应维数的矩阵和向量。
思路
要把上面的问题变换成线性规划问题,只要注意到事实:
对任意的 x i x_i xi,存在 u i , v i > 0 u_i,v_i>0 ui

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值