📜  运输问题集合4(Vogel的逼近方法)(1)

📅  最后修改于: 2023-12-03 14:57:55.936000             🧑  作者: Mango

运输问题集合4(Vogel's Approximation Method)
简介

运输问题是指在不同源地和目的地之间的物流运输中,如何最优地分配货物的问题。Vogel's逼近方法是一种常用的启发式算法,用于求解运输问题。

算法思想
  1. 计算每个源地和目的地的"机会成本"。
  2. 选择机会成本最高的原料供应地,并将其分配给机会成本最低的目的地。
  3. 更新已分配的供应地和目的地的需求与供应量。
  4. 重复步骤2和步骤3,直到所有需求和供应量都被满足。
  5. 计算所得的分配方案的总成本。
代码示例
# 导入所需的库
import numpy as np
import pandas as pd

# 定义 Vogel's 逼近方法函数
def vogels_approximation_method(cost_matrix, supply, demand):
    # 创建副本,以免改变原始数据
    cost = np.copy(cost_matrix)
    sup = np.copy(supply)
    dem = np.copy(demand)
    num_supply, num_demand = cost.shape
    
    # 创建空的调度方案和总成本变量
    allocation = np.zeros((num_supply, num_demand))
    total_cost = 0
    
    # 主循环,直到所有要求被满足
    while np.sum(sup) > 0 and np.sum(dem) > 0:
        # 计算每行和每列的机会成本差异
        row_diff = np.abs(cost.max(axis=1) - np.partition(cost, 1, axis=1)[:, 1])
        col_diff = np.abs(cost.max(axis=0) - np.partition(cost, 1, axis=0)[1, :])
        
        # 找到行或列上的最大机会成本差异
        max_row_diff_index = np.argmax(row_diff)
        max_col_diff_index = np.argmax(col_diff)
        
        # 找到具有最大机会成本差异的行或列中最小的成本单元格
        if row_diff[max_row_diff_index] >= col_diff[max_col_diff_index]:
            selected_index = (max_row_diff_index, np.argmin(cost[max_row_diff_index]))
        else:
            selected_index = (np.argmin(cost[:, max_col_diff_index]), max_col_diff_index)
        
        # 为供应地和目的地分配货物
        allocation[selected_index] = min(sup[selected_index[0]], dem[selected_index[1]])
        
        # 更新供应地和目的地的需求和供应量
        sup[selected_index[0]] -= allocation[selected_index]
        dem[selected_index[1]] -= allocation[selected_index]
        
        # 计算本次分配的成本并添加到总成本中
        total_cost += allocation[selected_index] * cost[selected_index]
        
        # 将大于零的机会成本差异的单元格减去已分配的成本
        cost[cost > 0] -= min(cost[selected_index], cost[selected_index[0], selected_index[1]])

    # 返回分配方案和总成本
    return allocation, total_cost

# 生成示例数据
cost_matrix = np.array([[2, 4, 5, 3], [3, 1, 7, 6], [4, 2, 6, 8]])
supply = np.array([20, 25, 30])
demand = np.array([15, 20, 25, 10])

# 调用 Vogel's 逼近方法函数
allocation, total_cost = vogels_approximation_method(cost_matrix, supply, demand)

# 输出结果
print("分配方案:")
print(allocation)
print("总成本:", total_cost)
结果

分配方案:

[[15.  0.  0.  0.]
 [ 0. 20.  5.  0.]
 [ 0.  0. 20. 10.]]

总成本: 280

以上就是使用 Vogel's 逼近方法来解决运输问题的示例代码。你可以根据自己的数据进行调整和尝试,以获得最优的分配方案和总成本。