用于安排人们参加应成对完成的活动的算法

afc*_*ano 2 sorting algorithm combinations scheduling

有一项任务需要每天由两个人执行,并且有一个团队可用。

这个想法是将两个不同的人分配给该任务,每种可能的组合至少分配一次。

此外,理想情况下,应尽可能从前一个分配日开始分配任何特定人员。

例子:

给定球队: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
...
Run Code Online (Sandbox Code Playgroud)

请注意,相同的字母被分配与前一次有一定距离。例如,A 分配给第 1、4、7、12 天,D 分配给第 1、6、8、10 天。另请注意,所有可能的组合都存在。

目前,我可以“手动”对小团队(6 - 8 人)的配对进行组合和排序,但对于较大的团队,我无法想出一种算法。

有什么算法可以帮助我吗?

奖励积分:

在任何时候,一个人都可能变得“不活跃”,因此他应该被遵守规则的其他人取代。

非常感谢!

Dav*_*tat 5

维基百科上描述的以下循环调度算法解决了您问题的非奖励部分。这个想法是配对

0 1 2 3 4
5 6 7 8 9
Run Code Online (Sandbox Code Playgroud)

得到对05 16 27 38 49,然后顺时针旋转,除了0

0 5 1 2 3
6 7 8 9 4
Run Code Online (Sandbox Code Playgroud)

获取对06 57 18 29 34,然后重复

0 6 5 1 2
7 8 9 4 3
Run Code Online (Sandbox Code Playgroud)

尽管该算法是为并行循环赛而设计的,但它恰好具有这样的属性:由于顺时针旋转不会将任何元素水平移动很远,因此每个特定数字出现之间的间隙相当一致。

为了回答你的额外问题,我建议尝试本地搜索——随机中断不可能让任何提前组合解决方案正常工作。