有一项任务需要每天由两个人执行,并且有一组人员可用。
我们的想法是为每个可能的组合分配至少一次的方式为这些任务分配两个不同的人。
另外,理想情况下,任何特定的人都应尽可能远离上一个指定日期。
示例:
鉴于团队:A,B,C,D,E,F
任务的时间表可以是:
Day 1 = A, D
Day 2 = B, E
Day 3 = C, F
Day 4 = A, E
Day 5 = B, F
Day 6 = C, D
Day 7 = A, F
Day 8 = B, D
Day 9 = C, E
Day 10 = E, D
Day 11 = B, E
Day 12 = C, A
...
请注意,相同的字母与前一次分配一定距离。例如,A被分配到第1,4,7,12天,D被分配到第1,6,8,10天。 另请注意,所有可能的组合都存在。
目前,我可以“手动”为小型团队(6到8人)组合和分类,但对于大型团队,我无法提出算法。
是否有可以帮助我的算法?
奖励积分:
任何时候,一个人都可能变得“不活跃”,所以他应该被遵守规则的其他人所取代。
非常感谢!
答案 0 :(得分:2)
Wikipedia上描述的以下循环调度算法解决了问题的非奖励部分。这个想法是像
一样配对0 1 2 3 4
5 6 7 8 9
获取成对05 16 27 38 49
,然后顺时针旋转0
0 5 1 2 3
6 7 8 9 4
获取对06 57 18 29 34
,然后重复
0 6 5 1 2
7 8 9 4 3
等。虽然这个算法是为平行的循环赛而设计的,但它恰好具有这样的特性:由于顺时针旋转不会将任何元素水平移动很远,因此每个特定数字的出现之间的间隙是相当一致的。
要回答您的红利问题,我建议您尝试使用本地搜索功能 - 随机中断不会让任何提前组合解决方案正常运行。
答案 1 :(得分:1)
我的方法是这样的。
这样,很容易消除与缺席成员的对,您只需将其从可能的对列表中排除。当有人回来时,他们可能会成为下一个,因为到目前为止,他们的任务最少。这应该使工作量保持尽可能接近平衡。
它可能不如循环可预测,但它确实更好地处理计划队列的随机扰动。它也较慢,因为它对每个选择都是线性的,循环法做所有事情,并且选择是不变的,但我想这是可以接受的。
Skeleton python代码:
pairs
要说明缺席的团队成员,您必须过滤传递给pick_pair
的{{1}}。