假设我们有3个用户可以被潜在地分配给该任务。
user_a_busy = [[1,2], [2,4], [5,6]]
user_b_busy = [[4,7], [7,8]]
user_c_busy = [[0,1], [1,5]]
列表中的每个元素表示用户在一天中不可用的时间段。因此,用户A在凌晨1点到2点之间忙碌,2点到4点之间也是如此。为了能够遍历用户并识别他们,我将上述列表以字典形式表示。
users_to_check = {'A':user_a_busy, 'B':user_b_busy, 'C':user_c_busy}
现在假设我们有一个需要1小时完成的任务,我们想要在午夜到上午10点之间每隔1小时检查一次(所以任务只能在整点开始)。下面是一个需要检查的每个时间段的列表。
task_intervals_to_check = [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]]
这是一个检查两个区间是否重叠的函数:
def intervals_overlap(service, busy):
if service[1] > busy[0] and service[0] < busy[1]:
return True
return False
所以现在这是一个循环,得出了可用的小时和可以分配给任务的用户的字典:
result = defaultdict(list)
for interval in task_intervals_to_check:
for user, user_busy in users_to_check.iteritems():
overlaps = False
for busy_period in user_busy:
if intervals_overlap(interval, busy_period):
overlaps = True
break
if not overlaps:
result[interval[0]].append(user)
对于持续时间为1小时的任务,结果如下:
{0: ['A', 'B'], 1: ['B'], 2: ['B'], 3: ['B'], 4: ['A'], 5: ['C'], 6: ['A', 'C'], 7: ['A', 'C'], 8: ['A', 'C', 'B'], 9: ['A', 'C', 'B']}
对于持续时间为2小时的任务,结果如下:
{0: ['B'], 1: ['B'], 2: ['B'], 5: ['C'], 6: ['A', 'C'], 7: ['A', 'C'], 8: ['A', 'C', 'B']}
这是预期的结果。下面是帮助我找到正确结果的图表: