数学规划模型之线性规划

2023-11-01

一、数学规划模型简介

什么是优化问题?
解决有限资源的最佳分配问题。即如何用“最好”的方法,使有限的资源能获取最佳的经济效益。

数学规划模型分类:
线性规划模型(LP)、非线性规划模型(NLP)、整数规划模型(IP)、0-1规划模型、动态规划模型(DP)、非动态规划模型、单目标规划模型、多目标规划模型。

模型的要素:
决策变量、目标函数、约束条件

二、线性规划问题

**引例(生产规划问题):

某厂利用a、b、c三种原料生产A、B、C三种产品,已知生产每种产品在消耗原料方面的各项技术条件和单位产品的利润,以及可利用的各种原料的量(具体数据如下表),试制订适当的生产规划使得该厂的总的利润最大。**

在这里插入图片描述

解题

决策变量:
x1,x2,x3分别表示A、B、C产品的量

目标函数:
max z=2x1+4x2+3x3

约束条件:
材料约束:
在这里插入图片描述
非负约束:
在这里插入图片描述

名称解释:

  • 决策变量:决策要控制的因素;
  • 目标函数:利润最大化、成本最小化,表现为决策变量的一个函数;
  • 约束条件:资源、工期等,表现为决策变量的一些等式或不等式。
  • 线性规划问题:在满足由一些线性等式或不等式组成的约束条件下,求决策变量的一组具体取值,使得一个线性目标函数实现最优(大或小)化。
  • 整数规划问题:决策变量限取整数值的最优化问题.
  • 非线性规划问题:目标函数或存在约束条件函数是决策变量的非线性函数的最优化问题。

建立线性规划问题模型的一般思路

  • 确定该LP问题的目标是什么?
  • 实现目标取决于什么因素和条件?
  • 确定哪几个因素为决策变量?
  • 目标如何用决策变量来加以描述?
  • 约束条件如何表达?
  • 决策变量本身是否有限制条件?

线性规划问题的基本要求

  • 目标函数和约束条件必须是线性函数;
    线性表达:相加性、比例性
  • 决策变量的连续分布;
    不限于整数,可以是小数,但不能四舍五入
  • 目标函数的单一性;
    多目标是要设法简化成单目标
  • 模型必须是确定型的;
    所有参数(a、b、c)都应是确定值
  • 决策变量的非负性

例题

某工厂拥有A、B、C三种类型的设备,生产甲、乙、丙、丁四种产品。已知每件产品在生产中需要占用的设备机时数、可以获得的利润以及三种设备可利用的时数(具体数据如下表),用线性规划制订使总利润最大的生产计划。

在这里插入图片描述
建立的模型如下:
设变量xi为第i种产品的生产件数(i=1,2,3,4),目标函数Z为相应的生产计划可以获得的总利润。在加工时间以及利润与产品产量成线性关系的假设下,可以建立如下的线性规划模型:
在这里插入图片描述
求解这个线性规划,可以得到最优解为:
x1=294.12 x2=1500 x3=0 x4=58.82
最大利润为:
z=12737.06(元)

**注意:**最优解中利润率最高的产品丙在最优生产计划中不安排生产。说明按产品利润率大小为优先次序来安排生产计划的方法有很大局限性。尤其当产品品种很多,设备类型很多的情况下,用手工方法安排生产计划很难获得满意的结果。另外,变量是否需要取整也是需要考虑的问题。

线性规划问题模型的一般形式

在这里插入图片描述

线性规划问题一般模型的简化形式

在这里插入图片描述

线性规划问题的标准形式
  • 目标函数为最大化
  • 约束条件(非负条件除外)全为等式
  • 约束条件右端项为大于等于零

在这里插入图片描述

