2011-03-14 40 views
2

对于我们参加小组赛(2vs2)的小型扑克锦标赛,我需要创建一个谁打算对谁打比赛的“计划”。搜索一个算法来进行“匹配”

“规则”是:

  • 我们有多个团队,分别由一对选手的。
  • 我们在比赛中有几个“回合”。
  • 回合的数量低于球队的数量。

目标是制定一个计划,在这个计划中,没有一个团队会对另一个团队进行两次打球。

我尝试了回溯的“重”方式,但正如我想的那样,复杂性很大,而且我们很快有大量的可能性来计算,所以我正在寻找一种能够使我成为一个计划的算法很快。

这里是我想要的输出为例,它已经与我的“重道”中产生:

Tournament with 16 teams and 10 rounds 

Round 0 
Team 0 versus Team 1 
Team 2 versus Team 3 
Team 4 versus Team 5 
Team 6 versus Team 7 
Team 8 versus Team 9 
Team 10 versus Team 11 
Team 12 versus Team 13 
Team 14 versus Team 15 

Round 1 
Team 0 versus Team 2 
Team 1 versus Team 3 
Team 4 versus Team 6 
Team 5 versus Team 7 
Team 8 versus Team 10 
Team 9 versus Team 11 
Team 12 versus Team 14 
Team 13 versus Team 15 

Round 2 
Team 0 versus Team 3 
Team 1 versus Team 2 
Team 4 versus Team 7 
Team 5 versus Team 6 
Team 8 versus Team 11 
Team 9 versus Team 10 
Team 12 versus Team 15 
Team 13 versus Team 14 

Round 3 
Team 0 versus Team 4 
Team 1 versus Team 5 
Team 2 versus Team 6 
Team 3 versus Team 7 
Team 8 versus Team 12 
Team 9 versus Team 13 
Team 10 versus Team 14 
Team 11 versus Team 15 

Round 4 
Team 0 versus Team 5 
Team 1 versus Team 4 
Team 2 versus Team 7 
Team 3 versus Team 6 
Team 8 versus Team 13 
Team 9 versus Team 12 
Team 10 versus Team 15 
Team 11 versus Team 14 

Round 5 
Team 0 versus Team 6 
Team 1 versus Team 7 
Team 2 versus Team 4 
Team 3 versus Team 5 
Team 8 versus Team 14 
Team 9 versus Team 15 
Team 10 versus Team 12 
Team 11 versus Team 13 

Round 6 
Team 0 versus Team 7 
Team 1 versus Team 6 
Team 2 versus Team 5 
Team 3 versus Team 4 
Team 8 versus Team 15 
Team 9 versus Team 14 
Team 10 versus Team 13 
Team 11 versus Team 12 

Round 7 
Team 0 versus Team 8 
Team 1 versus Team 9 
Team 2 versus Team 10 
Team 3 versus Team 11 
Team 4 versus Team 12 
Team 5 versus Team 13 
Team 6 versus Team 14 
Team 7 versus Team 15 

Round 8 
Team 0 versus Team 9 
Team 1 versus Team 8 
Team 2 versus Team 11 
Team 3 versus Team 10 
Team 4 versus Team 13 
Team 5 versus Team 12 
Team 6 versus Team 15 
Team 7 versus Team 14 

Round 9 
Team 0 versus Team 10 
Team 1 versus Team 11 
Team 2 versus Team 8 
Team 3 versus Team 9 
Team 4 versus Team 14 
Team 5 versus Team 15 
Team 6 versus Team 12 
Team 7 versus Team 13 
+5

当你不能打n-1场比赛(其中n是球队的数量)时,我总是建议瑞士体系。 http://en.wikipedia.org/wiki/Swiss-system_tournament – xanatos 2011-03-14 20:05:05

回答

3

如果你只是想几个预定回合,随机种子学员,然后应用循环赛。要做到这一点,最简单的方法是为球队这样的安排符号:

A B C D 
E F G H 

所以,在第一轮中,配对是A - EB - F,等等。然后A是固定的,所有其他人顺时针旋转一个地方:

A E B C 
F G H D 

重复。

如果轮次数小于n - 1,我会建议瑞士体系。你可以手工配对,但有许多配对程序已经在那里,有些使用启发式,一些爱德蒙的“开花”最小重量完美匹配算法的变种。

+0

这似乎是完美的,我今天晚上会测试这个! – J4N 2011-03-16 08:51:09

+0

它像一个魅力工作!非常感谢你! – J4N 2011-03-16 18:12:36

0

您可以调整选择排序算法以生成排列。我很久以前就做了这样的事情。请参阅this article的“成对排列”部分。

该代码在Pascal中,但应该很容易转换为C#。