Я думаю, что это общая проблема комбинаторики, но я не могу найти имя для нее или какой-либо материал об этом. Я делаю это в Python и numpy, но если для этого существует быстрый матричный метод, я могу, вероятно, перевести.
В принципе, учитывая n элементов, мне нужно создать все способы поместить их в m бункеров. Например, разбиение 4 предметов на 3 бункера даст что-то вроде [(4, 0, 0), (3, 1, 0), (3, 0, 1), (2, 2, 0), (2, 1, 1), ...]
. Это продукт с фиксированной суммой.
Реализация этого с помощью itertools проста.
import itertools
def fixed_total_product(bins, num_items):
""" Return iterator of all item binning possibilities. """
return itertools.ifilter(lambda combo: sum(combo) == num_items,
itertools.product(xrange(num_items + 1), repeat=bins))
К сожалению, я думаю, что последующие вычисления в циклах будут неэффективными. Работа с этим как массивом 2D numpy будет быстрее позже, но я не могу найти эффективный способ построения массива с этим. Я мог бы перебирать результат ifilter, создавая список возможностей и использовать его для построения массива, но это кажется огромным отходом.
Я предполагаю, что лучший способ сделать это - построить все "numpy way", но я не уверен, как это сделать. Быстрая реализация продукта в stackoverflow: Использование numpy для создания массива всех комбинаций из двух массивов. Я предполагаю, что вы можете изменить это только для вывода продуктов с правильной суммой. Размер массива должен быть ((m-1) + n) выбирать n, так как существуют границы m-1 bin.
Любые идеи? Тесты очень ценятся, но не требуются.