Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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_Duplicates_Combinations_Permutation - Fatal编程技术网

Algorithm 将任务分配给人员的算法,其中某些任务需要多人执行,并且没有人将同一任务执行两次

Algorithm 将任务分配给人员的算法,其中某些任务需要多人执行,并且没有人将同一任务执行两次,algorithm,duplicates,combinations,permutation,Algorithm,Duplicates,Combinations,Permutation,我的一位教师朋友让我编写一个程序,帮助他们为学生分配课堂作业。有23个孩子和12种不同的工作类型,有些工作需要多个孩子,总共23个可用的职位。每周他们都想随机给孩子们分配新的工作,只要有可能,没有一个孩子做同一份工作超过一次 我的思考过程是按照这条规则为孩子们分配所有可能的工作,然后一步一步地完成结果。但我很难想出一个实用的算法来生成这些作业组合 如果有人有任何解决方案的想法,或者可以让我知道我正在追求一个不可能的,我将不胜感激 我已经粘贴了所有的工作以及每个工作需要多少孩子,以防有用 “出席人

我的一位教师朋友让我编写一个程序,帮助他们为学生分配课堂作业。有23个孩子和12种不同的工作类型,有些工作需要多个孩子,总共23个可用的职位。每周他们都想随机给孩子们分配新的工作,只要有可能,没有一个孩子做同一份工作超过一次

我的思考过程是按照这条规则为孩子们分配所有可能的工作,然后一步一步地完成结果。但我很难想出一个实用的算法来生成这些作业组合

如果有人有任何解决方案的想法,或者可以让我知道我正在追求一个不可能的,我将不胜感激
我已经粘贴了所有的工作以及每个工作需要多少孩子,以防有用

“出席人数”:1,
“餐桌队长”:4,
“教师助手”:2,
“板擦”:2,
“灯光开关”:1,
“图书管理员”:2,
“午餐助手”:1,
“设备经理”:3,
“垃圾监视器”:2,
“技术专家”:1,
“送纸人”:3,

“卷笔刀”:1

这是一个简单的贪婪算法,没有任何保证:

创建一个示例,其中学生是一个集合中的节点,任务槽是另一个集合中的节点

现在,我们为可行的作业在学生和节点之间创建边。起初,这些都是问题。一旦我们有了这个图,我们就可以计算出一个随机变量。为此,请从随机边开始。查看两个事件节点是否都没有分配,并修复该分配。如果其中一个节点具有指定,请转到下一条随机边

这将给你一个随机分配。让我们看看下周会发生什么:

我们需要修改图形以排除那些会产生重复任务的边。一旦我们删除了这些边,我们可以再次做同样的事情,并计算一个随机的完美匹配


最终,您将得到一个无法完成匹配的配置。这可能有两个原因:要么选择的边不好,要么图形不允许完美匹配。要纠正第一个原因,您可以使用不同的随机选择多次运行相同的方法(例如,十次)。它不会给你确定性,但它减少了错误选择的可能性。第二个原因有点棘手。这将在几周后发生,因为我们没有任务了,所以必须进行重复。为此,我们可以添加一些边。要添加哪些边是非常可变的,这取决于系统所需的行为。我将首先为需要最多人员的任务添加所有边。其中,从重复次数最少的人的边缘开始。添加这些边后,再次尝试找到完美匹配。如果仍然不成功,请添加更多边,再试一次,依此类推。

让我们首先找到一些可能答案的常识边界:

  • 如果有M个任务,并且不允许孩子重复任务,那么作业不能超过M个,因为M+1个作业必须重复M个以前的作业中的一个。因此,生成M个有效的、不重复的赋值是初始上限

  • 初始的、有效的任务分配可以通过获取人员列表(按任何给定顺序)、任务列表(按任何给定顺序),然后简单地用人员填充任务,直到所有人员都已满。注意,给定通过此方法生成的有效分配,所有其他有效分配都可以通过人员列表的排列生成

  • 由于有些任务需要多人执行,因此如果没有重复的任务,这些任务是最难完成的。例如,如果有4个人(
    a
    b
    c
    d
    )和3个任务(
    x
    y
    z
    ),其中x需要2个人,而
    y
    z
    只需要1个,那么在某人被迫重复一项工作之前,只有2个有效的任务,而不是3个:
    x:a&b,y:c,z:d
    x:c&d,y:a,z:b
    (或等效的
    x:c&d,y:b,z:a
    )。因此,有效连续任务的最大数量的更严格界限是
    ceil(| P |/Tm)
    ,其中
    Tm
    是最密集的任务所需的人员数量,
    P
    是人员总数。对于M个任务,M个有效分配的上界只能在所有任务只占用1人的情况下实现

现在,对于一个简单的算法:

sort all persons into a list P; random is fine       
   persons in P have an initially empty list of tasks that they have carried out
sort all tasks into a list T; random is fine
generate a valid assignment as follows:
   for each task Ti in T,
       for t = Ti (the number of people required to staff the i-th task), and t>0
           for each person Pj in P, starting from the last-assigned person,
               if Pj has never performed Ti, and has no task for the current day,
                   add Ti to Pj's tasks, and decrement t
               otherwise, skip Pj; if everybody is so skipped, then exit
在上述伪代码的末尾,每个人都将有一个他们希望在连续的每一天完成的任务列表。有些任务可能比其他任务多1个,因此生成的有效工作分配数是最短任务列表的长度。该算法的运行时间明显受到O(vnm)的限制,其中
v
是返回的有效连续分配数,其本身在v*n下-因此对于少量人员和任务,这应该相对较快

ceil(23/4)=5,因此你的学生必须在5天后开始重复工作。在JavaScript中实现上述算法提供了一个有效的(并且根据上面的观察,是最大的)时间表:

//初始化任务
让任务=新地图([
[“出席”,1],
[“餐桌队长”,4],
[“教师助手”,2],
[“黑板擦”,2],
[“灯光开关”,1],
[“图书管理员”,2],
[“午餐助手”,1],
[“设备经理”,3],
[“垃圾监视器”,2],
[“技术专家”,1],
[“送纸人”,3],
[“卷笔刀”,1]
]);
//通过计算所有任务的人手总数来初始化人员
让totalPeople=0;
对于(让p为tasks.values())totalPeople+=p;
0 "Attendance": 1,
1 "Table Captain": 4,
2 "Teacher's Helper": 2,
3 "Board Eraser": 2,
4 "Light Switcher": 1,
5 "Librarian": 2,
6 "Lunch Helper": 1,
7 "Equipment Manager": 3,
8 "Trash Monitor": 2,
9 "Tech Specialist": 1,
# "Paper Passer": 3,
$ "Pencil Sharpener": 1
 job    0 1 1 1 1 2 2 3 3 4 5 5 6 7 7 7 8 8 9 # # # $
week 1  a b c d e f g h i j k l m n o p q r s t u v w
week 2  t u v w a b c d e f g h i j k l m n o p q r s
week 3  p q r s t u v w a b c d e f g h i j k l m n o
 job    0 # 1 1 1 1 2 5 3 4 7 2 8 5 6 7 3 7 # 8 9 # $
week 1  a b c d e f g h i j k l m n o p q r s t u v w
week 2  t u v w a b c d e f g h i j k l m n o p q r s
week 3  p q r s t u v w a b c d e f g h i j k l m n o