我为锦标赛制作了赛程。每支球队应该打8场比赛。团队数量2< n< 36
为了将团队分成对,我使用循环算法来获得一个表,例如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个游戏。但如果不可能,请尽量减少例外情况。
新算法示例:
答案 0 :(得分:1)
我会尝试开始回答这个问题的方法。如果被问到,我可以将其保留为社区维基,以便人们可以进行编辑以改进此答案。
Wikipedia Round-robin Tournament Scheduling Algorithm
让我们从8支球队的情况开始。 [T 1 ,T 2 ,T 3 ,T 4 ,T 5 ,T 6 ,T 7 ,T 8 ]
让我们试着像这样看待这个问题。
T 1 T 2 T 3 T 4
T 5 T 6 T 7 T 8
所以,现在。匹配 - > [(1,5),(2,6),(3,7),(4,8)]。
顺时针旋转列表,但保持T 1 的位置固定。
T 1 T 5 T 2 T 3
T 6 T 7 T 8 T 4
所以,现在。匹配 - > [(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次轮换。 < / p>
这种方法相应地确保,在给予足够数量的球队的情况下,同一支球队将不会重新开始比赛。
修改即可。
让我们从3支球队的情况开始。 [T 1 ,T 2 ,T 3 ]
让我们试着像这样看待这个问题。
T 1 T 2
T 3 X
所以,现在。匹配 - &gt; [(1,3),(2,X)]。
顺时针旋转列表,但保持T 1 的位置固定。
T 1 T 3
X T 2
所以,现在。匹配 - &gt; [(1,3), (2,X)
,(1,X),(3,2)]。
下一个案例,匹配 - &gt; [(1,3), (2,X), (1,X), (3,2)
,(1,2),(X,3)]。
下一个案例,匹配 - &gt; [(1,3), (2,X), (1,X), (3,2), (1,2), (X,3)
,(1,3),(2,X)]。
...
匹配 - &gt; [(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 - &gt; [3,X,2
,3,X,2
,3,X,2
,3,X,2
]
2 - &gt; [X,3,1
,X,3,1
,X,3,1
,X,3,1
]
3 - &gt; [1,2,X
,1,2,X
,1,2,X
,1,2,X
]
如果你注意到这种模式,你会发现在这些情况下,不可能确保球队不参加背靠背比赛。它需要12次轮换才能让每支球队打8场比赛。我想提出一个公式,并相应地更新这篇文章。