某工厂生产A\B\C三种型号的产品,三种型号产品收益分别为2、1、3元,其生产受下列条件限制:人工<=1,材料<=3,每种产品的人工消耗分别为1/3、1/3、1/3;每种产品的用料消耗分别为1/3、4/3、7/3,试决定该生产的最优方案。

按照单纯形法,计算如下:

clc
clear all
close allsyms x1 x2 x3 y1 y2 y3 y4 y5;% 根据例题构造线性规划(LP)的标准方程
C = [0 0 -2 -3 -1];
A = [1 0 1/3 1/3 1/3;0 1 1/3 4/3 7/3];
b = [1 ;3];
X = [y1 y2 x1 x2 x3].';resultTable = lpSolve(C,X,A,b);

求解过程以及结果:

构造LP的单纯形表
[  0, 0, y1, y2,  x1,  x2,  x3]
[  0, 0,  0,  0,  -2,  -3,  -1]
[ y1, 1,  1,  0, 1/3, 1/3, 1/3]
[ y2, 3,  0,  1, 1/3, 4/3, 7/3]更新单纯形表
[  0, 0, y1, y2, x1, x2, x3]
[  0, 6,  6,  0,  0, -1,  1]
[ x1, 3,  3,  0,  1,  1,  1]
[ y2, 2, -1,  1,  0,  1,  2]更新单纯形表
[  0, 0, y1, y2, x1, x2, x3]
[  0, 8,  5,  1,  0,  0,  3]
[ x1, 1,  4, -1,  1,  0, -1]
[ x2, 2, -1,  1,  0,  1,  2]

通过求解结果,可以看出,x1=1,x2=3,x3=0时候,可以获得最大收益S=8。

当产品的收益在一定范围内波动时候,可能会影响最优方案的制定,问每种产品价格在什么范围内波动时候,该方案仍然是最优方案?这就是典型的目标函数灵敏度分析问题,求解答案如下:

基变量 x1 的价格区间
[0.750000,3.000000]
基变量 x2 的价格区间
[2.000000,8.000000]
非基变量 x3 的价格不超过
4.000000

以上即为保证投产方案的稳健区间,只要产品收益在该范围内,则仍然为最优方案。

LP求解程序如下:

