Мне нужен генератор, который вводит набор «агентов» и набор «элементов» и генерирует все разделы, в которых каждый агент получает одинаковое количество элементов. Например:Создать все равные по размеру разделы
>>> for p in equalPartitions(["A","B"], [1,2,3,4]): print(p)
{'A': [1, 2], 'B': [3, 4]}
{'A': [1, 3], 'B': [2, 4]}
{'A': [1, 4], 'B': [2, 3]}
{'A': [2, 3], 'B': [1, 4]}
{'A': [2, 4], 'B': [1, 3]}
{'A': [3, 4], 'B': [1, 2]}
Для двух агентов это легко (при условии, количество элементов четно):
itemsPerAgent = len(items) // len(agents)
for bundle0 in itertools.combinations(items, itemsPerAgent):
bundle1 = [item for item in items if item not in bundle0]
yield {
agents[0]: list(bundle0),
agents[1]: bundle1
}
Для трех агентов это становится более сложным:
itemsPerAgent = len(items) // len(agents)
for bundle0 in itertools.combinations(items, itemsPerAgent):
bundle12 = [item for item in items if item not in bundle0]
for bundle1 in itertools.combinations(bundle12, itemsPerAgent):
bundle2 = [item for item in bundle12 if item not in bundle1]
yield {
agents[0]: list(bundle0),
agents[1]: list(bundle1),
agents[2]: bundle2
}
Есть более общее решение, которое работает для любого количества агентов?
Просто уточнить. У вас всегда есть количество элементов, которые могут быть равномерно распределены между агентами ('len (items)/len (agents) == 0')? Если нет, как вы распределяете элементы между агентами, если их нельзя распределить равномерно? – Highstaker
@Highstaker Да, я полагаю, что количество элементов всегда является целым числом, кратным количеству агентов. –
Есть ли повторяющиеся предметы? –