给出一个分数矩阵,我想从每一列和每一行中准确选择n个元素,以使整个矩阵中所选元素的总分尽可能高。
示例:给定成本矩阵
array([[0.65500799, 0.79214695, 0.39854742],
[0.53634974, 0.3682463 , 0.99663978],
[0.73423119, 0.87150676, 0.80823699]])
n = 1的最佳选择是:
array([[1., 0., 0.],
[0., 0., 1.],
[0., 1., 0.]])
该解决方案的总分是0.65500799 + 0.87150676 + 0.99663978
n = 2的最佳选择是:
array([[1., 1., 0.],
[1., 0., 1.],
[0., 1., 1.]])
该解决方案的总分是0.65500799 + 0.53634974 + 0.79214695 + 0.87150676 + 0.99663978 + 0.80823699
这些解决方案是由天真的Breadth-First Search (BFS)获得的。但是,对于较大的问题(例如10x10,n = 2),这种方法在计算上不可行(运行时会爆炸)。
问题:
答案 0 :(得分:2)
这是基于整数编程(IP)的解决方案。
决策变量: x[i,j] = 1
,如果我们在行i
的列j
中选择该项。
参数(输入): s[i,j] =
分(i
,j
)得分
配方:
maximize sum {i, j} s[i,j] * x[i,j]
subject to sum {i} x[i,j] = n for all j
sum {j} x[i,j] = n for all i
x[i,j] in {0,1} for all i, j
您可以使用Python / PuLP
或特定于求解器的程序包(例如gurobipy
或docplex
)来实现。我希望这些求解器可以在几分之一秒内解决甚至最大的问题,达到最优(不是启发式)。