离散优化-从分数矩阵的每一行和每一列中准确选择N个项目

时间:2019-05-22 16:31:37

标签: python search computation-theory integer-programming discrete-optimization

给出一个分数矩阵,我想从每一列和每一行中准确选择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),这种方法在计算上不可行(运行时会爆炸)。

问题:

  1. 该离散优化问题如何分类?
  2. 什么启发式方法可以快速找到解决该问题的好方法?
  3. 哪些Python库实现了这些启发式技术?

1 个答案:

答案 0 :(得分:2)

这是基于整数编程(IP)的解决方案。

决策变量: x[i,j] = 1,如果我们在行i的列j中选择该项。

参数(输入): s[i,j] =分(ij)得分

配方:

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或特定于求解器的程序包(例如gurobipydocplex)来实现。我希望这些求解器可以在几分之一秒内解决甚至最大的问题,达到最优(不是启发式)。