我需要一個生成器來獲取一組「代理」和一組「項目」的輸入,並生成每個代理獲取相同數量項目的所有分區。例如:生成一個集合的所有相同大小的分區
>>> 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是的,我認爲項目的數量總是代理人數量的整數倍。 –
是否有重複的項目? –