我問了一個基本上是揹包問題的問題 - 我需要找到幾個不同數組的對象組合提供最佳輸出。例如,對於每個對象的「成本」限制,來自對象的最高「總和」值。我在這裏獲得的答案是以下各項紅寶石 - 優化代碼從數組中尋找最佳選擇
a.product(b,c)
.select{ |arr| arr.reduce(0) { |sum,h| sum + h[:cost] } < 30 }
.max_by{ |arr| arr.reduce(0) { |sum,h| sum + h[:value] } }
偉大的工程,但我進入6個陣列,每個〜40點的選擇,可能的組合獲得向上的400萬花費太長的時間來處理。我做了一些修改的代碼做處理速度更快 -
#creating the array doesn't take too long
combinations = a.product(b,c,d,e)
possibles = []
combinations.each do |array_of_objects|
#max_cost is a numeric parameter, and I can't have the same exact object used twice
if !(array_of_objects.sum(&:salary) > max_cost) or !(array_of_objects.uniq.count < array_of_objects.count)
possibles << array_of_objects
end
end
possibles.max_by{ |ar| ar.sum(&:std_proj) }
它打破成兩個獨立的數組幫助性能提升不少,因爲我只需要檢查max_by對於符合標準的許多不太可能的組合。
有沒有人看到一種方法來優化此代碼?由於我通常會處理數以萬計或數百萬個組合,所以任何一點點都可以大有幫助。謝謝。
有沒有人看到一種方法來優化上述代碼,使其處理更快?有時會有數百萬種可能的組合運行,所以任何一點點都可以提供幫助。 – 2014-09-25 04:28:13
數組來自哪裏?也許你應該在數據庫查詢中做到這一點? – Aret 2014-09-25 04:35:53
陣列確實來自數據庫,但它們不是瓶頸。這是代碼中的處理。 – 2014-09-25 04:37:55