Ruby - 优化代码,从数组中寻找最佳选择

时间:2014-09-25 04:23:30

标签: ruby arrays optimization knapsack-problem

我问了一个基本上是背包问题的问题 - 我需要找到能够提供最佳输出的几个不同对象组合的组合。例如,最高的总和"值"从对象到成本的限制"成本"每个对象。我在这里收到的答案是以下 -

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,以获得符合标准的许多不太可能的组合。

有没有人看到优化此代码的方法?由于我通常会处理数万或数百万种组合,因此任何一点点都可以提供很大的帮助。感谢。

1 个答案:

答案 0 :(得分:0)

如果我们谈论的是数百万行,那么操作就像是唯一的,最大的

我建议你在查询中使用DISINCT和MAX()解决它,你甚至可以按成本使用WHERE过滤。

在Ruby中循环对象显然更加昂贵。