📜  运输问题第三组(最低成本单元法)(1)

📅  最后修改于: 2023-12-03 15:12:19.548000             🧑  作者: Mango

运输问题第三组(最低成本单元法)

在运输问题中,第三组(最低成本单元法)是一种常见的解决方法。该方法的基本思路是先找到最便宜的运输单元,然后尽可能地使用这些单元,直到所有的需求得到满足为止。下面将详细介绍该方法的实现。

实现步骤
  1. 构建成本矩阵。将每个供应商与每个需求者之间的运输成本添加到矩阵中。

    例如,假设有三个供应商(S1、S2、S3)和三个需求者(D1、D2、D3),则成本矩阵如下所示:

    | | D1 | D2 | D3 | |----|----|----|----| | S1 | 10 | 30 | 20 | | S2 | 20 | 25 | 30 | | S3 | 15 | 30 | 25 |

  2. 找到最低成本单元。在成本矩阵中找到最小的成本单元,即最低成本单元。如果有多个单元拥有相同的最小成本,则可以任意选择一个。

    在上述例子中,最低成本单元为S1→D1,对应的成本为10。

  3. 将最低成本单元所能提供的最大量运输到目标地点。根据最低成本单元所能提供的最大运输量,将该值添加到目标地点的供给中。如果该值大于需求量,则满足目标地点的需求,将其需求量赋值为0;否则,将其需求量减去所能提供的最大运输量,继续寻找下一个最低成本单元。

  4. 重复步骤2-3,直到所有的需求量得到满足为止。

  5. 分配方案的计算。将每个分配到最低成本单元的数量添加到矩阵中,形成分配矩阵。

代码实现
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 |

可以看到,最低成本单元法简洁、易于实现,且能够有效地解决运输问题。