当前课程知识点:数学建模 > 4 数学规划I > 4-2 线性规划——运输问题 > 线性规划——运输问题
数模君
今天我们老师也给了我一个数模问题
但是我没有思路
你说吧
问题是这样子的
现有甲、乙两个工厂
分别可以提供同一规格的产品
330吨和470吨
A,B,C三个商店
分别需要该产品
203吨、274吨、261吨
各供销两地之间的运输单价为
如图表1
那么我现在不知道
如何确定运输方案呢
和之前一样
我们还是按照
数学建模的基本步骤来进行
首先我们要将决策变量
目标函数、约束条件刻画出来
就可以得到基本模型
第一个是决策变量
是要刻画回答问题的结构
这里问题就是运输方案
从工厂甲、乙分别运输
多少吨产品到商店A、B、C
故我们可以设工厂甲运输
x11、x12、x13吨产品
到商家A、B、C
从工厂乙分别运输
x21、x22、x23吨产品
到商家A、B、C
目标函数就是
要使运输方案的总成本最小
在这里郝问题你觉得目标函数
具体是什么呢
我觉得吧
目标函数就是应该
从工厂甲、乙
分别运输到商店A、B、C的
运输成本之和最小
我们可以设运输的总成本为z元
所以说 方程就应该是
z等于0.990x11加1.120x12
加1.050x13加1.200x21
加0.980x22加0.940x23
既然目标函数已经解决了
那么还有一个是约束条件
产品供应是从工厂甲、乙
分别运输到商家A、B、C的
总量不得超过甲、乙两个工厂的供应量
那么这个约束条件具体到目标
具体到方程是什么呢
我觉得就应该是
x11加x12加x13小于等于330
x21加x22加x23小于等于470
还有需求限制
需求限制是从工厂甲、乙
分别运输到商家A、B、C的总量
不得少于商家A、B、C的需求量
就是说
x11加x21大于等于203
x12加x22大于等于274
x13加x23大于等于261
那么还有一个是什么 郝问题
恩 这个是我们一定不能忘的
非负约束
就是xij
i等于1、2
j等于1、2、3
均为非负实数
xij大于等于0
我们将上面得到的方程函数关系
列出来
然后其余的就交给我们的
技术猿来解决
根据刚刚郝问题所提出的基本模型
我们可以用LINGO
来具体解决这个问题
LINGO是专门解决规划问题的软件
那么我们在LINGO中新建一个脚本
输入以下的程序代码
以medel开始
以end结束
点击菜单栏中的solve可以得到结果
我们从结果中可以看出
从甲工厂运输到商家A、B、C的
商品分别为203吨、0吨、65吨
从乙工厂运输到商家A、B、C
的产品分别是0吨、274吨和196吨
最后的最小总成本为721千元
哦 可是我觉得这个好复杂呀
那如果我有好多家工厂
好多家商店的话
那岂不是没法算出来了吗
有没有什么办法可以简便一下
我们可以调整一下决策变量
可以设工厂甲、乙 i等于1、2
分别运输xij吨产品到商家A、B、C
j等于1、2、3
甲、乙两个工厂到商家A、B、C的
运输单价分别为cij
其中每一横行代表工厂的种类
比如第一横行就代表工厂甲
第二横行代表工厂乙
同理 每一竖行就代表商家的种类
第一、二、三竖行
分别代表商家A、B、C
第一行0.990就代表
从甲到商家A的运输单价
所以由上我们可以得到两个工厂
所能提供的产品量分别为ai
等于330、470
商家A、B、C的需求量分别为
bj等于203、274、261
所以我们可以得到模型的表达式
根据刚刚数模君改建后的模型
我们要求出这个模型的结果
还是要通过程序来实现的
对比两个模型
第一个模型看起来比较复杂
但是程序写起来是比较方便
但第二个模型
看起来非常简单
但程序写起来是比较复杂的
我们在LINGO中新建一个脚本
输入以下程序代码
可以求出结果
发现第二个模型求出的结果
和第一个模型求出的结果
是一样的
但是第二个模型程序的复杂程度
会比第一个模型要高很多
在第二个模型里面的程序
一些用到的新的语法
我现在会具体的来解释一下
首先第一点
程序是以model开始、end结束
并以title命名的
它们是可以被省略掉的
这个就根据每个人的编程习惯决定
第二点
集合定义是以sets开始
以endsets结束
中间的称为集合段
上面定义了三个集合
分别为plant、product
还有Link plant product
plant等于1、2代表甲、乙两个工厂
数组的下标属于集合plant
product等于1、2、3
表示的是商场甲、乙、丙
数组的下标属于集合product
语句Link定义集合Link
为两个集合
plant和product笛卡儿积
也就是Link i、j
i属于plant、j属于product
LINGO中plant和product为基本集合
而Link为两个集合的派生集合
在集合Link的基础上
定义了属性矩阵
LINGO程序中
以data开始、以enddata结束的部分
称为数据段
用于输入已知的原始数据
注意是已知的原始数据
实际上
LINGO也可以从文本文件、电子表格文件
数据库文件中直接导入数据
对应的函数为@File、@ODE、@ODBC
技术猿我想打断一下
可能技术猿在这个问题中
有很多的求和的关系
那么我们怎么在程序中给它表达出来呢
在LINGO中
我们可以用@来调用函数
然后在@后面加入函数名
和它具体的代入方法
可以求解某些特定的结果
比如说数模君刚刚问的求和
我们可以用@sum
在括号里面加入一些要求和的内容
就可以达到数模君想要的结果
LINGO中不仅有求和函数
还有一些循环函数
可以用@加for
比如说语句@ for plant i
statements
表示对所有i属于plant执行语句
statements
下面还有一些关于注释
在方括号中的一些文字
定义行号
表示给某一行命名
这时LINGO会自动识别
此外 还可以以感叹号的方式来进行注释
比如说在开头的说明语句
假如感叹号原始数据
那么在这一段程序里面
所涉及的一些LINGO编程的知识
大概就是刚刚所说的那些了
技术猿你真厉害
数模君你也很棒
谢谢你们两个为我解答问题
-1-1 数学建模无处不在
--数学建模无处不在
-1-2 从现实对象到数学模型
-1-3 数学建模的基本方法和步骤
-1-4 如何学习数学建模
--如何学习数学建模
-1 数学建模无处不在--本章测验
-2-1 数学建模思维
--数学建模思维
-2-2 几种创新思维
--几种创新思维
-2-3 问题的提出与分析
--问题的提出与分析
-2-4 建模目标
--建模目标
-2-5 建模计划
--建模计划
-2-6 建立数学模型
--建立数学模型
-2 数学建模思维与过程--本章测验
-3-1 储蓄存单和抵押贷款买房
-3-2 单车租赁调度
--单车租赁调度
-3-3 最佳出售时机
--最佳出售时机
-3-4 名额的公平分配
--名额的公平分配
-3-5 汽车的油耗
--汽车的油耗
-3-6 传染病模型
--传染病模型
-3 数学建模初等方法--本章测验
-4-1 线性规划——生产计划
-4-2 线性规划——运输问题
-4 数学规划I--本章测验
-5-1 整数规划问题
--整数规划问题
-5-2 指派问题
--指派问题
-5-3 非线性规划
--非线性规划
-5-4其他规划模型
--其他规划模型
-5 数学规划II--本章测验
-6-1 层次分析法I
--层次分析法I
-6-2 层次分析法II
--层次分析法II
-6-3 其他评价方法
--其他评价方法
-6 层次分析法--本章测验
-7-1 线性回归I
--线性回归I
-7-2 线性回归II
--线性回归II
--线性回归III
-7-3 数据的自相关I
--数据的自相关I
-7-4 数据的自相关II
--数据的自相关II
-7-5 非线性回归
--非线性回归
-7 回归分析--本章测验
-8-1 数学建模方法综述
--数学建模方法综述
-8-2 数学建模报告
--数学建模报告
-8 数学建模方法与报告--本章测验