首页 文章

比赛安排问题

提问于
浏览
0

目前我正在开展为期一天的比赛日程安排申请 . 由于每年参与团队的数量不同,我希望自动化调度 .

团队分为两组 . 每个小组都参加一场循环赛 . 我设法生成所有游戏,但我正在努力规划 .

此外,球队需要参加3个不同的运动项目,每个项目都有一个专门的领域 . (例如足球场,排球场)

鉴于: - 游戏 - 每场运动场地每场可用时段(-15分钟)

假设: - 时间段不受限制 - 每项运动可用1个字段 - 在第一次迭代中不需要 balancer 时间表

问题: - 我的日程表的质量不是那么好 . 事实上,即使有解决方案,并非所有时段都被完全填满 . 我的日程表的“密度”也取决于处理的游戏顺序 .

代码段:

//algo
        while (_games.Any())
        {
            gameToPlan = _games.Dequeue();

            var occupiedHomeTeam = GetTimeslotsOccupiedByTeam(gameToPlan.HomeTeam);
            var occupiedAwayTeam = GetTimeslotsOccupiedByTeam(gameToPlan.AwayTeam);
            var occupiedTeams = occupiedHomeTeam.Union(occupiedAwayTeam);

            var availableFields = fields.Where(f => f.AllowedSports.Contains(gameToPlan.Sport))
                                        .Where(f => f.Timeslots.Any(t => t.Game == null &&
                                                                        !t.Occupied &&
                                                                        !occupiedTeams.Any(oc => oc.Start == t.Start &&
                                                                                                 oc.End == t.End)));
            if (!availableFields.Any())
            {
                _games.Enqueue(gameToPlan);
                continue;
            }
            var field = availableFields.First();
            var timeSlots = field.Timeslots.Where(t => t.Game == null && 
                                               !t.Occupied && 
                                               !occupiedTeams.Any(oc => oc.Start == t.Start && 
                                                                        oc.End   == t.End))
                                    .OrderBy(t => t.Start);
             if (!timeSlots.Any())
             {
                _games.Enqueue(gameToPlan);
                continue;
            }   
            var ts = timeSlots.First();
            ts.Occupied = true;
            ts.Game = gameToPlan;
            gameToPlan.Timeslot = ts;
            gameToPlan.TimeslotId = ts.Id;
            _uow.Save();
        }

任何人都可以给我一个概述方法,可用的算法,......?

提前致谢

1 回答

  • 2

    关于您的问题,这显然是一个离散的优化问题 . 对于锦标赛/时间表问题,您应该考虑使用 constraint programming 求解器 . 您需要熟悉线性/ integer programming才能这样做 . 例如,您可以使用Java中的Choco solver . 有趣的是,他们forum上的最后一个问题与锦标赛安排有关 .

相关问题