我只是在寻找方向,我意识到给出的示例可以使用蛮力迭代来解决,但我正在寻找一种更优雅的(即数学上的)解决方案,该解决方案可能会解决更大的示例(例如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
您的问题几乎与分配问题完全相同,例如可以通过匈牙利算法在多项式时间内解决。
请注意,分配问题通常是一个最小化问题,但是将矩阵乘以-1并添加一些常数将使该方法适用。此外,对于多个最优解,没有正式的平局制动条件。但是,该方法会为您提供具有最佳总和的解决方案。令m为最小求和。通过将所有小于或等于m的项设置为零来修改矩阵,然后再次求解。要么您得到的解决方案的总和比上一个更好。如果不是,则先前的解决方案已经是最佳的。