Сценарий состоит в том, что существуют n
объекты разных размеров, неравномерно распределенные по m
ведрам. Размер ведра - это сумма всех размеров объектов, которые он содержит. Теперь случается, что размеры ведер сильно различаются.
Что было бы хорошим алгоритмом, если бы я хотел равномерно распределять эти объекты над этими ведрами, чтобы общий размер каждого ведра был примерно таким же? Было бы неплохо, если бы алгоритм наклонился к меньшему размеру перемещения над совершенно равномерным разбросом.
У меня есть это наивное, неэффективное и багги-решение в Ruby.
buckets = [ [10, 4, 3, 3, 2, 1], [5, 5, 3, 2, 1], [3, 1, 1], [2] ]
avg_size = buckets.flatten.reduce(:+) / buckets.count + 1
large_buckets = buckets.take_while {|arr| arr.reduce(:+) >= avg_size}.to_a
large_buckets.each do |large|
smallest = buckets.last
until ((small_sum = smallest.reduce(:+)) >= avg_size)
break if small_sum + large.last >= avg_size
smallest << large.pop
end
buckets.insert(0, buckets.pop)
end
=> [[3, 1, 1, 1, 2, 3], [2, 1, 2, 3, 3], [10, 4], [5, 5]]