這是一個後續問題:Finding max value of a weighted subset sum of a power set 鑑於前面的問題解決了(以最優)在合理的時間內大小< = 15的問題,我想解決一個大小的問題〜2000近最優。啓發式多維揹包
作爲一個小例子的問題,我給予一定範圍的節點:
var range = [0,1,2,3,4];
的函數創建了一個功率範圍內的所有節點設置並分配每個組合一個分數值。負分數被刪除,導致以下數組S
。 S[n][0]
是按位全部包含節點的OR,並且S[n][1]
是比分:
var S = [
[1,0], //0
[2,0], //1
[4,0], //2
[8,0], //3
[16,0], //4
[3,50], //0-1
[5,100], //0-2
[6,75], //1-2
[20,130], //2-4
[7,179] //0-1-2 e.g. combining 0-1-2 has a key of 7 (bitwise `1|2|4`) and a score of 179.
];
的最佳方案,最大限度地提高得分,將是:
var solution = [[8,3,20],180]
哪裏solution[0]
是組合從S
陣列。 solution[1]
是最終得分。請注意,按位8 & 3 & 20 == 0
表示每個節點僅使用一次。
問題細節:每個節點必須只使用一次,單節點組合的得分總是0,如上面的S
陣列所示。
我目前的解決方案(seen here)使用動態編程並適用於小問題。我已經看到涉及動態編程的啓發式方法,如https://youtu.be/ze1Xa28h_Ns,但無法弄清楚如何將其應用於多維問題。鑑於問題的限制,適用的啓發式是什麼?
編輯: 事情我已經試過
- 貪婪的方法(排序
score
最大到最小,選擇下一個可行的候選人) - 與上述相同,但排序
score/cardinality(combo)
- GRASP(編輯每個
score
高達10%,然後分類,重複,直到在x秒內沒有找到更好的解決方案)
你說15或2000的「尺寸」是多少?最大重量?物品的數量?如果是後者,並且實際上在內存中生成完整的powerset,那麼即使使用編譯語言,也可能無法獲得超過30的值。另外,爲什麼不首先消除所有消極因素,因爲它們永遠不可能處於最佳解決方案? (除非我誤解了。) –
啊,好問題。我稱之爲「大小」是範圍的長度。產生「功率集」的功能實際上也是一種啓發式功能,它只給我一個功率集的子集,通常小於10倍的尺寸(例如,尺寸1000的問題會產生10000的「S」)。 –