我有许多需要以各种组合分配的任务,还有三个人可以分配给他们。关于哪些任务可以组合在一起有各种规则,但要点是总是会有三个任务,每个人必须始终只分配其中一个任务。我已经有了代码,它将创建一个列表列表,其中包含遵循规则的三个任务的所有可能组合:
lineups = [[Task1, Task2, Task3], [Task1, Task2, Task4],
[Task1, Task2, Task5], [Task1, Task2, Task6], ...]
每个人都是:
的实例class Person:
def __init__(self):
self.name = ''
self.office = ''
self.tasks = []
其中.tasks
属性将存储该人员能够执行的任务。 people
是[Person1, Person2, Person3]
的简单列表。
我已经做了很多搜索并尝试使用itertools.combinations
以及zip()
尝试合并这两个列表,但这些解决方案都没有给我正确的输出或我'误解了如何迭代它。
我要做的是检查三个tasks
的所有组合,以确保有people
的某些阵容可以涵盖所有三个任务,每个Person
都有一个task
。重点是我不希望每个Person
都必须学习列表中的每个task
,但需要确保没有任何合法组合离开我没有人能够完成任务。如果有未涵盖的组合,我想建立一个这些组合的列表,这样我就可以教人们解决问题的新任务。
答案 0 :(得分:0)
因此,您可以拥有自己想要“覆盖”的所有任务组合。最简单的解决方案是创建所有组合的列表(来自您的员工的所有技能列表的交叉产品),并检查您的每个任务组合是否实际涵盖。这是一次尝试。
import itertools
tasks_combinations = [[1, 2, 3], [2, 3, 4]]
people_tasks = [[1, 3], [2, 3], [3, 4]]
people_tasks_product = map(set, (itertools.product(*people_tasks)))
for tasks_combination in tasks_combinations:
if set(tasks_combination) in people_tasks_product:
print('Task combination {} is covered.'.format(tasks_combination))
else:
print('Task combination {} is NOT covered.'.format(tasks_combination))
Evert回答的问题是,它不包括两个人完全延迟并且只有一个人可以完成所有任务的情况。