function resultTable = lpSolve(C,X,A,b)
% 目标函数系数C,变量X,约束条件系数A,约束项右侧常数b,约束条件个数m
% 传入参数来自于标准形式的LP方程%% 求解过程
% 将标准方程中的系数矩阵A分解成基B与非基N,将X分解为基变量XB与非基变量XN
m = size(A,1);
B = A(1:m,1:m);
N = A(1:m,m+1:end);
CB = C(1,1:m);
CN = C(1,m+1:end);
XB = X(1:m,:);
XN = X(m+1:end,:);invB = pinv(B);
% XB = invB*b - invB*N*XN% 令XN = zeros(3,1).'构造方程的一个基本解Xbasic
% invBxb >= 0时候,称B是Lp的可行基,此时Xbasic是Lp的基本可行解
invBxb = invB*b;
Xbasic = [invBxb ; zeros(3,1)];
%{
% 验证C*X 是否等于 CB*invB*b + (CN - CB*invB*N)*XN
C*X
CB*invB*b + (CN - CB*invB*N)*XN
%}% 验证基本可行解是否是LP的最优解,当creterion>=0时候,Xbasic是最优解,B是最优基
creterion = C - CB*invB*A;% 将LP转写称为典式形式y00\Ym\invBxN\invBxb,Y0n是LP的检验数(相对成本系数)
% minS= y00 + y0n*XN
% s.t : XB = invBxb - invBxN*XN
% X>=0
y00 = CB*invB*b;
Y0n = CN - CB*invB*N;
invBxN = invB*N;% 构造方程的单纯形表
disp('构造LP的单纯形表')
TableLP = [0 0 X.';0 -y00 zeros(1,m) Y0n;XB invBxb eye(m) invBxN];
disp(TableLP)
while(min(Y0n) < 0)% 对TableLP中第二行非基部分进行判断,如果有负数元素,则认为当前解不是最优解% 然后判断invBxN的元素与0的关系,全<=0时候没有最优解,当存在>0的元素时候,执行% 换基操作,循环迭代直至最优解(为更具普适性,可以改用bland规则进行判断换基)vectorBuffer = TableLP(2,2+1:end);goleSensTable2 = TableLP;for i = 1:mmNonBasic = find(goleSensTable2(1,:) == TableLP(i+2,1));vectorBuffer(mNonBasic - 2) = 0;endqPosition = find(vectorBuffer < 0,1);% 取q所在列为主列,判断主列元素全部<=0是否成立,若成立则方程没有最优解,计算结束if(max(TableLP(3:end,2 + qPosition)) < 0)disp('LP方程没有最优解');break;else% 若不成立继续换基操作yi0 = TableLP(3:end,2);yiq = TableLP(3:end,2+qPosition);theta = min(yi0(yiq>0)./yiq(yiq>0));Jp = find(yi0./yiq == theta,1);% 取Jp所在行为主行,并以ypq为主元继续进行换基操作,xq为进基,xp为出基ypq = TableLP(2+Jp,2+qPosition);TableLP(2 + Jp,1) = TableLP(1,2 + qPosition);TableLP(2+Jp,2:end) = TableLP(2+Jp,2:end)/ypq;for i = 1:m+1if(i ~= Jp + 1)TableLP(i + 1,2:end) = TableLP(i + 1,2:end) - TableLP(Jp + 2,2:end)*...TableLP(i + 1,2 +qPosition);endendenddisp('更新单纯形表')disp(TableLP)% 更新检验数Y0ngoleSensTable1 = TableLP;for i = 1:mmNonBasic = find(goleSensTable1(1,:) == TableLP(i+2,1));goleSensTable1(:,mNonBasic) = [];end Y0n = goleSensTable1(2,3:end);
end%% 打印结果
fprintf('最优方案:\n');
for i = 1:numel(X)-mif(ismember(XN(i),TableLP(3:end,1)))Jp = find(TableLP(:,1) == XN(i));fprintf('%s = %f \n',XN(i),TableLP(Jp,2));elsefprintf('%s = 0\n',XN(i));end
end
maxS = TableLP(2,2);
fprintf('最优目标函数值:%f\n\n',maxS);%% 目标函数系数的灵敏度分析
% 分离非基系数矩阵
goleSensTable = TableLP;
for i = 1:mmNonBasic = find(goleSensTable(1,:) == TableLP(i+2,1));goleSensTable(:,mNonBasic) = [];
end
goleSensTable = goleSensTable(:,3:end);
% 判断基变量的灵敏度区间
for i = 1:numel(X)-mif(ismember(XN(i),TableLP(3:end,1)))fprintf('基变量 %s 的价格区间 \n',XN(i));Jp = find(TableLP(:,1) == XN(i));vector1 = goleSensTable(2,:);vector2 = goleSensTable(Jp,:);Dmax = vector1(vector2>0)./vector2(vector2>0)*-1;Dmin = vector1(vector2<0)./vector2(vector2<0)*-1;if(isempty(max(Dmax)))xMin = -Inf;elsexMin = -C(X == XN(i)) + max(Dmax);endif(isempty(min(Dmin)))xMax = Inf;elsexMax = -C(X == XN(i)) + min(Dmin);endfprintf('[%f,%f]\n',xMin,xMax);end
end% 判断非基变量灵敏度区间
for i = 1:numel(X)-mif(~ismember(XN(i),TableLP(:,1)))fprintf('非基变量 %s 的价格不超过 \n',XN(i));xNonMax = -C(i + m) + TableLP(2,2+m+i);fprintf('%f\n',xNonMax);end
end%% 返回结果
resultTable = TableLP;
end

完整的程序输出如下:

构造LP的单纯形表
[  0, 0, y1, y2,  x1,  x2,  x3]
[  0, 0,  0,  0,  -2,  -3,  -1]
[ y1, 1,  1,  0, 1/3, 1/3, 1/3]
[ y2, 3,  0,  1, 1/3, 4/3, 7/3]更新单纯形表
[  0, 0, y1, y2, x1, x2, x3]
[  0, 6,  6,  0,  0, -1,  1]
[ x1, 3,  3,  0,  1,  1,  1]
[ y2, 2, -1,  1,  0,  1,  2]更新单纯形表
[  0, 0, y1, y2, x1, x2, x3]
[  0, 8,  5,  1,  0,  0,  3]
[ x1, 1,  4, -1,  1,  0, -1]
[ x2, 2, -1,  1,  0,  1,  2]最优方案:
x1 = 1.000000
x2 = 2.000000
x3 = 0
最优目标函数值:8.000000基变量 x1 的价格区间
[0.750000,3.000000]
基变量 x2 的价格区间
[2.000000,8.000000]
非基变量 x3 的价格不超过
4.000000

以上即为目标函数灵敏度分析的实现方法。

线性规划问题的目标函数灵敏度分析相关推荐

  1. 运筹优化(四)--线性规划之对偶问题和灵敏度分析

    线性规划的灵敏度分析,是指模型参数的变化,对优化结果的影响分析,分定性和定量两种. 定性分析 这里的定性分析,指参数变化,对结果的影响,比如不变,变坏或者变差. 松约束和紧约束 放宽优化模型中的约束条 ...

  2. 运筹说 第29期 | 对偶理论与灵敏度分析—影子价格

    经过前几期的学习,想必大家对线性规划的对偶问题有了详细的了解.本期,小编带大家学习对偶问题解的经济解释--影子价格. 01 影子价格的含义 从23期对偶问题的基本性质可以看出,当线性规划原问题求得最优 ...

  3. 运筹说 第23期|对偶理论与灵敏度分析—对偶问题的基本性质

    经过前两期的学习,想必大家已经对线性规划问题有了详细的了解.本期,小编将带大家学习线性规划问题的对偶问题理论. 每个线性规划问题都有一个与之对应的对偶问题,对偶问题是以原问题的约束条件和目标函数为基础 ...

  4. 对偶理论和灵敏度分析(单纯形法矩阵形式、对偶理论及转化、影子价格、机会成本、差额成本、对偶单纯形法、灵敏度分析)

    对偶理论和灵敏度分析 文章目录 对偶理论和灵敏度分析 修正单纯形法-矩阵描述和计算 对偶问题的提出 原问题与对偶问题转化 对偶问题最优解的经济意义--影子价格 对偶问题约束项的经济意义--生产产品的机 ...

  5. lingo灵敏度分析(LINGO的objective coeffienct range和Righthand side ranges如何调出?)

    首先要了解线性规划表达式的最简单的一种--矩阵表达式:记住其中A,b,c的位置以及含义.A是技术系数,b是资源约束,c是价值系数 一般的solve只会出slack or surplus ,随便给一个线 ...

  6. 数学建模之灵敏度分析

    在数学建模的评价类问题中,灵敏度分析是一个重量级的评价方法,尤其是针对规划问题,是一定要在建模后对模型进行灵敏度分析的,用来检验模型的稳定性. 通过阅读历年美赛的O奖论文可以发现,大部分文章最后都会进 ...

  7. 运筹说 第31期 | 对偶理论与灵敏度分析—对偶单纯形法

    经过前几期的学习,想必大家已经理解了线性规划问题的对偶问题.相关的重要理论以及影子价格.本期,小编将带大家学习对偶单纯形法的计算步骤. 1.对偶单纯形法 (1)单纯形法回顾 在讲解对偶单纯形法之前我们 ...

  8. 运筹学笔记 对偶理论与灵敏度分析

    本章内容要点 单纯形法的矩阵描述及改进单纯形法的介绍: 线性规划的对偶问题的概念.理论及经济意义: 线性规划的对偶单纯形法: 线性规划的灵敏度分析. 文章目录 改进单纯形法的介绍 线性规划的对偶问题 ...

  9. 【PEST++】01 参数优化与灵敏度分析

    目录 PEST++系列文章 一.PEST++简介 二.参数优化 2.1 准备文件 2.1.1 实测值文件 2.1.2 参数及参数组文件 2.1.3 模板文件 2.1.4 命令行文件 2.2 编写时间序 ...

  10. 数学建模学习笔记(二):非线性规划模型例题与灵敏度分析

    文章目录 前言 一.一个简单的非线性规划模型 二.问题的求解 1.模型的建立与求解 2.得出结论 三.灵敏度分析 总结 参考书目 前言 数学建模解决问题的过程一般分为五个步骤,称为五步方法,五个步骤如 ...

最新文章

  1. git粘贴命令行_git进阶,ssh和命令行
  2. 服务治理治什么,10张图告诉你答案
  3. Docker 建立镜像流程
  4. hdu4950 打怪(简单题目)
  5. (56)等待链表,调度链表
  6. 介绍一个非常好用的文件服务器 - HFS
  7. Java对象容器——List
  8. block的使用(六)
  9. 解决freeswitch ICE 获取RTP地址时间过长的问题
  10. 【API进阶之路】API带来的微创新,打动投资人鼓励我创业
  11. 修改eclipse配置文件properties编码格式
  12. ajax写入txt,javascript结合ajax读取txt文件内容
  13. Eclipse 编译C++
  14. Sql Server 的增删改查
  15. 记一次代码被公司电脑加密后,编译不通过
  16. 均值滤波(matlab)
  17. 深度学习-lecture1李飞飞计算机视觉
  18. 网页磁贴模板_文本磁贴(登录)模板 (HTML)
  19. win10 将中文名修改成英文名
  20. 千峰JAVA逆战班Day32

热门文章

  1. java读取tif文件_java读取TIF,TIFF文件方法
  2. python刷网易云_如何用Python爬取网易云歌曲?秘诀在这~
  3. 详解抖音千人千面的智能推荐机制
  4. SketchUp2020下载SketchUp2020下载安装SketchUp草图大师2020下载安装详细教程
  5. mariadb 的安装及基本配置
  6. uniyu 雷达波束_Unity使用TUIO协议接入雷达
  7. 白猫使用OCR文字识别
  8. 计算机软件退税,软件企业2021增值税退税
  9. 长春理工大学第六届CTF网络攻防大赛题解(文末有题目下载链接)
  10. 淘宝天猫购物优惠券系统开发,java后端(ssm)+Android 原生APP,对接淘宝开放平台