查找具有某些限制的二维数组中的最大值总和

时间:2018-04-18 16:27:40

标签: python algorithm

我的问题与2002年谷歌回答的问题相同[1]。

以下是Google解答引用的问题。

  

“我正在尝试计算a的最大可能值总和   矩阵或二维数组或表或任何合适的结构。限制   是你选择一个特定的行,列值添加到你的   总和,不能使用该行或列中的其他值   计算总和。“

我能够解决这个问题的唯一方法就是通过 每种可能的组合并将潜在结果存储在一组中 所有可能的潜在结果。然后我选择最大值。这似乎 在我的程序中咀嚼很多内存会产生错误。该 程序是用Java编写的。

我在下面提供了一个示例以进一步说明

e.g。 3 X 3矩阵,具有以下值

0.5 0.1 0.4
0.3 0.8 0.7
0.2 0.4 0.6

所有可能的组合

0.5 + 0.8 + 0.6 = 1.9
0.5 + 0.7 + 0.4 = 1.6
0.1 + 0.3 + 0.6 = 1.0
0.1 + 0.7 + 0.2 = 1.0
0.4 + 0.3 + 0.4 = 1.1
0.4 + 0.8 + 0.2 = 1.4

所以最大可能总和为1.9。

如果没有其他方法可以获得确切的最大值,那么就存在 我可以做些什么来获得近似值?

重复可以出现在矩阵中,矩阵不一定 方。

3 个答案:

答案 0 :(得分:1)

使用itertools,您可以以内存有效的方式遍历所有组合,并保持元素集的总和最高。

from itertools import permutations, product

def get_max_sum(table):
    height, width = len(table), len(table[0])

    sum_, *pos = max((sum(table[x][y] for x, y in zip(*pairs)), *zip(*pairs))
               for pairs in product(
                permutations(range(height)),
               ([*range(i, width), *range(i)] for i in range(width))))

    return (sum_, *sorted(pos))

这是一个例子。

sum_, *pos = get_max_sum(
    [[1, 2, 3, 6],
     [2, 3, 5, 8],
     [4, 9, 16, 1]]
)
# Output: (26, (0, 1), (1, 3), (2, 2))

输出提供总和,后跟所选元素的坐标。

答案 1 :(得分:0)

在python中很容易实现。 假设二维阵列是形状为n,m的A。 现在搜索具有最大值的索引并删除行和列。 考虑到您可能不会再次使用最大值的行和列,重复最小的n,m。

import numpy as np
A = np.random.randint(0,100,30).reshape((5,6))
S = 0
for i in range(0,min(A.shape)) :
   I = np.unravel_index(np.argmax(A, axis=None), A.shape)
   S+= A[I]
   A=np.delete(A,I[0],0)
   A=np.delete(A,I[1],1)
print('Sum = ' + str(S))

答案 2 :(得分:0)

这是一个想法,我不确定它是否适用于所有情况。

对于每个行和列,找到最大值和最小值并计算差异。然后选择具有最大差异的行或列。将该行或列的最大值添加到解决方案中,并重复显示通过删除刚刚添加到解决方案中的项的行和列而生成的矩阵。

考虑样本矩阵。对于第一,第二和第三行,最大值和最小值之间的差异为0.4,0.5和0.4,对于第一,第二和第三列,最大值和最小值之间的差值为0.3,0.7和0.3。第二列的最大差异是0.7,第二列中的最大项目是0.8,因此向解决方案添加0.8并将矩阵减少到0.5 0.4 | 0.2 0.6。减少矩阵的最大差异是第二行,从0.2到0.6,因此向解决方案添加0.6并将矩阵减少为单列,单行包含0.5。最后,在溶液中加0.5。因此,解决方案是0.8 + 0.6 + 0.5 = 1.9,这与您的解决方案一致。