我想将Excel计算转换为Python程序,得到相同的结果

问题描述 投票:0回答:1

A代表需要在每台机器上处理的任务。 T0 到 T4 总共有 5 个任务。
B 是准备机器处理之前添加的任务所需的设置值。设置 - b0 到 b3 表示“b”矩阵中的值。 每个任务可能有不同的值,并且必须在每台机器(M0、M1、M2、M3)上处理。机器 - M0 到 M3 表示基于动态编程逻辑计算的最大值。
给定的程序顺序列表用于指定 a 和 b 矩阵中的行应在机器上处理的顺序。在本例中,它从第 0 行开始,一直到第 4 行。我已附上此问题的 Excel 计算表以供参考。 顺序 - T0 到 T4 代表不同的任务。
下表表示动态规划问题的计算步骤。我附上了Excel表格以供计算参考。 Excel表格供参考

import numpy as np

a = np.array([[4, 3, 6, 2], [1, 4, 3, 5], [2, 5, 2, 3], [5, 2, 4, 1], [3, 6, 1, 4]])
b = np.array([[0, 2, 3, 1], [2, 0, 1, 3], [3, 1, 0, 2], [1, 3, 2, 0], [2, 1, 3, 0]])
order = [0, 1, 2, 3, 4]
t = np.zeros((a.shape[0], a.shape[1]))

def calculate_matrix(order, a, b):
    for i in range(a.shape[0]):
        for j in range(a.shape[1]):
            if i == 0 and j == 0:
                t[i, j] = b[order[i], j] + a[order[i], j]
            elif i == 0:
                t[i, j] = b[order[i], j] + t[i, j - 1] + a[order[i], j]
            elif j == 0:
                t[i, j] = b[order[i], j] + t[i - 1, j] + a[order[i], j]
            else:
                t[i, j] = max(t[i - 1, j] + b[order[i], j], t[i, j - 1] + b[order[i], j]) + a[order[i], j]

    return t

final_matrix = calculate_matrix(order, a, b)
print(final_matrix)

以上程序逐步解释并参考Excel表格:

  1. 从填充零的初始矩阵开始。
  2. 对于矩阵中的每个单元格,遵循表中描述的逻辑:
    首先如果条件 -
    对于 T0(第 0 行)(第 0 列): - 设置 t [0, 0] = M0, T0 - M0 = (b0[0,0]) + a [0, 0] = 0+4 = 4
    对于第一个 elif 条件
    对于 T0…T4(第 0 行,第 0、1、2、3,4 列)
    设 t [0, 1] = M1, T0 - M1 = (b1= 上一列 a [0, 0] + b1[0,0]) + a [0, 1] = 6+3 = 9
    设 t [0, 2] = M2, T0 - M2 = (b2= 上一列 a [0, 1] + b2[0,0]) + a [0, 2] = 12+6 = 18
    设 t [0, 3] = M3, T0 - M3 = (b3= 上一列 a [0, 2] + b3[0,0]) + a [0, 3] = 19+2 = 21
    对于第二个 elif 条件
    设置 t [1, 0] = M0, T1 - M0 = (b1= 来自上一个“输出”列 a [0, 0] + b0[0,1]) + a [1, 0] = 6+1 = 7
    设置 t [2, 0] = M0, T2 - M0 = (b1= 来自上一个“输出”列 a [1, 0] + b0[0,2]) + a [2, 0] = 10+2 = 12
    设置 t [3, 0] = M0, T3 - M0 = (b1= 来自上一个“输出”列 a [2, 0] + b0[0,3]) + a [3, 0] = 13+5 = 18
    设置 t [4, 0] = M0, T4 - M0 = (b1= 来自上一个“输出”列 a [3, 0] + b0[0,4]) + a [4, 0] = 20+3 = 23
    对于最终的 else 条件
    设 t [1, 1] = M1, T1
    b1[1,1] = 来自上一个“输出”列 a [1, 0]] + b1[1,1]) = 7
    Max (b1[1,1],来自上一个“输出”列 a [1, 1]) + a[1, 1] = max(7, 9) + 4 = 9+4 = 13
    同样,继续计算所有其他任务的 M0、M1、M2 和 M3。

这是Excel计算结果t:

[[4, 9, 18, 21], [7, 13, 21, 29], [12, 18, 23, 32], [18, 23, 29, 33], [23, 30, 34, 38]]

但是我从给定的程序中得到一个矩阵

[[4.  9. 18. 21.], [7. 13. 22. 30.], [12. 19. 24. 35.], [18. 24. 30. 36.], [23. 31. 35. 40.]]
python list numpy scheduled-tasks numpy-ndarray
1个回答
0
投票

我发现了两个问题:

  • 我相当确定
    t[i - 1, j]
    应该引用
    t[i - 1, j - 1]
    单元格。
  • max() 的两个参数都引用 B 矩阵,但在电子表格中,其中一个参数引用 A 矩阵。

这是我最好的尝试。走线

t[i, j] = max(t[i - 1, j] + b[order[i], j], t[i, j - 1] + b[order[i], j]) + a[order[i], j]

并将其替换为

x = t[i - 1, j - 1] + b[order[i - 1], j] + a[order[i - 1], j]
y = t[i, j - 1] + b[order[i], j]
z = a[order[i], j]
t[i, j] = max(x, y) + z

输出:

[[ 4.  9. 18. 21.]
 [ 7. 13. 21. 29.]
 [12. 18. 20. 32.]
 [18. 23. 29. 30.]
 [23. 30. 34. 38.]]

除了两个位置之外,这在所有位置都是正确的。我不知道为什么这些地方是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.