如果您可以假设cities 中的所有城市都是唯一的,您可以简单地生成长度为len(cities) 的所有itertools.permutations,并(可选)将它们与城市一起压缩,例如:
def valid_combinations(cities,drivers):
return itertools.permutations(drivers,len(cities))
或者,如果您想将它们与城市一起压缩:
def valid_combinations(cities,drivers):
for perm in itertools.permutations(drivers,len(cities)):
yield zip(cities,perm)
对于我们生成的最后一个:
>>> list(map(tuple,valid_combinations(cities,drivers)))
[(('Austin', 'bob'), ('San Antonio', 'Lenny'), ('Houston', 'frank')),
(('Austin', 'bob'), ('San Antonio', 'Lenny'), ('Houston', 'sunny')),
(('Austin', 'bob'), ('San Antonio', 'frank'), ('Houston', 'Lenny')),
(('Austin', 'bob'), ('San Antonio', 'frank'), ('Houston', 'sunny')),
(('Austin', 'bob'), ('San Antonio', 'sunny'), ('Houston', 'Lenny')),
(('Austin', 'bob'), ('San Antonio', 'sunny'), ('Houston', 'frank')),
(('Austin', 'Lenny'), ('San Antonio', 'bob'), ('Houston', 'frank')),
(('Austin', 'Lenny'), ('San Antonio', 'bob'), ('Houston', 'sunny')),
(('Austin', 'Lenny'), ('San Antonio', 'frank'), ('Houston', 'bob')),
(('Austin', 'Lenny'), ('San Antonio', 'frank'), ('Houston', 'sunny')),
(('Austin', 'Lenny'), ('San Antonio', 'sunny'), ('Houston', 'bob')),
(('Austin', 'Lenny'), ('San Antonio', 'sunny'), ('Houston', 'frank')),
(('Austin', 'frank'), ('San Antonio', 'bob'), ('Houston', 'Lenny')),
(('Austin', 'frank'), ('San Antonio', 'bob'), ('Houston', 'sunny')),
(('Austin', 'frank'), ('San Antonio', 'Lenny'), ('Houston', 'bob')),
(('Austin', 'frank'), ('San Antonio', 'Lenny'), ('Houston', 'sunny')),
(('Austin', 'frank'), ('San Antonio', 'sunny'), ('Houston', 'bob')),
(('Austin', 'frank'), ('San Antonio', 'sunny'), ('Houston', 'Lenny')),
(('Austin', 'sunny'), ('San Antonio', 'bob'), ('Houston', 'Lenny')),
(('Austin', 'sunny'), ('San Antonio', 'bob'), ('Houston', 'frank')),
(('Austin', 'sunny'), ('San Antonio', 'Lenny'), ('Houston', 'bob')),
(('Austin', 'sunny'), ('San Antonio', 'Lenny'), ('Houston', 'frank')),
(('Austin', 'sunny'), ('San Antonio', 'frank'), ('Houston', 'bob')),
(('Austin', 'sunny'), ('San Antonio', 'frank'), ('Houston', 'Lenny'))]
所以在第一种情况下,'bob' 驱动到 'Austin','Lenny' 到 'San Antonio' 和 'frank' 到 'Houston';在第二种情况下,'bob' 驱动到 'Austin','Lenny' 到 'San Antonio' 和 'sunny' 到 'Houston';等等。此处有效配置的总数 2×3×4=24 这也是 yielded 的元素数。
但是,如果您想找到最佳组合 - 您的问题还不清楚 - 您可以使用 匈牙利算法 的变体在 O(n3).