我会按照人们成对的方式安排轮班 1.主要限制因素是,每个人不应与前一班次工作的人一起工作 2.对于轮班时间没有限制,我只需要配对一天。
例如,如果代表人的{A,B ... F}则为 第1天:A-B 第2天:C-D 第3天:E-F 第4天:A-B <---错误,因为违反了(1.)
我的解决方案是:
定义适应度函数T,那么如果A今天工作则T(A)等于0或者如果A在c天前最后一次工作则T(A)= c。
步骤将是:
有更好的方法可以解决问题吗? 文献中有类似内容,我可以咨询一下吗?像例子中的类似问题一样? 护士是否有类似的问题?
谢谢。
答案 0 :(得分:1)
您的问题未明确,导致无关紧要的解决方案。例如,选择任意三个人{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),