提问者:小点点

解冲突约束N队日程


我正在编写一个perl程序来安排N支球队以主队和访客的身份进行比赛。我们使用两个领域和两个时间段。所以一天最多有八支球队比赛。没有球队可以在两个领域同时比赛,也没有球队可以在同一天比赛两次。任何一天没有比赛的球队都会被列入BYE名单。

我已经编写了代码来定义所有必需的游戏。但是当我试图安排每个游戏并将其从要玩的游戏数组中删除时,我到达了这样一个条件,即一天中没有可以满足场地或时间段规则的游戏了。如果我不洗牌要玩的游戏数组,这一点最为明显。即使有8支球队,我也会在接近结束时遇到这些冲突。

消除日程顺序冲突的逻辑是什么?


共1个答案

匿名用户

不要简单地创建所有游戏的列表并从中随机选择:你需要一个算法来创建回合——循环方法是“标准”方法(例如,参见@David Eisenstat评论中的链接)。

一旦你创建了回合,你仍然必须定义一个日历,该日历将尊重每天4场比赛的限制(并且没有团队每天玩一次以上)。这很简单:如果一轮正好填满一天或多天,即如果你有8、16、24、…队,那么你只需在请求的天数中拆分每轮。但是即使N不是8的倍数,也没有问题。

让我们保持简单,考虑N=12的情况,所以每一轮需要一天半的时间:在第一天,你从第一轮的6场比赛中选择(随机)4场;在第二天,你选择第一轮的2场缺失比赛和第二轮的2场比赛,注意避免同一支球队在一天内玩两次;最后在第三天,你完成了第二轮,依此类推。我们能确定我们总是能够分配第二天,避免团队的重复吗?是的,我们可以:当您分配第一轮的最后两场比赛时,您有4支球队受到影响;即使在第二轮中,这4场比赛之间没有比赛,您也只能排除第2天的4场比赛,因此当天仍有2场比赛可供放置。

最后注意事项:如您所见,不需要再见列表。唯一需要处理的情况是N是奇怪的,通常通过添加一个虚拟团队来处理。

关于主场和访客,你需要第二次重复完整的日历。请注意,不可能在每一轮都让每支球队在主场和访客之间交替。例如,有4支球队,你可能会有TeamA(h)vs TeamB和TeamC(h)vs TeamD;在第二轮,你仍然可以选择TeamD(h)vs TeamA和TeamB(h)vs TeamC;但是在第三轮,TeamA和TeamC必须互相比赛,并且都来自访客回合。TeamB和TeamD也是如此,他们都来自主场回合。