我正在尝试创建一个瑞士锦标赛生成器,如果他们有相同的分数或者与其他可能的对相比得分最接近,那么我就会陷入玩家彼此配对的部分,除非他们有在前几轮已经面对面了。
我听说这可以被建模为图形问题,其中每个玩家都是与每个其他顶点连接的顶点,除非这对玩家已经互相玩过。对每个边缘进行加权,使得重量越高,该对应该匹配得越不合适。然后,对于每对|wins(a) - wins(b)|
,它与权重{a, b}
的边缘成为最小成本最大匹配问题。
我一直在关注我认为适用于加权和未加权图表的Edmund's Blossom algorithm。我一直在寻找Java实现,但我只在非加权图上找到解决方案,或者在Java中找不到我难以理解的实现。 The closest thing I've found is this但不考虑加权边缘
答案 0 :(得分:0)
做两件事:
跟踪所有玩家i
玩家已经玩过的玩家。
跟踪有序集中每位玩家的得分。
我们知道要找到任意2个玩家之间的最小差异,它必须是订购时2个相邻分数之间的差异之一。例如,我们有分数:
1 2 4 7 9 10
任何2个相邻分数之间的最小差异必须是以下对中的一个:
{1,2} {2,4} {4,7} {7,9} {9,10}
所以你能做的就是:
通过可用的玩家按顺序(升序或降序)进行迭代。
在每个玩家中,检查下一个玩家(按顺序)是否已经玩过2个。
2a上。如果有,请转到下一个。
2B。如果他们没有,将2对并从集合中删除(或标记它们以便以后的检查不使用相同的玩家)。