为成对工作的人安排班次

时间:2014-09-11 22:35:28

标签: algorithm optimization scheduling approximation

我会按照人们成对的方式安排轮班 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。 步骤将是:

  1. 随意地使用对(明显地尊重成本)
  2. 创建一对新对(i,j):取具有最高适应度的元素(人)i和具有第二高适应度值的元素j,使得T(j)!= T(i)。 (每次都不要确保不同的一对)
  3. 更新
  4. 有更好的方法可以解决问题吗? 文献中有类似内容,我可以咨询一下吗?像例子中的类似问题一样? 护士是否有类似的问题?

    谢谢。

1 个答案:

答案 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),
相关问题