需要帮助来确定联赛排程算法


9

我正在尝试创建体育联赛调度程序。我无法确定一种算法来帮助我有效地填写每个位置。

建立时间表的样本数据为:

  1. 10支
  2. 每个团队互相比赛1次(总共需要45场比赛)
  3. 每队每天最多玩1次
  4. 在我的测试中,我使用9天,每天5个广告位。

组合表(包含45个连击)

ID
Team1ID
Team2ID位已
分配

时间表表(包含45个时隙)

scheduleID
homeTeamID
awayTeamID
GameDate
GameTime

现在,我现有的过程将填补约90%的插槽,而剩下10%的插槽将留空,以免基于上述规则发生调度冲突。

我以递增的日期/时间顺序遍历我的计划表。
我的第一个时段可能是星期六上午8点。
我查询尚未安排的球队名单。然后,我对这些团队进行了一系列可能的组合。然后,我使用该数组从我的组合表中从尚未安排的组合中提取1条随机记录,然后将这些团队放在计划中。然后,我将该组合设置为使用状态。

我一遍又一遍地重复循环,每次我的可用团队列表变小,结果数组也变小。

我发现有些日子过得很好,而在另一些日子里,我最后剩下的最后两支球队已经在前一周打过球,因此不再被添加到日程表中。

我还没有尝试过的唯一方法就是“重置”冲突天数,然后再试一次以查看我是否能获得更好的排名。

有没有人有什么建议?


5
循环赛赛程安排
凯文·克莱恩

凯文谢谢。你的权利。我似乎现在我的阵列每次都从同一位置开始,并且没有轮换,因此没有有序地进行团队配对。
史蒂夫2014年

1
我使用完全随机的方法。随机选择一个插槽和两个团队。如果满足规则,则安排游戏。如果不丢弃,请重试。我对总尝试次数设置了一个限制,如果达到限制,则放弃整个计划并重新开始。实际上在实践中效果很好。
塞拉德(Cerad)2014年

我最终遵循循环法。我已经完成95%的脚本编写工作,以连接到数据库,但是在测试中,它似乎运行平稳且平衡。我将自己的日子当作“回合”对待,他们保持良好平衡。我可以按任意顺序进行回合,也可以按任意顺序进行各回合的比赛,但是将游戏从一个回合转到另一个回合最终会违反规则。
史蒂夫2014年

Answers:


5

这是我自己发明的算法。我不知道它是否已经存在或实际上是循环实现:

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

基本上你从

旋转图片

并始终将1保持在同一位置,然后旋转其余部分。

这样,您将始终获得唯一匹配的时间表。这是非常容易实现的,并且可以与任何数量的对手(甚至是不平衡的)进行缩放。如果您的对手人数不均,那就不要将球队放在第一位,他们会有一轮免费比赛。


2
您如何管理家庭余额与远期余额?
埃里克·科普

这实际上是行不通的-在这种简单的轮换算法中,相隔2个位置(2/4,3/5)的轮换队伍将永远不会参赛。
mdryden

@mdryden它确实起作用。进行更好的检查,请删除您的评论。
Pieter B

@PieterB我当时以为它会起作用,但是如果有奇数个团队,它实际上将不起作用,因为彼此相邻的团队(如4和5)将永远不会互相比赛。您可以很容易地在1的末尾看到它,并且在另一端也很容易看到它,因为您有悬挂的团队(与再见)这是一个很好的回答,它也处理了奇数:stackoverflow.com/a/6649732/ 6489306
ragingasiancoder

@ragingasiancoder如果团队数量奇数,请添加一个虚拟团队。您链接的答案描述了与我介绍的完全相同的解决方案。
Pieter B

1

我认为您正在倒退。不要从时间表表开始,而要从表/数组/所有游戏组合(45个游戏)中的任何一个开始。从那里开始,基于每天只玩一次的团队,将游戏分配到一天是一个简单的过程。而且由于对决仅发生一次(A组仅对B队进行一次比赛),因此计划安排很容易,因为您只需要确保对决还没有发生(这样条目就“唯一”了)。


1

我在下面生成了10组单轮巡回赛时间表。我花了大约三分钟。

日程信息:

