是否有一种有效的算法来创建此类时间表?

时间:2019-01-08 21:29:07

标签: r algorithm schedule

我正在为一个拥有数十支球队的体育联赛制定时间表。我已经按照设置的顺序完成了所有比赛,现在我只需要为每个游戏分配一个团队作为“主队”,一个“离开”队。

问题有两个约束:

  1. 每对球队必须在主场和客场进行相同数量的比赛 互相对抗。例如,如果A队和B队打4 游戏,那么2个必须由A托管,2个必须由B托管。假设每对 的团队在彼此之间的比赛数量为偶数。
  2. 任何球队都不应连续进行三场或三场以上的主场比赛 在时间表的任何时候连续进行客场比赛。

我一直试图在R中使用蛮力来解决此问题,但是我无法获得任何代码块来及时解决此问题。有人对如何通过算法处理上述一个或多个约束有任何建议吗?

1 个答案:

答案 0 :(得分:2)

您需要对简单调度进行更多研究。 这些方面有很多参考资料。 这是您的应用程序的基础。假设一个由6支球队组成的联赛;任何数字的处理过程都是相同的。

比赛1:简单地成环成对写下团队编号。弄平他响成两行。匹配项是上(家)和下(客)。

1 2 3
6 5 4

比赛2-5:第1队留在原地;其他的绕环旋转。

1 6 2
5 4 3

1 5 6
4 3 2

1 4 5
3 2 6

1 3 4
2 6 5

那是一个完整的周期。为了平衡家庭出游的时间表,只需将灯具每隔两场比赛倒转一次即可:

1 2 3    5 4 3    1 5 6    3 2 6    1 3 4
6 5 4    1 6 2    4 3 2    1 4 5    2 6 5

这是您的第一个完整回合。只需复制此内容,即可在轮回中再次切换无家可归的灯具。因此,第二轮将是:

6 5 4    1 6 2    4 3 2    1 4 5    2 6 5
1 2 3    5 4 3    1 5 6    3 2 6    1 3 4

根据需要重复此轮,以获取所需的时间表。

如果您的团队数量不固定,只需在时间表中声明其中一个数字作为“再见”。如果使用非轮换小组(在此示例中为小组1),我发现最容易遵循。

请注意,此转场过程可确保没有球队在主场或客场都进行三场连续比赛:在四舍五入时,他们连续获得两场比赛。但是,即使是两人制比赛也不会在本轮结束时受到影响:这两个球队在下一轮的第一场比赛中都打破了连胜纪录。


不幸的是,对于现有的任意计划,您都陷入了带有回溯的蛮力搜索。您可以采用一些限制和试探法,例如在每个关口将平衡局部居家固定装置作为首选。不过,更好的方法是通过设计使原始时间表正确无误。

还有一个小问题,您不能 保证您现有的计划将满足给定的要求。例如,给定8队固定装置的顺序:

1 2 3 4
5 6 7 8

1 2 5 6
3 4 7 8

1 3 5 7
2 4 6 8

要避免有至少两支球队连续三场主场或客场比赛,这是