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

标签 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 库实现了这些启发式方法?

最佳答案

这是一个基于整数规划(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 或特定于求解器的包(例如 gurobipydocplex)中实现此功能。我希望这些求解器甚至可以在不到一秒的时间内解决问题的中等大实例,达到最优(不是启发式)。

关于python - 离散优化 - 从分数矩阵的每一行和每一列中精确选择 N 个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56261364/

相关文章:

将字符串中的所有八进制值评估为整数的 Pythonic 方法

search - Google 自定义搜索 API 结果为空,而普通搜索有结果

regex - 简化正则表达式,[star] 神秘消失

简单算术表达式的上下文无关语法修改

python - Django 文件浏览器配置错误

python - jax.lax.select 与 jax.numpy.where

c# - 如何在 Lucene.net 中执行语音和近似搜索

regular-language - 如果语言 L 的每个子集都是正则的,那么 L 是正则的?

python - 大数的质因数

php - Elasticsearch地理位置搜索未返回英里单位的结果