10队-1个循环赛(仅显示前6周)
赛季开始日期1/6/ 15-结束日期3/5/15
每个星期二2场比赛,每个星期四3场比赛,每周5场比赛,没有跳过日期

  • 所有团队均分配在5个时隙中进行比赛。
  • 全部玩9局。
  • 所有人都玩一次。
  • 所有人均以家庭和访客的身份平均分配(5 / 4、4 / 5)。注意:在循环赛2结束时,所有球队都进行18场比赛(主场9场,客队9场),所有球队都有2场再见。
  • 每周在5个时段均匀分布所有比赛。

我们使用了过时的霍尼韦尔(中国)大型计算机,并在不到3年的时间里将整个设备组装在一起。调试我们的调度软件后,主机计算机花费了许多小时来搜索数百万个排列和组合,以计算和创建我们所寻找的4至22个团队的平衡模式。

10 Team Division Schedule   DATE 12/20/14

DATE   DAY TIME    LOCATION  GM  HOME vs VISITOR

Jan  6 Tue 6:00pm  Field #1   1  # 1 vs #10 
Jan  6 Tue 6:00pm  Field #2   1  # 2 vs # 9 
Jan  8 Thu 6:30pm  Field #3   1  # 3 vs # 8 
Jan  8 Thu 6:30pm  Field #4   1  # 4 vs # 7 
Jan  8 Thu 6:30pm  Field #5   1  # 5 vs # 6

Jan 13 Tue 6:00pm  Field #1   2  # 6 vs # 3 
Jan 13 Tue 6:00pm  Field #2   2  #10 vs # 8 
Jan 15 Thu 6:30pm  Field #3   2  # 7 vs # 2 
Jan 15 Thu 6:30pm  Field #4   2  # 9 vs # 1 
Jan 15 Thu 6:30pm  Field #5   2  # 4 vs # 5

Jan 20 Tue 6:00pm  Field #1   3  # 7 vs # 9 
Jan 20 Tue 6:00pm  Field #2   3  # 5 vs # 2 
Jan 22 Thu 6:30pm  Field #3   3  # 6 vs #10 
Jan 22 Thu 6:30pm  Field #4   3  # 3 vs # 4 
Jan 22 Thu 6:30pm  Field #5   3  # 8 vs # 1

Jan 27 Tue 6:00pm  Field #1   4  # 9 vs # 5 
Jan 27 Tue 6:00pm  Field #2   4  # 1 vs # 7 
Jan 29 Thu 6:30pm  Field #3   4  # 2 vs # 3 
Jan 29 Thu 6:30pm  Field #4   4  # 8 vs # 6 
Jan 29 Thu 6:30pm  Field #5   4  #10 vs # 4

Feb  3 Tue 6:00pm  Field #1   5  # 4 vs # 8 
Feb  3 Tue 6:00pm  Field #2   5  # 7 vs # 5 
Feb  5 Thu 6:30pm  Field #3   5  # 1 vs # 6 
Feb  5 Thu 6:30pm  Field #4   5  #10 vs # 2 
Feb  5 Thu 6:30pm  Field #5   5  # 3 vs # 9

Feb 10 Tue 6:00pm  Field #1   6  # 3 vs # 7 
Feb 10 Tue 6:00pm  Field #2   6  # 6 vs # 4 
Feb 12 Thu 6:30pm  Field #3   6  # 5 vs # 1 
Feb 12 Thu 6:30pm  Field #4   6  # 9 vs #10 
Feb 12 Thu 6:30pm  Field #5   6  # 8 vs # 2 

没有一种算法可以解决与成百上千种不同类型的联赛,运动和潜在情况相关的整体调度问题。为了解决此问题,我们采取了另一种方法来计算时间表。它从非常复杂的数学开始,以确定正确的循环赛团队配对(对决),但这仅仅是开始。需要其他部分来创建可以发布和分发的有用的平衡时间表。球员,教练,父母等等,不仅需要知道他们在玩谁,还需要知道他们在玩什么。但是他们在哪里玩 ; 他们什么时候玩 ; 如果他们是家或访客 ; 对于许多联赛来说,就是比赛号码

我希望这可以帮助您和其他人了解我们花了三年时间才弄清楚的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.