将玩家分配到桌子

时间:2012-10-25 22:38:08

标签: algorithm math random

考虑N = 4k玩家,k表和一些部落,使每个成员都属于一个部落。一个战队最多可以包含k名球员。

我们希望组织3轮游戏,对于每个只能容纳4名玩家的桌子,没有2名玩家坐在那里,同一个战队的一部分,并且,对于后几轮,没有2名玩家坐在那里在同一张桌子前。所有球员都会进行各种比赛。

如果N大约~80大,我们怎样才能有效地做到这一点?

我想到了这个:

for each table T:
  repeat until 4 players have been seated at T:
    pick a random player X that is not currently seated anywhere
    if X has not sat at the same table as anyone currently at T AND
       X is not from the same clan as anyone currently at T
       seat X at T
       break

我不确定这是否会一直完成,或者即使有有效的分配也会卡住。即使这样可行,还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

如果每个氏族总共有k个玩家(即4个氏族),你知道在一个桌子上应该总有一个氏族的人。在这种情况下,我认为有可能提出一些预定义的轮换方案,其中每个玩家,取决于他来自的部落,进一步移动固定数量的桌子。

如果部落的数量超过4个(或者我看不到它,我认为这是不可能的)

我认为你的算法非常好。在保持随机行为的同时,你可以阻止它永远不会终止(如果没有有效的解决方案)的一种方法是不要无限地选择随机播放器,而是将未播放的播放器列表洗牌一次,并处理来自此列表中的每个播放器转:

编辑:我忘了遍历这些轮次,也包括在算法中。

for each round R in {1, 2, 3}
  for each table T:
    UP = a randomly shuffled list of unseated players
    for each player X from UP
      if there are less than 4 people seated at T AND
         X has not previously sat with any of the players currently at T AND
         X is not from the same clan as anyone currently at T
           seat X at T

    //No more players left to try for this table
    if T has less than 4 people seated
      abort;  //No solution possible (at least, with the decisions taken so far)

  //All tables filled with players, prepare for the next round.
  for each table T:
    for each player X on T:
      Register on X that he has sat with each of the other 3 players at T
    Unseat all players at T

这样,对于单轮,该算法每个桌子最多尝试一次所有玩家,因此单次运行最多尝试3 * T * N次,以便在玩家终止之前就座(有或没有解决方案) 。换句话说,一次运行应该非常快。

请注意,因为它仍然是随机的,所以多次运行相同的算法是完全可以接受的,因为它每次都会尝试不同的座位组合(使其成为所谓的拉斯维加斯算法)。

编辑2 :尝试使用每个16个玩家的5个部落测试此算法。通常,在找到第一个解决方案之前需要大约400次运行,但总运行时间仍然只有大约1秒。

答案 1 :(得分:1)

卡住了

被困在座位层面

  

我不确定这是否会一直完成,或者即使有有效的作业也不会卡住。

可能会卡住。假设 k = 4个表, N = 16个玩家,4个氏族,每个战队4个人。让 A1 thrugh A4 成为战队 A 中的玩家,其他战队也是如此。然后,下面是一个手工制作的情况的示例,它可能来自您的算法:

Round 1:
 Table 1: A1, B1, C1, D1
 Table 2: A2, B2, C2, D2
 Table 3: A3, B3, C3, D3
 Table 4: A4, B4, C4, D4

Round 2:
 Table 1: A1, B2, C3, D4
 Table 2: A2, B3, C1 !!!

被困在圆形水平?

仍然存在一个有趣的问题如下:如果可以对所有三轮进行有效的分配,你能否找到两轮的有效分配,排除第三轮的所有有效分配?如果是这种情况,您可能会陷入轮次,因此在执行某些回溯算法时,您可能必须撤消完整轮次才能获得有效的解决方案。我没有这样做的例子,也没有任何强烈的直觉。

更好的方式

  

有更好的方法吗

我想如果付出足够的努力,可以将其压缩到一些标准图算法的框架中。最有可能的是,该图形问题将是NP难的,因此也不会有多项式时间算法。

Donald Knuth撰写了一篇关于dancing links及其解决exact cover problem的应用的好文章。在最坏的情况下,它仍然使用反向跟踪和指数时间,但它使搜索树中完成大部分工作的那些部分的数据结构变小,从而加快了搜索速度。也许其中一些想法也适用于您的情况。但是,只是猜测,还没有考虑到特定的实现。

另一个想法:也许您可以采用扩充路径的概念,因为它在计算匹配时使用。这个想法是这样的:如果没有可供选择的人,请从其他玩家那里挑选一个随意的人。如果该人与当前表兼容,请将其移至该表。通过这样做,其他桌子将是一个短的一个玩家,你可以尝试使用一些未定位的玩家填补这个空白。如果这不起作用,您将再次重新安置现有播放器。你可能不应该马上开始移动玩家。相反,你应该首先尝试找到一个完整的增强路径,从一个空位开始,到一个未定位的人结束。只有在您确认存在这样的链后,您才能开始根据它移动人员。