将非标准形式转化为标准形式

  • 目标函数为最小化:
    令 Z’= - Z , Z’ 为最大化问题。

  • 若约束条件是小于等于型:
    在不等式左边加上一个新变量(松弛变量),
    不等式改为等式,目标函数中新变量系数为零。

  • 若约束条件是大于等于型:
    在不等式左边减去一个新变量(剩余变量),

  • 不等式改为等式,目标函数中新变量系数为零。 若约束方程右端项 bi < 0 :
    在约束方程两端乘以(-1),不等号改变方向,然后再转化成等式。

  • 若决策变量Xk没有非负要求:
    作两个新变量Xk’≥0, Xk’’ ≥0,令Xk= Xk’- Xk’’ ,在原有模型中用( Xk’- Xk’’)代替所有的Xk,在非负约束中增加Xk’≥0和Xk’’ ≥0 。

例:将下列LP问题转化为标准形式和简化形式。
在这里插入图片描述
解:
令Z’=-Z,
引进松弛变量x4≥0,和剩余变量 x5≥0,
令 x2=x2’-x2’’ 其中x2’≥0,x2’'≥0,

得到以下等价的标准形式 :
在这里插入图片描述
模型的简化形式 :
在这里插入图片描述

三、线性规划问题的求解

图解法

  • 可行点:满足线性规划所有约束条件的点称为可行点。
  • 可行域:所有可行点构成的集合称为可行域,记为R。
  • 等位线:对于每一固定的值z,使目标函数值等于z的点构
    成的直线称为目标函数等位线。

单纯形法(表上作业法)

单纯形法是美国数学家G.B.丹齐克于1947年首先提出来的。它的理论根据是:线性规划问题的可行域是n维向量空间Rn中的多面凸集,其最优值如果存在必在该凸集的某顶点处达到。顶点所对应的可行解称为基本可行解。单纯形法的基本思想是:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。

软件求解法(MatLab或Lingo软件)

**例:**某机床厂生产甲、乙两种机床,每台销售后的利润分别为4万元与3万元。生产甲机床需用A、B机器加工,加工时间分别为每台 2小时和1小时;生产乙机床需用A、B、C三种机器加工,加工时间为每台各一小时。若每天可用于加工的机器时数分别为A机器10小时、B机器8小时和C机器7小时,问该厂应生产甲、乙机床各多少台,才能使总利润最大?

解题:
数学模型:设该厂生产x1台甲机床和x2台乙机床时总利润最大,则 x1 、x2应满足

在这里插入图片描述

软件一:LINGO软件
model:                               !程序开始
sets:                                   !变量集合开始
 var/1..2/:x;                         !说明x是二维变量
endsets                               !集合说明结束
max=4*x(1)+3*x(2);              !目标函数求极大
2*x(1)+x(2)<=10;                   !约束函数
x(1)+x(2)<=8;                        !约束函数
x(2)<=7;                                !约束函数
End                                        !程序结束
注意:若不加以说明,LINGO认为所有变量非负,@free(x)可以解除x非负的假设。

LINGO的注意事项:
(1)变量名以字母开头,不超过8个字符,不区分大小写;
(2)行结束为“;”,行中注有“!”符号的后面部分为注释;
(3)表达式应化简,通常以“model:”开头,并以“END” 结束;
(4)“END” 前加“@GIN (name)”表示取整,“@BIN(name)”表示取0-1变量

矩阵乘法模式:
model:                               !程序开始
sets:                                   !变量集合开始
row/1..3/:b;                      !定义b为3维向量
col/1..2/:c,x;                     !定义c和x为2维向量
matrix(row,col):A;          !定义A是3*2矩阵
endsets                               !集合说明结束
max=@sum(col:c*x);              !目标函数求极大
@for(row(i):@sum(col(j):A(i,j)*x(j))<=b(i)); !约束函数
data:                                    !输入数据
c=4,3;
b=10,8,7;
A=2,1,
     1,1,
     0,1;
enddata                                  !数据输入结束
end                                        !程序结束,若不加以说明,LINGO认为所有变量非负
软件二:MATLAB软件

性规划模型在MATLAB下的标准形(矩阵形式)

在这里插入图片描述

在这里插入图片描述

c=[-4,-3];
A=[2 1;1 1;0 1];
b=[10;8;7];
v1=[0 0];
x=linprog(c,A,b,[],[],v1)

运行后得:
x =
2.0000
6.0000

[x,fv,ef,out,lag]=linprog (c,A1,b1,A2,b2,v1,v2)
v1为x的下界,v2为x的上界

