J'ai besoin d'un générateur qui reçoit en entrée un ensemble d'agents et un ensemble d'éléments, et génère toutes les partitions dans lesquelles chaque agent obtient le même nombre d'éléments. Par exemple:Générer toutes les partitions de même taille d'un ensemble
>>> 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]}
Pour deux agents cela est facile (en supposant que le nombre d'éléments est même):
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
}
Pour trois agents cela devient plus compliqué:
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
}
est-il une solution plus générale, qui fonctionne pour un nombre quelconque d'agents?
Juste pour clarifier. Avez-vous toujours le nombre d'éléments qui peuvent être répartis uniformément entre les agents ('len (items)/len (agents) == 0')? Si non, comment répartissez-vous les articles entre les agents s'ils ne peuvent pas être distribués uniformément? – Highstaker
@Highstaker Oui, je suppose que le nombre d'éléments est toujours un multiple entier du nombre d'agents. –
Y a-t-il des articles répétés? –