• 个人数学建模算法库之线性规划模型


    模型描述

    m i n   z = f T x        ( 1 )   s . t .            { A x ≤ b ( 2 ) A e q ⋅ x = b e q ( 3 ) l b ≤ x ≤ u b ( 4 )                        f 、 x 、 b 、 b e q 、 l b 、 u b 均为列向量                      f  称为价值向量 , b  称为资源向量                      l b  为决策变量的下界 , u b  为决策变量的上界                    A 、 A e q 为矩阵 {min}\ z=f^Tx \ \ \ \ \ \ (1)\\ \ \\ s.t. \ \ \ \ \ \ \ \ \ \ {Axb(2)Aeqx=beq(3)lbxub(4)\\ \ \\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f、x、b、beq、lb、ub均为列向量\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ f\ 称为价值向量,b\ 称为资源向量\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ lb\ 为决策变量的下界,ub\ 为决策变量的上界\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ A、Aeq为矩阵 min z=fTx      (1) s.t.           AxbAeqx=beqlbxub(2)(3)(4)                     fxbbeqlbub均为列向量                    f 称为价值向量,b 称为资源向量                    lb 为决策变量的下界,ub 为决策变量的上界                  AAeq为矩阵

    • (1)为目标函数 m i n   z min\ z min z 称为最优值

    • x x x的分量称为决策变量

    • (2),(3),(4)为约束条件,用 s . t . s.t. s.t.(subject to) 表示

    • (2)为不等式约束条件;(3)为等式约束条件;(4)为上下界约束条件

    • 满足约束条件的解 x = ( x 1 , x 2 , ⋅ ⋅ ⋅ , x n ) x=(x_1,x_2,···,x_n) x=(x1,x2,⋅⋅⋅,xn) 称为线性规划的可行解

    • 可行解中使得目标函数达到最值的解称为最优解

    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)
    
    • 1
    • 2
    • 3
    • x为最优解
    • fval为目标函数的最优值

    如:

    m a x   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 {max}\ z=2x_1+3x_2-5x_3\\ s.t. \ \ \ \ \ \ \ \ \ \ {x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30\\ max z=2x1+3x25x3s.t.           x1+x2+x3=72x15x2+x310x1+3x2+x312x1,x2,x30

    化为标准形式:

    m i n   − z = − 2 x 1 − 3 x 2 + 5 x 3 s . t .            { − 2 x 1 + 5 x 2 − x 3 ≤ − 10 x 1 + 3 x 2 + x 3 ≤ 12 x 1 + x 2 + x 3 = 7 0 ≤ x 1 , x 2 , x 3 {min}\ -z=-2x_1-3x_2+5x_3\\ s.t. \ \ \ \ \ \ \ \ \ \ {2x1+5x2x310x1+3x2+x312x1+x2+x3=70x1,x2,x3\\ min z=2x13x2+5x3s.t.           2x1+5x2x310x1+3x2+x312x1+x2+x3=70x1,x2,x3


    f = [ − 2 − 3 5 ] , x = [ x 1 x 2 x 3 ] f=[235] ,x=[x1x2x3] f= 235 ,x= x1x2x3

    A = [ − 2 5 − 1 1 3 1 ] , b = [ − 10 12 ] A=[251131], b=[1012]\\\\ A=[215311],b=[1012]

    A e q = [ 1 1 1 ] , b e q = [ 7 ] Aeq=[111],beq=[7] Aeq=[111],beq=[7]
    l b = [ 0 0 0 ] lb=[000]\\\\ lb= 000
    故编写代码如下:

    clc,clear
    
    % 目标函数
    f = [-2; -3; 5] ;
    
    % 不等式约束
    A=[-2 5 -1; 1 3 1];
    b=[-10; 12];
    
    % 等式约束
    Aeq=[1, 1, 1];
    beq= 7;
    
    % 上下界约束
    lb=[0; 0; 0];
    
    % 求解
    [x,zmin]=linprog(f,A,b,Aeq,beq,lb);
    zmax=-zmin;
    
    % 展示结果
    display(x);
    display(zmax);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    Optimal solution found.
    
    
    x =
    
        6.4286
        0.5714
             0
    
    
    zmax =
    
       14.5714
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    基于问题

    先建立线性规划的问题模型,决策变量,再添加限制条件,最后进行求解

    clc,clear
    
    % 建立问题
    prob = optimproblem('ObjectiveSense','max');
    
    % 创建决策变量
    x=optimvar('x',3,'LowerBound',0);
    
    % 目标函数
    prob.Objective = 2*x(1)+3*x(2)-5*x(3);
    
    % 约束条件
    prob.Constraints.con1 = x(1)+x(2)+x(3)==7;
    prob.Constraints.con2 = 2*x(1)-5*x(2)+x(3)>=10;
    prob.Constraints.con3 = x(1)+3*x(2)+x(3)<=12;
    
    % 求解
    [result,zmin]=solve(prob);
    zmax=-zmin;
    
    % 展示结果
    display(result.x);
    display(zmax);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    Solving problem using linprog.
    
    Optimal solution found.
    
        6.4286
        0.5714
             0
    
    
    zmax =
    
       14.5714
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Python代码

    Scipy库

    # 导库
    from scipy import optimize
    import numpy as np
    
    # 目标函数
    c = np.array([-2, -3, 5])  # 可用行向量表示列向量
    
    #不等式约束
    A = np.array([[-2, 5, -1], [1, 3, 1]])
    b = np.array([-10, 12])
    
    # 等式约束
    Aeq = np.array([[1, 1, 1]])
    beq = np.array([7])
    
    # 上下界约束
    lb = [0, 0, 0]
    ub = [None, None, None]
    bounds = np.array(list(zip(lb, ub)))   # 各个决策变量的(左界,右界)元组组成的数组
    
    # 求解
    result = optimize.linprog(c, A, b, Aeq, beq, bounds)
    x=result.x
    zmax=-result.fun
    print(result)
    print(f"最优解:{x}\n最优值:{zmax}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
     con: array([1.80712245e-09])
         fun: -14.571428565645084
     message: 'Optimization terminated successfully.'
         nit: 5
       slack: array([-2.24599006e-10,  3.85714286e+00])
      status: 0
     success: True
           x: array([6.42857143e+00, 5.71428571e-01, 2.35900788e-10])
    最优解:[6.42857143e+00 5.71428571e-01 2.35900788e-10]
    最优值:14.571428565645084
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • fun为目标函数的最优值
    • x为最优解

    Plup库

    # 导库
    import pulp
    import numpy as np
    
    # 初始化线性规划问题模型
    pro = pulp.LpProblem()
    
    # 创建决策变量
    lb = [0, 0, 0]
    ub = [None, None, None]
    bounds = np.array(list(zip(lb, ub)))
    x = np.array([
        pulp.LpVariable(f'x{i}',
                        lowBound=bounds[i - 1][0],
                        upBound=bounds[i - 1][1]) for i in [1, 2, 3]
    ])
    
    #建立目标函数
    c = np.array([-2, -3, 5])
    pro += pulp.lpDot(c, x)
    
    # 不等式约束
    A = np.array([[-2, 5, -1], [1, 3, 1]])
    b = np.array([-10, 12])
    for i in range(len(A)):
        pro += (pulp.lpDot(A[i], x) <= b[i])  # 添加限制条件
    
    # 等式约束
    Aeq = np.array([[1, 1, 1]])
    beq = np.array([7])
    for i in range(len(Aeq)):
        pro += (pulp.lpDot(Aeq[i], x) == beq[i])
    
    #求解
    pro.solve()
    
    #输出结果
    print(pro)
    print(f'最优值:{-pulp.value(pro.objective)}')  
    print(f'最优解:{[pulp.value(var) for var in x]}')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • pro.objective为最优解
    • x代表决策变量数组([x1,x2,x3]),使用pulp.value查看x中各决策变量的值
    NoName:
    MINIMIZE
    -2*x1 + -3*x2 + 5*x3 + 0
    SUBJECT TO
    _C1: - 2 x1 + 5 x2 - x3 <= -10
    
    _C2: x1 + 3 x2 + x3 <= 12
    
    _C3: x1 + x2 + x3 = 7
    
    VARIABLES
    x1 Continuous
    x2 Continuous
    x3 Continuous
    
    最优值:14.57142851
    最优解:[6.4285714, 0.57142857, 0.0]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Oracle数据库:oracle启动,oracle客户端工具plsql安装教程和使用方法
    git 进阶
    面向红队的自动化引擎工具
    8月18日计算机视觉理论学习笔记——图像预处理
    Dash 2.15版本新特性介绍
    力扣 2370. 最长理想子序列
    关于磁盘空间不够,导致报错 springboot内置tomcat相关的临时目录无法创建等问题,如何自定义配置 tomcat 缓存文件路径
    信息抽取(UIE)技术:让保险理赔信息处理流程便捷高效
    【Python & turtle】绘制一个有趣的的Emoticons
    CPT-mPEG/RGD/cRGD/BSA 甲氧基聚乙二醇/RGD/cRGD多肽/牛血清蛋白修饰顺铂
  • 原文地址:https://blog.csdn.net/ncu5509121083/article/details/126842807