运筹学笔记 运输问题

1、运输问题的模型及其结构特征

一. 运输问题的数学模型

运输问题的一般提法:
在这里插入图片描述
于是可以得到一般运输问题的模型如下:
在这里插入图片描述
在这里插入图片描述,则称该运输问题为产销平衡问题;否则,称为产销不平衡。下面讨论产销平衡问题。即模型为:
在这里插入图片描述

二. 运输问题的结构特征

举例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运输问题的线性规划模型具有特殊的结构,其约束方程组的系数矩阵A具有如下形式:
在这里插入图片描述
特征:约束方程组的系数矩阵A的元素全部为0或1。每一列只有2个元素为1,其余为0。对A的特殊结构做进一步的分析,还可以发现矩阵A的秩为m+n-1,即R(A)=m+n-1。
解释:系数矩阵A的m个行向量之和减去后n个行向量之和恰好为零向量。即A的m+n个行向量线性相关。故R(A)< m+n。
在这里插入图片描述
在这里插入图片描述
求解运输问题的方法与单纯形法思路相同
在这里插入图片描述
根据运输问题的特征(有利条件),建立相应的求解方法。
与单纯形法一样,同样需要讨论基本可行解检验数以及基的转换问题。

基变量的特征:
a) 基变量的个数一定为m+n-1个。(原因前面已叙述)
b)对产销平衡运输问题的m+n-1个变量构成基变量的充要条件是不含闭回路。

闭回路示意图
在这里插入图片描述
为方便起见,将所求的m*n个决策变量也放在运输问题信息表格中,即,调运表和运价表合二为一。
(左上角放运价,右下角放运量)如下图表示。
在这里插入图片描述

2、运输问题的求解方法——表上作业法

一. 初始基本可行解的确定(西北角法,最小元素法)

求解运输问题的初始基本可行解方法:西北角法,最小元素法。
求解初始解的一般步骤:
在这里插入图片描述
具体框图如下:
求运输问题的初始基本可行解过程
在这里插入图片描述
按照上述方法所产生的一组变量的取值将满足下面条件:
a) 所得的变量均为非负,且变量总数恰好为 m + n – 1 个;
b) 所有的约束条件均得到满足;
c) 所得的变量不构成闭回路。
即满足上述条件的一组变量为初始基本变量。
在这里插入图片描述
1、西北角法
规则: 从西北角格开始,在格内的右下角标上允许取得的最大数。 若某行(或列)的产量(销量)已满足,则把该行(列)的其他格划去。如此进行下去,直至得到一个基本可行解。

举例:
在这里插入图片描述
以上非零数字所对应的变量为基本变量,其余的均为非基变量
在这里插入图片描述
在这里插入图片描述
2.最小元素法
最小元素法的基本思路:
以运价最低者优先为原则,安排初始的调运方案
规则:
从运价最小的格开始,在格内的右下角标上允许取得的最大数。然后按运价从小到大顺序填数。若某行(列)的产量(销量)已满足,则把该行(列)的其它格划去。如此进行下去,直至得到一个基本可行解。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二. 最优解的判定(闭回路法、位势法)

同单纯形法一样,求出基本可行解后,需要检验该解是否为最优解。下面需要给出一个检验标准,由于运输问题的目标是求最小,因此当所有非基变量的检验数在这里插入图片描述
则基本可行解为最优解,否则需要进一步调整。
下面介绍2种求检验数的方法:
1 . 闭回路法
2 . 位势法

1 . 闭回路法
介绍方法之前先介绍几个结论:
结论1: m+n-1个变量构成基本可行解的基变量的充分必要条件是它们不包含闭回路。
结论2: 基变量组中任意加上一个非基变量,则构成的m+n个变量中存在唯一一个闭回路。
可利用结论2,求解非基变量的检验数,即通过闭回路,计算检验数,并根据计算修改基本可行解。
闭回路法的原理: 通过寻找闭回路来找到非基变量的检验数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
闭回路判别某基本可行解是否为最优的经济解释为:
若用闭回路计算某个非基变量检验数小于零,则必存在对现行调运方案的改进方法,可使总费用进一步降低。
具体方法:在该非基变量对应的闭回路中,令奇数顶点对应的调运量增加数个单位,偶数顶点的调运量减少数个单位。
则每行或每列的总调运量保持不变,依然满足产销平衡,但可以使总费用降低与负检验数的绝对值相同的运输成本。

闭回路的缺点:
当变量个数较多时,寻找闭回路及计算两方面都会产生困难。

