【问题标题】:Optimization Problem in Python (using binary array) possible solutionsPython中的优化问题(使用二进制数组)可能的解决方案
【发布时间】: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


【解决方案1】:

试试这个:

n = 150
row_sums = np.sum(x, axis=1)
top_n_row_sums = np.argsort(row_sums)[-n:]
max_successes = x[top_n_row_sums]

这需要每一行的总和,获取最高 n 总和的索引,并使用这些行索引对 x 进行索引。

请注意,这些行最终将按照它们在各列中的总和的升序进行排序。如果您希望行按正常顺序(按索引升序),请改用:

max_successes = x[sorted(top_n_row_sums)]

【讨论】:

  • 非常感谢您的帮助。抱歉,我没有事先解释清楚,但这很有帮助。效果很好!
【解决方案2】:

为什么不只计算每一行的成功总和,然后您可以轻松选择前 150 个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多