匹配顺序算法

时间:2011-04-28 10:50:01

标签: algorithm optimization combinatorics

背景

我参与的一个体育俱乐部向我寻求帮助,为即将到来的比赛提供一些IT支持。

比赛由球队组成,其中确切的数字在比赛日之前不一定知道。因此需要软件帮助。

所有团队将在许多匹配中与其他所有团队见面。因此,匹配的数量是 N over 2 (2的所有组合),其中N是团队的数量。

我们有一个未知数量的可用法院来玩比赛。可能这个数字将是1或可能是2,但我想要一个普遍的解决方案。

比赛将进入转弯。在每次转弯时,每个球场会有一场比赛。

例如,如果有两个球场和五个球队(A,B,C,D,E),转弯布局可能如下所示:

Turn      Court 1     Court 2
--------------------------------
 1        A vs B      C vs D
 2        A vs C      D vs E
 3        A vs D      B vs E
 4        B vs D      C vs E
 5        A vs E      B vs C

问题

因此,我的问题是找到一个生成一组符合以下简单规则的转弯的算法:

  1. 所有球队在比赛期间必须与其他所有球队一次见面。
  2. 一支球队不能在同一回合比赛中进行两场比赛(即不能在第一和第二场比赛中同时比赛)
  3. 特定球队的转变应该在整个比赛中展开。
  4. 详细规则3

    规则1和2非常简单,我已经有了解决方案。规则3给了我一些问题。我会尝试展示它的含义:

    假设我有5支球队(如上所述)但只有1支球队。超过10回合有10场比赛。 一种可能的布局是

    Turn   Court 1
     1     A vs B
     2     A vs C
     3     A vs D
     4     A vs E
     5       .
     .       .
     .       .
     10      .
    

    在这种情况下,A打前四场比赛是不公平的,因为他们没有机会在比赛之间恢复精力。 这是我想要避免的。

    想法?

2 个答案:

答案 0 :(得分:5)

一个简单的贪婪解决方案,每个团队都有疲劳价值。

首先,所有球队的疲劳都设置为0.在转弯nr 1,为不同的球场执行初始比赛,并为这些球队设定与当前回合相同的疲劳值(首先是1)匹配)。

反过来,nr 2选择那些没有相互比较并且与之匹配的疲劳程度最低的队伍(通过保持队伍在优先队列中)。将疲劳值设置为当前转弯值。

举个例子,你会得到:

Turn     Court 1   Team:fatigue
0           -      A:0 B:0 C:0 D:0 E:0
1        A vs B    C:0 D:0 E:0 A:1 B:1
2        C vs D    E:0 A:1 B:1 C:2 D:2
3        E vs A    B:1 C:2 D:2 E:3 A:3
4        B vs C    D:2 E:3 A:3 B:4 C:4
5        D vs E    A:3 B:4 C:4 D:5 E:5
6        A vs C    B:4 D:5 E:5 A:6 C:6 // Dont match A with B since they already played, jump to team C
.

让新球队始终保持领先。既然你可能不会有超过100支球队,那就足够了。

答案 1 :(得分:1)

懒惰的方法是使用您当前的解决方案,然后将时间段(演示文稿中的行)随机化X次,同时跟踪一些疲劳标准并存储到目前为止找到的最佳解决方案。通过其他解决方案,您需要小心,您可以充分利用所有法院。