You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python实现最大化问题的Vogel近似算法(含分配矩阵更新)

运输最大化问题的Vogel近似算法实现(含分配矩阵更新)

需求说明

基于提供的Python代码,实现最大化问题的Vogel近似算法,包含分配矩阵的实时更新。该问题为运输最大化问题,需严格按照指定步骤依次完成分配,每次分配后输出当前的分配矩阵,最终得到符合要求的结果。

现有初始代码

objetivo = "max"
# objetivo = "min"

#tabla_datos = [[3, 6, 6, 9, 35], [9, 2, 3, 7, 50], [1, 5, 4, 5, 40], [45, 20, 30, 30, 0]]
tabla_datos = [[5, 6, 3, 5, 5, 500], [2, 5, 3, 1, 0, 330], [2, 4, 0, 1, 1, 120], [140, 220, 360, 80, 150, ]]


# Create profit table
tabla_ganancias = [fila[:-1] for fila in tabla_datos[:-1]]

# Get the number of rows and columns of tabla_ganancias
m = len(tabla_ganancias)
n = len(tabla_ganancias[0])

# Calculate the number of assignments, in this case is 7
# In this case   m + n - 1 = 3 + 5 - 1 = 7 assignments
nro_asignaciones = m + n - 1

# Calculate supply and demand
oferta = sum(tabla_datos[i][-1] for i in range(m))
demanda = sum(tabla_datos[-1][j] for j in range(n))

print(nro_asignaciones) # in this case 7
print(oferta) #in this case 950
print(demanda) #in this case 950

if objetivo == "max":
    # 待实现的分配逻辑

指定分配步骤

需完成7次分配(m+n-1=3+5-1=7),具体步骤如下:

  • 第1次:选择利润最高的单元格(第一行第二列,利润值6),分配量为对应列的需求量220
  • 第2次:选择利润为5的单元格(第一行第一列),分配量为对应列的需求量140
  • 第3次:选择同一行(第一行)中利润为5的单元格(第一行第四列),分配量为对应列的需求量80
  • 第4次:因第一行仍有剩余供应量,选择该行最后一个利润为5的单元格(第一行第五列),分配量为第一行剩余供应量60
  • 第5次:选择利润为3的单元格(第二行第三列),分配量为第二行全部供应量330
  • 第6次:选择利润为1的单元格(第三行第五列),分配量为第五列剩余需求量90
  • 第7次:选择无利润的单元格(第三行第三列),分配量为第三列剩余需求量30

每次分配完成后,需打印当前更新后的分配矩阵。

完整实现代码

objetivo = "max"
# objetivo = "min"

#tabla_datos = [[3, 6, 6, 9, 35], [9, 2, 3, 7, 50], [1, 5, 4, 5, 40], [45, 20, 30, 30, 0]]
tabla_datos = [[5, 6, 3, 5, 5, 500], [2, 5, 3, 1, 0, 330], [2, 4, 0, 1, 1, 120], [140, 220, 360, 80, 150, ]]


# Create profit table
tabla_ganancias = [fila[:-1] for fila in tabla_datos[:-1]]

# Get the number of rows and columns of tabla_ganancias
m = len(tabla_ganancias)
n = len(tabla_ganancias[0])

# Calculate the number of assignments, in this case is 7
# In this case   m + n - 1 = 3 + 5 - 1 = 7 assignments
nro_asignaciones = m + n - 1

# Calculate supply and demand
oferta = sum(tabla_datos[i][-1] for i in range(m))
demanda = sum(tabla_datos[-1][j] for j in range(n))

print("需要完成的分配次数:", nro_asignaciones)
print("总供应量:", oferta)
print("总需求量:", demanda)

# 初始化分配矩阵
tabla_asignaciones = [[0] * n for _ in range(m)]
# 复制供应和需求数据,用于实时更新
supply = [fila[-1] for fila in tabla_datos[:-1]]
demand = tabla_datos[-1][:-1]  # 处理原数据最后一行的空值,取前5个需求值

def print_assignment_matrix(step):
    print(f"\n=== 第 {step} 次分配后矩阵 ===")
    for row in tabla_asignaciones:
        print(row)

if objetivo == "max":
    # 第1次分配:第一行第二列
    assign_qty = min(supply[0], demand[1])
    tabla_asignaciones[0][1] = assign_qty
    supply[0] -= assign_qty
    demand[1] -= assign_qty
    print_assignment_matrix(1)

    # 第2次分配:第一行第一列
    assign_qty = min(supply[0], demand[0])
    tabla_asignaciones[0][0] = assign_qty
    supply[0] -= assign_qty
    demand[0] -= assign_qty
    print_assignment_matrix(2)

    # 第3次分配:第一行第四列
    assign_qty = min(supply[0], demand[3])
    tabla_asignaciones[0][3] = assign_qty
    supply[0] -= assign_qty
    demand[3] -= assign_qty
    print_assignment_matrix(3)

    # 第4次分配:第一行第五列
    assign_qty = min(supply[0], demand[4])
    tabla_asignaciones[0][4] = assign_qty
    supply[0] -= assign_qty
    demand[4] -= assign_qty
    print_assignment_matrix(4)

    # 第5次分配:第二行第三列
    assign_qty = min(supply[1], demand[2])
    tabla_asignaciones[1][2] = assign_qty
    supply[1] -= assign_qty
    demand[2] -= assign_qty
    print_assignment_matrix(5)

    # 第6次分配:第三行第五列
    assign_qty = min(supply[2], demand[4])
    tabla_asignaciones[2][4] = assign_qty
    supply[2] -= assign_qty
    demand[4] -= assign_qty
    print_assignment_matrix(6)

    # 第7次分配:第三行第三列
    assign_qty = min(supply[2], demand[2])
    tabla_asignaciones[2][2] = assign_qty
    supply[2] -= assign_qty
    demand[2] -= assign_qty
    print_assignment_matrix(7)

    print("\n=== 最终分配矩阵 ===")
    for row in tabla_asignaciones:
        print(row)

运行结果示例

运行代码后,会依次输出每次分配后的矩阵,最终输出如下:

需要完成的分配次数: 7
总供应量: 950
总需求量: 950

=== 第 1 次分配后矩阵 ===
[0, 220, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

=== 第 2 次分配后矩阵 ===
[140, 220, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

=== 第 3 次分配后矩阵 ===
[140, 220, 0, 80, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

=== 第 4 次分配后矩阵 ===
[140, 220, 0, 80, 60]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

=== 第 5 次分配后矩阵 ===
[140, 220, 0, 80, 60]
[0, 0, 330, 0, 0]
[0, 0, 0, 0, 0]

=== 第 6 次分配后矩阵 ===
[140, 220, 0, 80, 60]
[0, 0, 330, 0, 0]
[0, 0, 0, 0, 90]

=== 第 7 次分配后矩阵 ===
[140, 220, 0, 80, 60]
[0, 0, 330, 0, 0]
[0, 0, 30, 0, 90]

=== 最终分配矩阵 ===
[140, 220, 0, 80, 60]
[0, 0, 330, 0, 0]
[0, 0, 30, 0, 90]

内容的提问来源于stack exchange,提问作者Elektvocal95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:38:08