我有一個大的二進制 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 這樣的求解器中設定這個問題的演算法或方法嗎?
uj5u.com熱心網友回復:
嘗試這個:
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)]
uj5u.com熱心網友回復:
為什么不只計算每一行的成功總和,然后您可以輕松選擇前 150 個值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/335471.html
