• 用matlab求解线性规划


    1、用单纯形表求解线性规划

    求解线性规划 m i n − 3 x 1 − 4 x 2 + x 3 min -3x_1-4x_2+x_3 min3x14x2+x3,
    约束条件为
    2 x 1 + 3 x 2 ≤ 12 2x_1+3x_2≤12 2x1+3x212
    5 x 1 + x 2 + x 3 = 19 5x_1+x_2+x_3=19 5x1+x2+x3=19
    x 1 , x 2 , x 3 ≥ 0 x_1,x_2,x_3≥0 x1,x2,x30.

    绘制单纯形表求解:

    在这里插入图片描述

    2、用matlab求解线性规划——linprog()函数

    在这里插入图片描述

    clc,clear,close all;
    % 定义目标函数的系数向量
    f = [-3; -4; 1];
    
    % 定义不等式约束的系数矩阵和右侧常数向量
    A = [2, 3, 0];
    b = [12];
    
    % 定义等式约束的系数矩阵和右侧常数向量
    Aeq = [5, 1, 1];
    beq = [19];
    
    % 定义变量的边界
    lb = zeros(3, 1); % 所有变量的下界都是0
    
    % 使用linprog求解线性规划问题
    [x, fval, exitflag, output, lambda]  = linprog(f, A, b, Aeq, beq, lb);
    
    % 输出结果
    fprintf('最小值为: %.4f\n', fval);
    fprintf('x1 = %.4f, x2 = %.4f, x3 = %.4f\n', x(1), x(2), x(3));
    
    fprintf('\n')
    disp('输出结果(以分数形式显示):')
    fprintf('最小值为: %s\n', rats(fval));
    fprintf('x1 =%s, x2 =%s, x3 =%s\n', rats(x(1)), rats(x(2)), rats(x(3)));
    
    % 输出影子价格向量(以分数形式显示)
    fprintf('影子价格向量为:\n');
    disp(rats(lambda.ineqlin));
    
    • 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

    返回结果

    
    Optimal solution found.
    
    最小值为: -17.1538
    x1 = 3.4615, x2 = 1.6923, x3 = 0.0000
    
    输出结果(以分数形式显示):
    最小值为:    -223/13    
    x1 =     45/13    , x2 =     22/13    , x3 =       0      
    影子价格向量为:
         17/13    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    问题:

    此处发现两个问题,主要体现在影子价格向量上:
    1、影子价格少一个元素
    2、影子价格向量元素和用代数公式法求解的结果差一个负号

    通过查阅Mathworks官方文档,可以看到缺少负号并不是程序编写错误问题:
    在这里插入图片描述

    补充代码:显示出完整的影子价格向量

    问题1的解决方法:需要将约束条件中的不等式全部写为等式。

    因为将一个不等式和一个等式的约束条件传递给linprog函数时,它会计算一个相对较小的影子价格向量,其中包含了不等式约束的影响,而等式约束的影响通常不单独表示在影子价格向量中。

    %% 约束条件全部为等式
    disp('求解完整的影子价格向量:')
    % 定义目标函数的系数向量
    f = [-3; -4; 1];
    
    % 定义不等式约束的系数矩阵和右侧常数向量
    A = [2, 3, 0; 5, 1, 1];
    b = [12; 19];
    
    % 定义变量的边界
    lb = zeros(3, 1); % 所有变量的下界都是0
    
    % 使用linprog求解线性规划问题
    [x, fval, exitflag, output, lambda] = linprog(f, A, b, [], [], lb);
    
    % 输出结果
    fprintf('最小值为: %.4f\n', fval);
    fprintf('x1 = %.4f, x2 = %.4f, x3 = %.4f\n', x(1), x(2), x(3));
    
    % 输出影子价格向量
    fprintf('影子价格向量为:\n');
    disp(lambda.ineqlin);
    
    fprintf('\n')
    disp('输出结果(以分数形式显示):')
    fprintf('最小值为: %s\n', rats(fval));
    fprintf('x1 =%s, x2 =%s, x3 =%s\n', rats(x(1)), rats(x(2)), rats(x(3)));
    
    % 输出影子价格向量(以分数形式显示)
    fprintf('影子价格向量为:\n');
    disp(rats(lambda.ineqlin));
    fprintf('\n')
    
    • 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

    返回结果:

    求解完整的影子价格向量:
    
    Optimal solution found.
    
    最小值为: -17.1538
    x1 = 3.4615, x2 = 1.6923, x3 = 0.0000
    影子价格向量为:
        1.3077
        0.0769
    
    输出结果(以分数形式显示):
    最小值为:    -223/13    
    x1 =     45/13    , x2 =     22/13    , x3 =       0      
    影子价格向量为:
         17/13    
          1/13    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    【ARC116F】Deque Game 题解
    MySQL 索引、事务与存储引擎
    Python单元测试之道:从入门到精通的全面指南
    安全机密管理:Asp.Net Core中的本地敏感数据保护技巧
    C/C++图形库
    java计算机毕业设计机票实时比价系统(附源码、数据库)
    内网开发新项目之流程记录
    think-rom(thinkphp) 数据库参数绑定bigint被处理成浮点数(科学计数)问题
    MySQL字符串拼接函数
    [WUSTCTF2020]颜值成绩查询-1
  • 原文地址:https://blog.csdn.net/wayne6515/article/details/133977455