Hes*_*ese 0 algorithm math schedule tournament sports-league-scheduling-problem
假设有 8 名选手参加沙滩排球比赛。比赛以2对2的方式进行。
作为组织者,我想按照以下规则为玩家生成时间表:
因此,时间表将开始例如:
round 1
player1 + player2 vs player3 + player4
player5 + player6 vs player7 + player8
round2
player1 + player3 vs player2 + player5
player4 + player7 vs player6 + player8
round3
player1 + player4 vs player2 + player3
player5 + player8 vs player6 + player7
etc
Run Code Online (Sandbox Code Playgroud)
通过上面的例子,让我们考虑一下player1。他一直在与玩家 (2,3,4) 一起玩,所以他还有与玩家 (5,6,7,8) 一起玩的比赛
他曾对阵:
Player3 (twice)
Player4
Player2 (twice)
Player5
Run Code Online (Sandbox Code Playgroud)
因此,剩下的 4 场比赛(对于玩家 1)应该与玩家 5、6、7、8 一起进行,并且对手不能是玩家 3 或玩家 2(因为您已经与这些玩家玩过两次)
我在这里看到了很好的例子如何自动生成体育联赛时间表和关于循环赛的维基百科文章https://en.wikipedia.org/wiki/Round-robin_tournament(理查德·舒里格(Richard Schurig)(1886)的配对表的原始构建)有效生成比赛很好,但这样就会有超过两场针对某些玩家的比赛。
我真的很感谢任何帮助!
是的,这可以借助有限域 F 8来完成。我们用 F 8的元素之一来识别每个玩家。令t和为 F 8p的任何不同的非零元素。在F 8 \xe2\x88\x96 {0}(七个元素)的回合中,玩家有+作为队友,并且+和+ +rrxxr txr pxr pr t作为对手。
由于x+ r t+ r t=x和x+ r p+ r t+ r t= x+r p在特征为 2 的场中,因此每一轮中的每个玩家都只有一个队友,并且他们的两个对手都是队友。对于一对玩家x和y,他们成为队友的回合是唯一确定的,因为方程x+ r t= y(相当于x= y+ r t)只有一个解。类似的推理说明了为什么每个玩家都在两轮比赛中与其他玩家对抗。
F8 = {\n (0, 0, 0): "a",\n (1, 0, 0): "b",\n (0, 1, 0): "c",\n (1, 1, 0): "d",\n (0, 0, 1): "e",\n (1, 0, 1): "f",\n (0, 1, 1): "g",\n (1, 1, 1): "h",\n}\n\n\ndef f8_times(p, q):\n pq = (\n p[0] & q[0],\n (p[0] & q[1]) ^ (p[1] & q[0]),\n (p[0] & q[2]) ^ (p[1] & q[1]) ^ (p[2] & q[0]),\n (p[1] & q[2]) ^ (p[2] & q[1]),\n p[2] & q[2],\n )\n return (pq[0] ^ pq[3], pq[1] ^ pq[3] ^ pq[4], pq[2] ^ pq[4])\n\n\nfor a in F8:\n if any(a):\n print("{}{} vs {}{}; {}{} vs {}{}".format(*(F8[f8_times(a, b)] for b in F8)))\nRun Code Online (Sandbox Code Playgroud)\n输出:
\nab vs cd; ef vs gh\nac vs eg; db vs hf\nad vs gf; he vs bc\nae vs dh; gc vs fb\naf vs be; ch vs dg\nag vs hb; fd vs ce\nah vs fc; bg vs ed\nRun Code Online (Sandbox Code Playgroud)\n