我想将 Excel 计算转换为具有相同结果的 Python 程序

I would like to transform an Excel calculation into a Python program with the same results

提问人:Arunmozhi 提问时间:9/19/2023 最后编辑:Arunmozhi 更新时间:9/20/2023 访问量:59

问:

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

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 计算结果 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 列表 numpy scheduled-tasks numpy-ndarray

评论

1赞 jared 9/20/2023
我将投票以拼写错误结束这个问题,因为您的错误只是您的函数调用应该是 .如果你很好奇,这里有另一种编写代码的方法:hastebin.com/share/fiyadaxaxi.pymaxmax(t[i - 1, j], t[i, j - 1] + b[order[i], j])
0赞 jared 9/20/2023
对我的替代解决方案的细微更改:第 16 行 () 是不必要的,可以删除。setup = np.zeros((a.shape[0]))
1赞 Charles Duffy 9/20/2023
请注意,一般来说,我们要求问题标题不是关于你要做什么,而是描述阻止你这样做的狭隘、具体的技术问题。(同样,问题本身应该写成狭隘地关注这个问题,这样那些在编写完全不同类型的程序时犯了同样错误的人可以找到你的问题并从中学习解决方案;我们正在建立一个知识库,而不是一个消息论坛)。

答:

1赞 Nick ODell 9/20/2023 #1

我发现了两个问题:

  • 我相当确定这应该引用单元格。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.]]

这在除两个位置外的所有位置都是正确的。我不确定为什么在那些地方是错误的。

评论

1赞 jared 9/20/2023
根据我对这个问题的评论,我投票决定关闭这个问题,因为错别字。