我希望能够产生一组比赛,使每个球员面对对方球员至少一次,每个球员玩相同数量的游戏把它看作是对马里奥卡丁车循环赛的抽象。
在我的情况下,我有17名选手,希望他们在3或4名选手的回合中比赛。我想有一种生成S的方法,一组P(players)的子集,使得P的每个元素与P的其他元素一起出现在S的至少一个元素中。
起初我以为一个平衡的比赛设计可以解决这个问题,但它似乎没有任何方法来匹配每轮多个参赛者,只是为每对选手多个附加的对决。
这也有点像一个精确的封面问题,但不完全是。
这也适用于四人棋、冰屋、各种纸牌和骰子游戏等。

最佳答案

我刚刚为此创建了一个算法,但它确实有它的缺点。如果p是玩家的数量,c是每个游戏中的参赛者的数量,那么我的算法只是创建一个c大小的数组,在这个数组中我保留当前游戏中每个玩家的索引。
我首先用尽可能低的索引填充数组,其中每个索引仍然大于前一个索引([1,2,3])。在每一轮中,我从数组的后面开始,尝试增加玩家索引。当我触到界外时,我向左移动一步,递增玩家索引,并将以下所有玩家设置为其可能的最低值,同时仍保持每个索引大于上一个索引。
所以每轮5名选手和3名辩手

[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 4] <- could not increase 3rd position, increase 2nd position
[1, 3, 5]
[1, 4, 5] <- could not increase 3rd position, increase 2nd position
[2, 3, 4] <- could not increase 3rd or 2nd position, increase 1st position
[2, 3, 5]
[2, 4, 5] <- could not increase 3rd position, increase 2nd position
[3, 4, 5] <- could not increase 3rd or 2nd position, increase 1st position
---------
could not increase any position -> done

这方面的问题是显而易见的;玩家并不是公平地分布在各个游戏中,而是许多玩家必须连续玩不必要的游戏(特别是,玩家1连续玩他/她的所有游戏,然后必须等待剩余的比赛)。
虽然这应该可以解决你目前定义的问题,但我也希望有一个更好的方法来提高公平性(每个玩家的连续游戏更少)。

关于algorithm - 对于超过两个参赛者的回合,哪种算法可以生成轮回“配对”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24332311/

10-11 18:46