找到具有n个玩家和m个参与者匹配的组的匹配的算法

时间:2015-01-29 00:27:18

标签: algorithm combinatorics schedule

我有以下问题:

  

一组n名球员想要进行一系列比赛。每场比赛都有m   参与者。我想找到一个游戏数量最少的时间表   每个玩家至少与其他玩家见面一次,最多一次   各种各样的对手。

经过一番研究后,我发现“社交高尔夫球手问题”似乎是一个类似的问题,但我找不到一个可以适应的解决方案,也无法找到自己的解决方案。

2 个答案:

答案 0 :(得分:0)

伪代码(假设玩家内部有标志):

function taking array of players (x) and players per game (y) {
    array of players in this game (z)
    for each player (t) in x {
        if z.length == y {break out of loop}
        check the flag of each player in (t), if the flag is not set {
            check if z.length is less than y {
                set flag and add it to array z
            }
        }
    }
    if z.length is less than 2, change the players in z's flags back to false
    return (if z.length == 3, return z, or else return false);
}

从玩家A开始; (假设球员A到F,每场比赛3名球员)

通过从上到下,我们可以消除可能性。从每个人玩所有其他玩家开始(他们还没有玩过,所以例如B跳过C,因为B在ABC中用C玩)(以3组为一组)。我们可以编写一个函数来执行此操作(请参阅顶部的psuedocode)

A B C (save this game to a list of games, or increment a counter or something)
A D E
A F -missing (returned false so we did not save this)
B D E 
B F -missing
C D E
C F -missing 
D E F

现在,几乎所有的球员都互相比赛,如果你只计算3个组。这是迄今为止的5场比赛。删除我们已经计算过的游戏,结果

A F -missing
B F -missing
C F -missing

这里有什么共同点?他们都有F.这意味着F必须扮演这个列表中的每个人,所以我们需要做的就是把F放在前面。

我们现在可以做F A B,然后是C F +任何随机玩家。这是至少7场比赛。

基本上,您可以反复运行伪代码,直到它连续两次返回false。如果连续两次返回false,则表示已设置所有标志。

答案 1 :(得分:0)

这可能不是一个完整的解决方案,但是......考虑一个带有n个节点的图表。可以通过在每轮中将m边放入图表来表示与m-1玩家的匹配。要求每位玩家至少与其他玩家见面一次,这意味着您将在经过一定数量的游戏后获得complete graph

对于round(match)1,放置一组m-1个任意边。对于下一轮,请放置当前未连接两个节点的m-1条边。重复,直到图表完成。

编辑:需要连接边缘以确保只有m玩家匹配m-1边缘,这会使这更难一些。如果你在完整的图形中走完每一轮,问题就像找到完整图形的最短步行一样。 This answer对于另一个问题可能是相关的,并建议Floyd-Warshall algorithm