我有以下问题:
一组n名球员想要进行一系列比赛。每场比赛都有m 参与者。我想找到一个游戏数量最少的时间表 每个玩家至少与其他玩家见面一次,最多一次 各种各样的对手。
经过一番研究后,我发现“社交高尔夫球手问题”似乎是一个类似的问题,但我找不到一个可以适应的解决方案,也无法找到自己的解决方案。
答案 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。