📅  最后修改于: 2023-12-03 15:12:19.548000             🧑  作者: Mango
在运输问题中,第三组(最低成本单元法)是一种常见的解决方法。该方法的基本思路是先找到最便宜的运输单元,然后尽可能地使用这些单元,直到所有的需求得到满足为止。下面将详细介绍该方法的实现。
构建成本矩阵。将每个供应商与每个需求者之间的运输成本添加到矩阵中。
例如,假设有三个供应商(S1、S2、S3)和三个需求者(D1、D2、D3),则成本矩阵如下所示:
| | D1 | D2 | D3 | |----|----|----|----| | S1 | 10 | 30 | 20 | | S2 | 20 | 25 | 30 | | S3 | 15 | 30 | 25 |
找到最低成本单元。在成本矩阵中找到最小的成本单元,即最低成本单元。如果有多个单元拥有相同的最小成本,则可以任意选择一个。
在上述例子中,最低成本单元为S1→D1,对应的成本为10。
将最低成本单元所能提供的最大量运输到目标地点。根据最低成本单元所能提供的最大运输量,将该值添加到目标地点的供给中。如果该值大于需求量,则满足目标地点的需求,将其需求量赋值为0;否则,将其需求量减去所能提供的最大运输量,继续寻找下一个最低成本单元。
重复步骤2-3,直到所有的需求量得到满足为止。
分配方案的计算。将每个分配到最低成本单元的数量添加到矩阵中,形成分配矩阵。
import numpy as np
def least_cost_method(cost_matrix, supply, demand):
"""
最低成本单元法
:param cost_matrix: 运输成本矩阵
:param supply: 供应量
:param demand: 需求量
:return:
"""
rows, cols = cost_matrix.shape
allocation = np.zeros((rows, cols))
while True:
# 计算单位运输成本
unit_cost = cost_matrix / allocation
# 找到最低成本单元
i, j = divmod(np.argmin(unit_cost), cols)
# 确定实际运输量
quantity = min(supply[i], demand[j])
# 更新行列对应的供需量
supply[i] -= quantity
demand[j] -= quantity
# 更新分配矩阵
allocation[i][j] += quantity
# 如果需求量和供应量都为0,则退出循环
if sum(demand) == 0:
break
return allocation
使用上述代码来解决以下运输问题:
供应商(S1、S2、S3)的产能分别为200、300和500,需求者(D1、D2、D3、D4)的需求量分别为100、200、300和400。成本矩阵为:
| | D1 | D2 | D3 | D4 | |---------|----|----|----|----| | S1(200) | 20 | 24 | 11 | 25 | | S2(300) | 13 | 16 | 18 | 22 | | S3(500) | 12 | 14 | 16 | 18 |
使用最低成本单元法,得到的最终分配矩阵为:
| | D1 | D2 | D3 | D4 | 供应量 | |---------|----|----|----|----|--------| | S1(200) | 0 | 0 | 100| 100| 200 | | S2(300) | 100| 100| 0 | 0 | 300 | | S3(500) | 0 | 100| 200| 300| 600 |
可以看到,最低成本单元法简洁、易于实现,且能够有效地解决运输问题。