数学建模part(1):线性规划

线性规划的目标:寻求决策变量最优的组合方案

模型建立步骤:

  1. 模型假设:需要假设不同决策变量之间相互独立,以及约束条件与价值向量的值是固定
  2. 求解线性规划
    • 非线性尽可能转化为线性
    • 多目标规划:
      • 控制变量:逐个目标考虑(先固定一个目标
      • 同时考虑两个目标,设置两个目标之间的权重分配
  3. 灵敏性分析:对系数的波动影响可视化结果

符号说明

  • 🍁 不要求掌握
  • ✅要求掌握

解决工具:

  • matlab
  • python
  • lingo

线性规划(linear programming) 三要素:

  • 决策变量 :控制量
  • 目标函数:决策变量的线性函数
  • 约束条件:限制范围

线性规划模型的一般形式:
m a x ( m i n )   z = ∑ j = 1 n c j x j s . t . { ∑ j n a i j x j ≤ ( ≥ , = ) b i , i = 1 , 2 , … , m , x j ≥ 0 , i = 1 , 2 , … , m , max(min) ~z=\sum_{j=1}^{n}c_jx_j\\ s.t. \left\{ \begin{aligned} \sum_{j}^{n}a_{ij}x_j &\le(\ge,=)b_i,&i=1,2,\dots,m,\\ x_j\ge0, &&i=1,2,\dots,m, \end{aligned} \right. max(min) z=j=1ncjxjs.t. jnaijxjxj0,(,=)bi,i=1,2,,m,i=1,2,,m,

  • 目标函数是 x j x_j xj j个变量的线性组合
  • 约束条件的形式:
    • 不等式
    • 等式
    • 整数(整数规划)

矩阵形式:
m a x ( m i n )   z = c T x s . t . { A x ≤ ( ≥ , = ) b , x ≥ 0 , max(min)~z=c^Tx\\ s.t. \left\{ \begin{aligned} Ax\le&(\ge,=)b,\\ x\ge0, \end{aligned} \right. max(min) z=cTxs.t.{Axx0,(,=)b,

  • x 为 [ x 1 , x 2 . . . ] [x_1,x_2...] [x1,x2...] ,矩阵A的列数等于决策变量个数,每行为线性组合的系数: A x = ∑ j = 1 n p j x j Ax=\sum_{j=1}^{n}p_jx_j Ax=j=1npjxj
  • matlab中以矩阵为单位求解线性规划问题(不等号统一用 ≤ \le )
  • c T c^T cT价值向量 b b b 为资源向量(约束资源), x x x 为决策向量,A 为决策向量的系数矩阵

线性规划模型标准型
m a x   z = c T x s . t . { A x = b , x ≥ 0. max~z=c^Tx\\ s.t.\left\{ \begin{aligned} Ax=b,\\ x\ge0. \end{aligned} \right. max z=cTxs.t.{Ax=b,x0.


线性规划定理:

  1. 满足全部约束条件的决策向量 x ∈ R n x\in R^n xRn 称为可行解
  2. 全部可行解的集合称为可行域
  3. 使目标函数达到最大值的可行解为最优解
  • 存在最优解时:
    • 无穷多个最优解(对应的目标函数值都相等)
    • 一个最优解
    • 有限个最优解
  • 无最优解
    • 可行域为空集
    • 可行域非空,但目标函数无界
  1. 求解线性规划问题:单纯型法

线性规划问题转换

  1. 绝对值变换:
    m i n   ∣ x 1 ∣ + ∣ x 2 ∣ + … ∣ x n ∣ s . t .   A x ≤ b min~|x_1|+|x_2|+\dots|x_n|\\ s.t.~Ax\le b min x1+x2+xns.t. Axb
    变量替换: x i = u i − v i , ∣ x i ∣ = u i + v i x_i=u_i-v_i,|x_i|=u_i+v_i xi=uivi,xi=ui+vi

    u i = x i + ∣ x i ∣ 2 , v i = ∣ x i ∣ − x i 2 u_i=\frac{x_i+|x_i|}{2},v_i=\frac{|x_i|-x_i}{2} ui=2xi+xi,vi=2xixi

    表达式变换为:
    m i n   ∑ i = 1 n ( u i + v i ) s . t . [ A , − A ] [ u i v i ] ≤ b u i ≥ 0 , v i ≥ 0 min~\sum_{i=1}^{n}(u_i+v_i)\\ s.t.[A,-A]\left[\begin{array}{rrr} u_i\\v_i\end{array}\right] \le b\\ u_i\ge0,v_i\ge0 min i=1n(ui+vi)s.t.[A,A][uivi]bui0,vi0
    变量 u i , v i u_i,v_i ui,vi都大于零则 ∣ x ∣ ≥ 0 |x|\ge0 x0恒成立,将绝对值问题化为两个决策变量之和

  2. 最大(小)值变换:
    m i n   { m a x   c i x i } s . t . A x ≤ b min~\{max~c_{i}x_i\}\\ s.t. Ax\le b min {max cixi}s.t.Axb
    x n + 1 = m a x   c i x i x_{n+1}=max~c_ix_i xn+1=max cixi,得到:
    m i n   x n + 1 A x ≤ b c i x i − x n + 1 ≤ 0 , i = 1 , 2 , . . n min~ x_{n+1}\\ Ax\le b\\ c_ix_i-x_{n+1}\le0 ,i=1,2,..n min xn+1Axbcixixn+10,i=1,2,..n

  3. 引入松弛变量:将不等式转化为等式


求解线性规划问题

线性规划标准型:
m i n   z = c T x s . t . { A x ≤ b , A e q   x =   b e q , L b ≤ x ≤ U b . min~z=c^Tx\\ s.t.\left\{ \begin{aligned} Ax\le b,\\ Aeq~x=&~beq,\\ Lb\le x\le& Ub. \end{aligned} \right. min z=cTxs.t. Axb,Aeq x=Lbx beq,Ub.

  • matlab

    • [x,fval]=linprog(f,A,b)
    • [x,fval]=linprog(f,A,b,Aeq,beq)
    • [x,fval]=linprog(f,A,b,Aeq,beq,lb,ub)
    • lb 和 ub 分别对应决策变量的下界,上界列向量
    • 如果没有等式约束:Aeq=[],beq=[] 设置为空矩阵

  • python

    • scipy.optimize求解器(求解简单的线性规划和非线性规划)

    • 函数:linprog (c,A,b,Aeq,beq,bounds,method) ✅

      • c:目标向量
      • A:约束矩阵
      • b:资源向量
      • Aeq,beq :等式矩阵
      • bounds:x的取值,默认为 0 ≤ x ≤ + ∞ 0\le x\le +\infty 0x+
      • method:算法(单纯型法‘simplex’,内点法…)
    • 代码:

      from scipy.optimize import linprog
      res=linprog(c,A,b,Aeq,beq,bounds,method)
      res.fun#目标函数最小值
      res.x#最有解
      
    • 对于max 用负号转化为最小值标准型

    范例:
    m i n   z = − x 1 + 4 x 2 s . t . { − 3 x 1 + x 2 ≤ 6 x 1 + 2 x 2 ≤ 4 x 2 ≥ 3 min~z=-x_1+4x_2\\ s.t.\left\{ \begin{aligned} -3x_1+x_2\le6\\ x_1+2x_2\le4\\ x_2\ge3 \end{aligned} \right. min z=x1+4x2s.t. 3x1+x26x1+2x24x23

    from scipy.optimize import linprog
    c = [-1, 4]; A = [[-3, 1], [1, 2]]
    b = [[6], [4]]
    bound=((None,None),(-3,None))# bound ((x1min,x1max),(x2min,x2max))
    res=linprog(c,A,b,None,None,bound)
    print("目标函数的最小值:",res.fun)
    print("最优解为:",res.x)
    
    #result:
    目标函数的最小值: -21.99999984082492
    最优解为: [ 9.99999989 -2.99999999]
    
    • 对于无约束的边界设置为None

    • 向量也可以传入数组代替列表(numpy)

    • 注意向量的维度

    • 构造bounds也可以像这样:

      Lb=[None,None]
      Ub=[-3,None]
      bound=tuple(zip(Lb,Ub))
      
    • cvxopt.solvers 模块求解线性规划:🍁
      m i n   z = c T x s . t . { A x ≤ b , A e q   x =   b e q , min~z=c^Tx\\ s.t.\left\{ \begin{aligned} Ax\le b,\\ Aeq~x=&~beq,\\ \end{aligned} \right. min z=cTxs.t.{Axb,Aeq x= beq,

      • 必须加载numpy 库
      • 构造矩阵 cvxpot.matrix()
      • 求解线性规划:cvxpot.solvers.lp(c,A,b) (x默认大于0)
      • 最优值cvxpot.solvers.lp(c,A,b)[‘x’]
      • 最优解cvxpot.solvers.lp(c,A,b) [‘primal objective’]
    • 凸优化库cvxpy 求解线性规划✅(最专业,可以求解线性,非线性,整数规划)

      • 构造决策变量矩阵
      • cvxpy.Variable((m,n))
      • cvxpy.Variable(n)
      • 构造目标函数 cvxpy.Minimize()
      • 构造约束条件(列表)
      • 构造模型 p=cvxpy.Problem()
      • 求解模型 p.solve(solver,verbose): 求解器(str),是否展示过程(bool)

      求解参照:

      import cvxpy as cp
      import numpy as np
      import pandas as pd
      d1=pd.read_excel("Pdata5_6.xlsx",header=None)
      d2=d1.values; #获取DataFrame 的值
      c=d2[:-1,:-1]# 构造价值矩阵
      d=d2[-1,:-1].reshape(1,-1); e=d2[:-1,-1].reshape(-1,1)
      x=cp.Variable((6,8))#决策变量6*8
      obj=cp.Minimize(cp.sum(cp.multiply(c,x)))  #构造目标函数
      con=[cp.sum(x,axis=1,keepdims=True)<=e,
      cp.sum(x,axis=0,keepdims=True)==d,x>=0]  #构造约束条件
      prob=cp.Problem(obj,con)  #构造模型
      prob.solve(solver='GLPK_MI',verbose =True)#求解模型
      
      print("最优值为:",prob.value)
      print("最优解为:\n",x.value)
      

      灵敏度分析

    灵敏度分析:对系统因周围变化显示出来的敏感程度的分析

    分析如下:

    1. 如果系数 a i j , b i ( 资源约束 ) , c j ( 价值系数 ) a_{ij},bi(资源约束),c_j(价值系数) aij,bi(资源约束),cj(价值系数) 发生改变,当前的最优方案会发生什么改变
    2. 将这些系数限制在什么范围内仍是最优解
    • 可以使用计算机迭代的方法(控制变量)寻求变换规律( f ( x ) f(x) f(x)

      • 控制步长,控制变量循环求最优解
      • 绘制散点图,可视化结果
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值