结果说明:输出x为最优解,
fv:最优值;
ef:程序停止的标志,表示程序停止的原因;
out:结构变量,包括程序运行的有关信息,含三个域;
lag:Lagrange乘子,维数为约束条件的个数,其非零分量
表示相应的约束条件起作用,并表示其对偶规划相应
变量的解,即影子价格。

**注意:**若模型中无等式约束,则A2,b2用[ ]代替,不可缺省!对于极大化问题必须化为极小化问题如(LP)的格式

四、建模实例

实例:生产计划的安排

某厂生产两种口味的饮料,每百箱饮料相关数据:

在这里插入图片描述

工厂共有原料60kg,工人150名,甲饮料最大销量为8百箱,问如何安排生产使获利最大?

能否进一步讨论以下问题:
1)若投资0.8万元可增加原料1kg,问应不应该作该项投资?
2)若可以聘用临时工,付给每名临时工最多是多少元?
3)若每百箱甲饮料获利可增加1万元,问是否应改变计划?
4)如果以百箱为最小生产单位,即产量不能为小数怎么办?

解题

模型的建立:

假设甲乙两种饮料的产量分别为x1,x2(百箱)
工厂总获利为z(万元)
在这里插入图片描述
转换:
在这里插入图片描述
使用matlab编程:

function plan1()
c=[-10,-9];
A=[6 5;10 20;1 0];
b=[60;150;8];
v1=[0 0];
[x,fv,ef,out,lag]=linprog(c,A,b,[],[],v1)
lag.ineqlin
z=-c*x

运行:

在这里插入图片描述
在这里插入图片描述
即甲乙两种口味的饮料各生产6.4286和4.2857百箱;
最终获利为102.8571万元.

1)若投资0.8万元可增加原料1kg,问应不应该作该项投资?

这是求解对偶规划模型(DP),避开对偶规划理论,可以从这个角度考虑,即1Kg原料到底值多少钱?若价值高于0.8万则可以投资,反之则不宜投资!为此观察原料限制增加1单位时对结果的影响。

在这里插入图片描述
使用matlab软件编程:

function plan2()
c=[-10,-9];
A=[6 5;10 20;1 0];
b=[61;150;8];
v1=[0 0];
[x,fv,ef,out,lag]
=linprog(c,A,b,[],[],v1)
lag.ineqlin
z=-c*x

在这里插入图片描述
观察结果发现获利增加104.4286-102.8571=1.5714
若工人限额增加1个单位,可再运行程序观察结果获利是否增加0.0571?这就是lag拉格朗日乘子——影子价格!

以上结果可知:

  • 原料影子价格为1.5714万元/kg,即在生产中每kg原料可获利1.5714万元;
  • 工人的影子价格为0.0571万元/人;
  • 甲饮料的生产限额的影子价格为0;说明此时限额没有充分利用,在增加限额不会产生效益;

结论:显然投资0.8万元增加原料1kg是有利可图的。

3)若每百箱甲饮料获利可增加1万元 ,问是否应该改变生产计划?

由于甲饮料的利润增加,因此模型也改变为:
在这里插入图片描述
将第一小题的中的c变为c=[-11,-9]重新计算,得:
在这里插入图片描述
由于与总收益从102.8571增加至109.6万元,所以应该改变生产计划。

4)如果以百箱为最小生产单位,即产量不能为小数怎么办?

这相当于对原模型增加整数解的要求,称为整数规划。求解整数规划比线性规划复杂的多,MATLAB软件求解需要使用辅助工具,但使用LINGO软件求解非常简单!

LINGO程序及计算结果

Model:
Max=10*x1+9*x2;
6*x1+5*x2<60;
10*x1+20*x2<150;
x1<8;
@gin(x1); @gin(x2);
end

在这里插入图片描述

即甲乙两种口味的饮料各生产8和2百箱;最终获利为98万元.

影子价格

bi 在原问题中是约束条件的右端项,表明了第 i 种资源的可用量。因此,对偶解的经济含义就是资源的单位改变引起目标函数值的增加量。定量表达了在最优生产方案下对单位第 i 种资源的一种估价,这种估价不是该种资源的市场价格,而是在最优生产方案下的一种虚拟价格,故称其为影子价格(shadow price)

