赛事安排问题

Posted

技术标签:

【中文标题】赛事安排问题【英文标题】:Tournament scheduling issues 【发布时间】:2016-12-08 19:55:02 【问题描述】:

目前我正在开发一个为期 1 天的锦标赛安排应用程序。由于每年参与团队的数量不同,我想自动安排日程。

团队分为 2 组。每组进行单循环赛。 我设法生成了所有要玩的游戏,但我正在为计划而苦苦挣扎。

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

鉴于: - 玩游戏 - 每个运动场 + 每个场的可用时隙(+-15 分钟的时隙)

假设: - 时隙不限 - 每项运动提供 1 个场地 - 在第一次迭代中不需要平衡时间表

问题: - 我的日程安排质量不是很好。事实上,即使有解决方案,也不是所有的时间段都被填满。我的日程安排的“密度”还取决于处理的游戏顺序。

代码sn-p:

        //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】:

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

【讨论】:

感谢您的意见!对一个像样的 .NET 约束编程求解器有什么想法吗? 我不知道。免费使用最多的两个是 Choco (Java) 和 Gecode (C++),使用最多的是 CP Optimizer(提供免费试用版)。根据 wiki,google-or 接受 .NET,但我从不使用它。最后,如果您对可能不是最优的解决方案感兴趣,可以查看 LocalSolver。 好的,我会看看那些项目。感谢您的信息! 不客气。如果它对您有帮助,请不要犹豫投票和/或验证答案:)

以上是关于赛事安排问题的主要内容,如果未能解决你的问题,请参考以下文章

第十六届全国大学生智能汽车竞赛--百度智慧交通(东部赛区)

怎样安排满意菜单

行程安排 英文

[nyoj]会场安排问题-贪心

nyoj 14-会场安排问题 (贪心)

会场安排问题(贪心算法)