Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为成对工作的人员安排轮班_Algorithm_Optimization_Scheduling_Approximation - Fatal编程技术网

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个球员名额,你甚至可能想要分配公平(每个人都必须和其他人一样轮班工作)和对抗公平(每个人都必须和其他人一起工作大约相同的次数)。然后再加上一个具体的硬约束,即对于一个人工作的每一个班次,该人的上一个班次不应该与同一个同事在一起。是的,非常相似