作用:
影子价格真实地反映了资源在经济结构中最优决策下对总收益的影响和贡献大小。影子价格越高,表明该种资源的贡献越大,该种资源越紧缺。影子价格为正数(非零),该资源约束的松弛变量取值为零(没有松弛变量),因此表明了该资源在最优决策下已充分利用耗尽,并成为进一步增加总收益的紧缺资源。影子价格为零,表明该资源在最优决策下尚有剩余。
影子价格也是机会成本。当第 i 种资源的市场价格低于影子价格时,企业应适量购进这种资源,组织和增加生产;相反,当市场价格高于影子价格时,可以卖出资源而不安排生产或提高产品的价格。在完全的市场条件下,随着资源的买进和卖出,影子价格随之变化,直到影子价格与市场价格保持同等水平。

  • 从资源最优利用的角度,提出企业挖潜改革,扬长避短的方向。剩余资源也是进一步发展生产的潜在优势。
  • 指导管理部门对紧缺资源进行择优分配。
  • 资源影子价格的高低作为同类企业经济效益的评价指标之一。
  • 帮助预测产品的价格。买方要购入卖方的产品作为资源投入生产,要求其价格必须小于该产品作为自己最优生产的影子价格,卖方要求出售其产品的价格必须大于自己的生产成本,因此,产品的价格应在双方的成本和影子价格之间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数学规划模型之线性规划 的相关文章

  • 如何生成给定范围内的回文数列表?

    假设范围是 1 X 120 这是我尝试过的 gt gt gt def isPalindrome s check if a number is a Palindrome s str s return s s 1 gt gt gt def ge
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 更改自动插入 tkinter 小部件的文本颜色

    我有一个文本框小部件 其中插入了三条消息 一条是开始消息 一条是结束消息 一条是在 单位 被摧毁时发出警报的消息 我希望开始和结束消息是黑色的 但被毁坏的消息 参见我在代码中评论的位置 插入小部件时颜色为红色 我不太确定如何去做这件事 我看
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • Spark的distinct()函数是否仅对每个分区中的不同元组进行洗牌

    据我了解 distinct 哈希分区 RDD 来识别唯一键 但它是否针对仅移动每个分区的不同元组进行了优化 想象一个具有以下分区的 RDD 1 2 2 1 4 2 2 1 3 3 5 4 5 5 5 在此 RDD 上的不同键上 所有重复键
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • 从列表中的数据框列中搜索部分字符串匹配 - Pandas - Python

    我有一个清单 things A1 B2 C3 我有一个 pandas 数据框 其中有一列包含用分号分隔的值 某些行将包含与上面列表中的一项的匹配 它不会是完美的匹配 因为它在其中包含字符串的其他部分 该列 例如 该列中的一行可能有 哇 这里
  • 使用 Pycharm 在 Windows 下启动应用程序时出现 UnicodeDecodeError

    问题是当我尝试启动应用程序 app py 时 我收到以下错误 UnicodeDecodeError utf 8 编解码器无法解码位置 5 中的字节 0xb3 起始字节无效 整个文件app py coding utf 8 from flask
  • Abaqus 将曲面转化为集合

    我一直试图在模型中找到两个表面的中心 参见照片 但未能成功 它们是元素表面 面 查询中没有选项可以查找元素表面的中心 只能查找元素集的中心 找到节点集的中心也很好 但是我的节点集没有出现在工具 gt 查询 gt 质量属性选项中 而且我找不到
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • glpk.LPX 向后兼容性?

    较新版本的glpk没有LPXapi 旧包需要它 我如何使用旧包 例如COBRA http opencobra sourceforge net openCOBRA Welcome html 与较新版本的glpk 注意COBRA适用于 MATL
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • Python - 字典和列表相交

    给定以下数据结构 找出这两种数据结构共有的交集键的最有效方法是什么 dict1 2A 3A 4B list1 2A 4B Expected output 2A 4B 如果这也能产生更快的输出 我可以将列表 不是 dict1 组织到任何其他数

随机推荐