选择随机对的算法,安排对决

时间:2012-02-27 00:55:12

标签: ruby algorithm

我在Ruby工作,但我认为这个问题最好被问及语言不可知。可以假设我们可以访问基本列表/数组函数,以及“随机”数字生成器。这是我希望能够做到的:

给定n个团队的集合,n偶数,

  1. 随机将每支球队与对手配对,这样每支球队都只有一对。请拨打此ROUND 1
  2. 随后生成n-2个后续轮次(ROUND 2ROUND n-1),以便:
    • 每一轮都有与第一轮相同的属性(每支球队都是一支球队 一对成员)和
    • 在所有轮次之后,每支球队都只面对其他球队一次。
  3. 我认为完全做到这一点的算法必须众所周知,但作为一个自学成才的编码器,我无法弄清楚如何找到它们。

4 个答案:

答案 0 :(得分:2)

我相信你在描述round robin tournament。维基百科页面给出了算法。

如果您需要一种方法来随机化计划,随机化团队订单,循环订单等

答案 1 :(得分:1)

不确定这是否是最有效的算法,但是:

  1. 随机将N队分配到两个长度相同的队列n / 2(List1,List2)
  2. 从i = 0开始:
  3. 创建对:List1 [i],List2 [i] =团队对
  4. 重复i = 1-> (N / 2-1)

    对于第2轮> n / 2-1:

  5. 旋转List2,以便List2中的第一个团队现在结束。
  6. 重复步骤2到5,直到List2循环一次。

答案 2 :(得分:1)

上次我编写循环调度算法时,这个链接对我很有帮助。它包括用于循环配对的第一个拟合算法的C实现。

http://www.devenezia.com/downloads/round-robin/

除了算法之外,他还有一些有用的链接指向锦标赛安排的其他方面(平衡主场和客场比赛,以及跨越场地/球场的轮换球队)。

请注意,在所有情况下,您不一定要在配对中使用“随机”顺序。例如,如果你安排了一场只有6支球队的8场比赛的循环足球联赛,那么每支球队将要两次打两支球队。如果你想为每个人打造一个更加愉快的赛季,你必须开始担心种子问题,这样你就不会让前两支球队在最近两场比赛中击败两支最弱的球队。你最好安排额外的比赛与相似力量/种子队伍配对。

答案 3 :(得分:0)

根据我通过Maniek link找到的信息,我选择了以下内容:

  1. 一个简单的循环算法

    一个。通过压缩[0,...,(n-1)/2][(n-1)/2 + 1,..., n-1]来实现配对。 (因此,如果n==10,我们05配对,16配对,等等。

    湾顺时针旋转除一支球队外的所有球队,直到所有球队互相比赛为止。 (所以在第2轮,我们将1与6对5,5与7对等)

  2. 随机为每个团队分配一个[0,..., n-1]