为瑞士锦标赛创造成对

时间:2016-09-12 09:47:34

标签: java algorithm graph match

我正在尝试创建一个瑞士锦标赛生成器,如果他们有相同的分数或者与其他可能的对相比得分最接近,那么我就会陷入玩家彼此配对的部分,除非他们有在前几轮已经面对面了。

我听说这可以被建模为图形问题,其中每个玩家都是与每个其他顶点连接的顶点,除非这对玩家已经互相玩过。对每个边缘进行加权,使得重量越高,该对应该匹配得越不合适。然后,对于每对|wins(a) - wins(b)|,它与权重{a, b}的边缘成为最小成本最大匹配问题。

我一直在关注我认为适用于加权和未加权图表的Edmund's Blossom algorithm。我一直在寻找Java实现,但我只在非加权图上找到解决方案,或者在Java中找不到我难以理解的实现。 The closest thing I've found is this但不考虑加权边缘

1 个答案:

答案 0 :(得分:0)

做两件事:

  1. 跟踪所有玩家i玩家已经玩过的玩家。

  2. 跟踪有序集中每位玩家的得分。

  3. 我们知道要找到任意2个玩家之间的最小差异,它必须是订购时2个相邻分数之间的差异之一。例如,我们有分数:

    1 2 4 7 9 10
    

    任何2个相邻分数之间的最小差异必须是以下对中的一个:

    {1,2} {2,4} {4,7} {7,9} {9,10}
    

    所以你能做的就是:

    1. 通过可用的玩家按顺序(升序或降序)进行迭代。

    2. 在每个玩家中,检查下一个玩家(按顺序)是否已经玩过2个。

      2a上。如果有,请转到下一个。

      2B。如果他们没有,将2对并从集合中删除(或标记它们以便以后的检查不使用相同的玩家)。