【发布时间】:2021-12-10 02:56:21
【问题描述】:
我有一个问题,我有一个大型二进制 numpy 数组 (1000,2000)。一般的想法是,数组的列代表从 0 到 2000 的时间,每一行代表一个任务。数组中每个 0 代表失败,每个 1 代表成功。
我需要做的是从 1000 个可用任务中选择 150 个任务(行轴),并在唯一列上最大化总成功次数(1 秒)。它不必是连续的,我们只是希望在每个时间段内最大化成功(只需要 1 次成功,任何额外的都是无关的)。我想从 150 个任务中选出最好的“篮子”。子数组行可以取自 1000 个初始行中的任何位置。我想要 150 个任务的最佳“篮子”,这些任务可以在一段时间内取得最大的成功(列)。 (为更加清晰而编辑)
一个真正的基本的数组是什么样子的例子:
array([[0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0],
[0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1],
[0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0],
[1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0],
[1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0],
[1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0]])
我使用 NumPy 中随机生成的任务篮子成功创建了蒙特卡罗模拟,然后遍历数组并求和。正如您可以想象的那样,这需要一段时间,并且考虑到大量的潜在组合,它是低效的。有人可以指出在 PuLP 等求解器中解决此问题的算法或方法吗?
【问题讨论】:
-
基本上,但是子数组的行可以从 1000 个初始行中获取。基本上,我想要 150 个任务的最佳“篮子”。它可能是第 1,5,10,65,96..123 行等等。
-
正确,那么这是否可以通过求解器(如 PuLP)或其他算法中的约束来解决?暴力破解是不可行的。即使它接近最佳解决方案,我认为这是可以接受的。
-
我误解了这个问题。我相信我的解决方案应该能满足您的需求。
标签: python-3.x numpy pulp