一尘不染

最大化矩阵中“不重叠”数的总和

algorithm

我只是在寻找方向,我意识到给出的示例可以使用蛮力迭代来解决,但我正在寻找一种更优雅的(即数学上的)解决方案,该解决方案可能会解决更大的示例(例如20x20或30x30)
)。完全有可能无法做到这一点,而我在提出一种不依赖于蛮力的方法方面几乎没有成功…

我有一个nxn的矩阵(称为A)。我希望从矩阵A中选择点的子集(称为B)。该子集将由n个元素组成,其中A的每一行和每一列仅取一个元素。输出应提供解决方案(
B),使得在给定这些约束的情况下,组成B的元素之和为最大可能值(例如,在下面的示例中为25)。如果找到B的多个实例(即,给出相同最大和的不同解),则应选择具有最大最小元素的B的解。

B也可以是一个选择矩阵,它是nxn,但是其中只有n个所需元素不为零。

例如:如果A =

|5 4 3 2 1|
|4 3 2 1 5|
|3 2 1 5 4|
|2 1 5 4 3|
|1 5 4 3 2|

=> B将是

|5 5 5 5 5|

但是,如果A =

|5 4 3|
|4 3 2|
|3 2 1|

B =

|3 3 3|

因为B的最小元素是3,大于

|5 3 1|

要么

|4 4 1|

也都加到9


阅读 260

收藏
2020-07-28

共1个答案

一尘不染

您的问题几乎与分配问题完全相同,例如可以通过匈牙利算法在多项式时间内解决。

请注意,分配问题通常是一个最小化问题,但是将矩阵乘以-1并添加一些常数将使该方法适用。此外,对于多个最优解,没有正式的平局制动条件。但是,该方法会为您提供具有最佳总和的解决方案。令m为最小求和。通过将所有小于或等于m的项设置为零来修改矩阵,然后再次求解。要么您得到的解决方案的总和比上一个更好。如果不是,则先前的解决方案已经是最佳的。

2020-07-28