对具有非重复 | 的团队进行排序循环赛

Sorting pairs of teams with non-repeating | Round-robin tournament

我正在为比赛制定时间表。每支球队应该正好打 8 场比赛。队伍数量 2 < n < 36

为了将团队分组,我使用循环算法来获得 table,例如 6 个团队:

然后我把它转换成对的集合:

1   4
2   3
3   2
4   1
5   6
6   5
1   2
2   1
3   5
4   6
5   3
6   4
...

问题是如何对这组比赛进行排序,以便获得赛程表,同一支球队不能连续打 2 场比赛。但如果这是不可能的,尽量减少例外的数量。


新算法示例:

我将尝试开始一种方法来回答这个问题。如果被问到,我可以将其保留为 社区维基 ,以便人们可以进行编辑以改进此答案。

Wikipedia Round-robin Tournament Scheduling Algorithm

先从8队的情况说起。 [T1, T2, T3, T4, T5, T6, T7, T8]

让我们试着这样看待这个问题..

T1 T2 T3 T4
T5 T6 T7 T8

所以,现在。匹配 -> [(1,5), (2,6), (3,7), (4,8)].

顺时针旋转列表,但保持T1的位置固定。

T1 T5 T2 T3
T6 T7 T8 T4

所以,现在。匹配 -> [(1,5), (2,6), (3,7), (4,8), (1,6), (5,7), (2,8), (3,4)].

在这种情况下,在复制开始之前将有 7 次可能的旋转。在传统的循环赛中,有 (n/2)*(n-1) 场比赛,其中 n 是球队的数量。无论涉及多少团队,这都应该有效。 [如果遇到n%2 == 1,放一个X,使集合均匀,照常继续;一支球队将缺席一场比赛。

如果需要保证每队必须打8场比赛,则正好8轮队数是偶数。

这种方法相应地确保,如果有足够数量的球队,相同的球队将不会背靠背比赛。

编辑

让我们从 3 个团队的案例开始。 [T1, T2, T3]

让我们试着这样看待这个问题..

T1 T2
T3 X

所以,现在。匹配 -> [(1,3), (2,X)].

顺时针旋转列表,但保持T1的位置固定。

T1 T3
X T2

所以,现在。匹配 -> [(1,3), (2,X), (1,X), (3,2)].

下一个案例,匹配 -> [(1,3), (2,X), (1,X), (3,2), (1,2), (X,3)].

下一个案例,匹配 -> [(1,3), (2,X), (1,X), (3,2), (1,2), (X,3), (1,3), (2,X)].

.....

匹配 -> [(1,3), (2,X), (1,X), (3,2), (1,2), (X,3)(1,3), (2,X), (1,X), (3,2), (1,2), (X,3)(1,3), (2,X), (1,X), (3,2), (1,2), (X,3)(1,3), (2,X), (1,X), (3,2), (1,2), (X,3)(1,3), (2,X), (1,X), (3,2), (1,2), (X,3)].

1 -> [3,X,2,3,X,2,3,X,2,3,X,2]
2 -> [X,3,1,X,3,1,X,3,1,X,3,1]
3 -> [1,2,X,1,2,X,1,2,X,1,2,X]

如果你注意到这种模式,你会发现在这些条件下,不可能确保球队不进行背靠背比赛。需要轮换 12 次才能让每支球队打完 8 场比赛。我正在尝试想出一个公式,并将相应地更新此 post。