我正在使用 Python 开发一个瑞士锦标赛系统,并且正在尝试找出最佳配对算法。
我最大的问题是,我提出的每个算法都会在几个序列中产生错误,其中最后一个被选中的对已经互相玩了,裁定配对无效。
我正在研究的瑞士系统很简单:即使是球员,每个人都在每一轮比赛,并且根据获胜的距离进行配对(所以强者对抗强者,弱者对抗弱者)。
No Bye,只有赢/输(没有平局),对手不能互相比赛两次。
我所做的当前算法如下:
- 按排名顺序生成玩家列表(最多获胜到最少获胜)
- 选择玩家,从获胜最多的玩家开始
- 将他与排名最接近的玩家匹配。如果他们已经玩过,将他与下一个匹配,直到找到匹配
- 将这对从列表中弹出并返回到 1
例如:
2轮后的排名:
1. P1: [P2 win, P3 win] 2 wins
2. P5: [P6 win, P2 win] 2 wins
3. P3: [P4 win, P1 lost] 1 win, 1 loss
4. P4: [P6 win, P3 lost] 1 win, 1 loss
5. P2: [P1 lost, P5 lost] 2 losses
6. P6: [P5 lost, P4 lost] 2 losses
第一个选择是 P1,第一个匹配是 P5。将 (P1,P5) 从列表中取出。
1. P3: [P4 win, P1 lost] 1 win, 1 loss
2. P4: [P6 win, P3 lost] 1 win, 1 loss
3. P2: [P1 lost, P5 lost] 2 losses
4. P6: [P5 lost, P4 lost] 2 losses
第一个选择是 P3,已经玩过 P4,所以比赛是 P2。将 (P3,P2) 从列表中删除。
在这个序列中,我以一对相互对战并且配对无效:
1. P4: [P6 win, P3 lost] 1 win, 1 loss
2. P6: [P5 lost, P4 lost] 2 losses
问题:是否有任何算法可以保证最佳配对模块,同时确保我不会在最后被两个互相玩的玩家“卡住”?