0

我被要求为 3v3 排球锦标赛创建循环赛时间表,其中必须满足以下标准:(从最重要到最不重要)

每个玩家与另一个玩家不超过一次比赛 每个玩家至少可以玩 4 次 每个玩家不能坐下超过一轮 每个玩家与另一个玩家的比赛不
超过两次

当我有以下情况时,我正在努力解决的问题是:40 名球员 4 个球场

我已经能够为 15 个团队暴力破解一个半功能解决方案,但是手工完成它变得太笨拙了,所以我正在考虑尝试用 Java 编写一个程序。我不完全确定如何制作一个蛮力程序来做到这一点。我目前正在尝试使用每个可能的 3 人团队的列表并将它们插入到日程表中。然后迭代它们替换直到游戏正常运行。

这是其他人提出的同一问题的另一个版本 https://eso-community.net/viewtopic.php?t=9816

这里的最佳答案为8-13人的团队提供了完美的解决方案

4

1 回答 1

0

40人问题有一个巨大的搜索空间,我不相信任何暴力解决方案会奏效。试想一下选择参加一轮比赛的 24 名球员,有 6x10^10 种方法可以做到这一点,还有更多方法可以将这 24 名球员分配到 3 对 3 的 4 个球场。

目前尚不清楚您正在寻找多少轮。有 4 个球场,每个球场有 6 名球员,每轮剩下 16 个轮空。因此,任何 5 轮的倍数 (i) 都是非常可取的,因为 16 x 5i = 80i,因此可以安排每 5i 轮比赛,40 支球队中的每支球队都有 3i 场比赛和 2i 个轮空。你已经要求“每个玩家至少玩 4 次”,所以最好的选择是寻找一个 10 轮的解决方案,每个玩家有 6 场比赛。这是一种可能的选择,其中所有伙伴都不同,所有对手都不同。

  (38 15 11 v  7 25 23) (33 14  9 v 20 29 19) (40 16 27 v 37 28 21) (34 17  3 v 10 24 32)
  (39 11 12 v  8 21 24) (34 15 10 v 16 30 20) (36 17 28 v 38 29 22) (35 18  4 v  6 25 33)
  (40 12 13 v  9 22 25) (35 11  6 v 17 26 16) (37 18 29 v 39 30 23) (31 19  5 v  7 21 34)
  (36 13 14 v 10 23 21) (31 12  7 v 18 27 17) (38 19 30 v 40 26 24) (32 20  1 v  8 22 35)
  (37 14 15 v  6 24 22) (32 13  8 v 19 28 18) (39 20 26 v 36 27 25) (33 16  2 v  9 23 31)
  (36  5 33 v 12 32 15) (13  7 24 v 20  4  2) (25  1 28 v 30 10 31) (37 26 38 v  3  9 18)
  (37  1 34 v 13 33 11) (14  8 25 v 16  5  3) (21  2 29 v 26  6 32) (38 27 39 v  4 10 19)
  (38  2 35 v 14 34 12) (15  9 21 v 17  1  4) (22  3 30 v 27  7 33) (39 28 40 v  5  6 20)
  (39  3 31 v 15 35 13) (11 10 22 v 18  2  5) (23  4 26 v 28  8 34) (40 29 36 v  1  7 16)
  (40  4 32 v 11 31 14) (12  6 23 v 19  3  1) (24  5 27 v 29  9 35) (36 30 37 v  2  8 17)
于 2018-12-01T20:41:24.943 回答