2 . 位势法
原理说明: 根据对偶原理等
在这里插入图片描述
当非基变量的检验数出现负值时,则表明当前的基本可行解不是最优解。在这种情况下,应该对基本可行解进行调整,即找到一个新的基本可行解使目标函数值下降。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三. 基本可行解的改进
当非基变量的检验数出现负值时,则表明当前的基本可行解不是最优解。在这种情况下,应该对基本可行解进行调整,即找到一个新的基本可行解使目标函数值下降,这一过程通常称为转轴(换基)过程。
下面先讨论,如何确定进基、出基变量?
(1) 进基变量的确定
因运输问题目标是求最小
故选取最小的负检验数所对应的非基变量为进基变量
在这里插入图片描述
(2)出基变量的确定及之后的调整
出基变量的确定:若 xpq为进基变量,则以xpq为起点,标出其他顶点都为基变量的唯一闭回路,再由xpq出发的闭回路的偶数顶点上调运量的最小值为调整量θ,而相应的基变量就是出基变量。
调整:在上述闭回路上,奇数顶点运输量的数值均加上调整量θ,偶数顶点运输量的数值均减去调整量θ。则出基变量运输量必调整为0,即此变量由基变量变为非基变量。除此之外,其它顶点运输量保持不变。
在这里插入图片描述
在这里插入图片描述

3、产销不平衡运输问题

产销不平衡运输问题的一般形式为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 24
    点赞
  • 226
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
运输问题是一种特殊的线性规划问题,用于确定一个制造商将产品从一个或多个工厂运输到一个或多个仓库的最优运输方案。以下是使用 Python 解决运输问题的示例步骤: 1. 安装必要的 Python 库 使用 pip 工具安装 NumPy、SciPy 和 PuLP 库: ``` pip install numpy pip install scipy pip install pulp ``` 2. 建立数学模型 假设有以下运输问题: 一个制造商有 3 个工厂和 4 个仓库。每个工厂的产能和每个仓库的需求如下表所示。制造商要将产品从工厂运输到仓库,运输成本以每个单位的成本计算。如何制定一个最优的运输方案,使制造商的总运输成本最小? | 工厂 | 产能 | 仓库 | 需求 | 运输成本 | | --- | --- | --- | --- | --- | | 1 | 100 | A | 50 | 10 | | 1 | 100 | B | 75 | 20 | | 1 | 100 | C | 125 | 30 | | 2 | 150 | A | 75 | 12 | | 2 | 150 | B | 100 | 25 | | 2 | 150 | C | 75 | 15 | | 3 | 200 | A | 100 | 20 | | 3 | 200 | B | 75 | 22 | | 3 | 200 | C | 100 | 25 | 可以将以上运输问题转化为线性规划问题,建立数学模型如下: $$ \begin{aligned} \text{minimize} \quad & \sum_{i=1}^{3} \sum_{j=1}^{4} c_{ij}x_{ij} \\ \text{subject to} \quad & \sum_{i=1}^{3} x_{ij} = d_j, \quad j = 1,2,3,4 \\ & \sum_{j=1}^{4} x_{ij} \leq s_i, \quad i = 1,2,3 \\ & x_{ij} \geq 0, \quad i = 1,2,3; j = 1,2,3,4 \end{aligned} $$ 其中,$c_{ij}$ 表示从工厂 $i$ 运输到仓库 $j$ 的成本,$d_j$ 表示仓库 $j$ 的需求,$s_i$ 表示工厂 $i$ 的产能,$x_{ij}$ 表示从工厂 $i$ 运输到仓库 $j$ 的数量。 3. 编写 Python 代码 使用 PuLP 库求解上述运输问题: ```python import pulp import numpy as np # 运输成本矩阵 cost_matrix = np.array([[10, 20, 30], [12, 25, 15], [20, 22, 25], [0, 0, 0]]) # 仓库需求 demand = np.array([50, 75, 125, 0]) # 工厂产能 supply = np.array([100, 150, 200]) # 创建最小化问题 lp_problem = pulp.LpProblem('Transportation Problem', pulp.LpMinimize) # 创建决策变量 num_factories, num_warehouses = cost_matrix.shape x = pulp.LpVariable.dicts('x', ((i, j) for i in range(num_factories) for j in range(num_warehouses)), lowBound=0, cat='Continuous') # 创建目标函数 lp_problem += pulp.lpSum([cost_matrix[i][j] * x[(i, j)] for i in range(num_factories) for j in range(num_warehouses)]) # 创建约束条件 for j in range(num_warehouses): lp_problem += pulp.lpSum([x[(i, j)] for i in range(num_factories)]) == demand[j] for i in range(num_factories): lp_problem += pulp.lpSum([x[(i, j)] for j in range(num_warehouses)]) <= supply[i] # 求解问题 status = lp_problem.solve() # 输出结果 print('Optimal value:', pulp.value(lp_problem.objective)) for i in range(num_factories): for j in range(num_warehouses): print('x[{},{}] = {}'.format(i+1, j+1, pulp.value(x[(i, j)]))) ``` 4. 分析和展示结果 可以通过 matplotlib 等可视化库对结果进行展示。 总体来说,Python 是一种功能强大的语言,可以方便地解决各种运筹学问题,同时还有丰富的库和工具支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值