Algorithm 为成对工作的人员安排轮班
我会以人们结对工作的方式安排轮班。Algorithm 为成对工作的人员安排轮班,algorithm,optimization,scheduling,approximation,Algorithm,Optimization,Scheduling,Approximation,我会以人们结对工作的方式安排轮班。 1.主要的限制是,每个人不应与上一班工作过的人一起工作。 2.轮班时间没有限制,我只需要一天配一对 例如,如果{A,B..F}代表人,那么 第一天:A-B 第2天:C-D 第3天:E-F 第四天:A-B你的问题没有明确说明,导致了琐碎的解决方案。例如,选择任意三个人,{A,B,C},并安排AB,AC,BC(重复) 如果你想要一个更公平的解决方案:每天随机挑选一对,直到找到一对。最多有N个不可行对和N(N-1)/2个可能对 这里有一种方法: import ran
1.主要的限制是,每个人不应与上一班工作过的人一起工作。
2.轮班时间没有限制,我只需要一天配一对 例如,如果{A,B..F}代表人,那么
第一天:A-B 第2天:C-D 第3天:E-F
第四天:A-B你的问题没有明确说明,导致了琐碎的解决方案。例如,选择任意三个人,{A,B,C},并安排AB,AC,BC(重复) 如果你想要一个更公平的解决方案:每天随机挑选一对,直到找到一对。最多有N个不可行对和N(N-1)/2个可能对 这里有一种方法:
import random
def schedule(folk):
excluded = dict((p, None) for p in folk)
while True:
while True:
a, b = random.sample(folk, 2)
if excluded[a] != b and excluded[b] != a:
break
excluded[a], excluded[b] = b, a
yield a, b
for a, b in schedule('ABCDE'):
print '%s%s' % (a, b),
为什么不干脆配对呢?(假设人数是偶数,对于奇数也可以这样做)难道你不能生成一个所有配对组合的列表,然后按你喜欢的顺序排序吗?听起来你觉得这应该很复杂。这有点像安排一场循环赛。这比实际情况要复杂得多。就像网球俱乐部的日程安排一样,你每天有2个球员名额,你甚至可能想要分配公平(每个人都必须和其他人一样轮班工作)和对抗公平(每个人都必须和其他人一起工作大约相同的次数)。然后再加上一个具体的硬约束,即对于一个人工作的每一个班次,该人的上一个班次不应该与同一个同事在一起。是的,非常相似