解除冲突约束N团队计划



我正在编写一个perl程序来安排N个团队互相打一次作为主队,一次作为客队。我们使用两个字段和两个时间段。所以一天最多有八支球队参赛。任何球队都不能同时在两个场地上比赛,也不能在同一天内打两次比赛。任何未参加比赛的球队将被列入BYE名单。

我已经编写了代码来定义所有必需的游戏。但是当我尝试着安排每一款游戏并将其从游戏列表中移除时,我便会遇到这样的情况,即没有任何游戏能够满足一天中特定领域或时间段的规则。如果我不洗牌要玩的游戏数组,这是最明显的。即使有8个团队,我也会在接近尾声时遇到这些冲突。

消除计划序列冲突的逻辑是什么?

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

一旦你创建了回合,你仍然需要定义一个日历,该日历将尊重每天4场比赛的限制(并且每天不超过一次)。这很简单:如果一轮正好是一天或更多天,即如果你有8,16,24,…团队,然后你只需在要求的天数内划分每一轮。但即使N不是8的倍数,也没有问题。

让我们把事情简单化,考虑N = 12的情况,所以每一轮需要一天半:在第一天,你从第一轮的6场比赛中(随机)选择4场;在第2天,你选择第1轮缺席的2场比赛,以及第2轮缺席的2场比赛,注意避免同一支球队在一天内参加两次比赛;最后在第三天完成第二轮,以此类推。我们是否能够确保我们总是能够分配第2天,避免团队重复?是的,我们可以:当你从第一轮分配最后两场比赛时,你有4支球队受到影响;即使在第2轮中这4款游戏之间没有游戏,你也只能在第2天排除4款游戏,所以你仍然有2款游戏可以在那天投放。

最后提示:正如你所看到的,不需要一个再见列表。唯一需要处理的情况是当N是奇数时,通常通过添加一个虚拟团队来处理。

关于家庭与访客,您将需要重复完整的日历第二次。请注意,不可能让每支球队在每轮比赛中轮流在主队和客队之间进行。例如,在4支队伍中,你可能会让teamama (h) vs TeamB, TeamC (h) vs TeamD;在第二轮,你仍然可以选择TeamD (h) vs teamama和TeamB (h) vs TeamC;但在第三轮,TeamA和TeamC必须对战,而且双方都来自客队。TeamB和TeamD同样如此,他们都是从主场起步的。

最新更新