[英]Algorithm for packing time slots
我有一组带有开始和结束时间的事件。 我想将它们渲染为一系列不重叠的行中的长框,像这样
00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00
--|--------|--------|--------|--------|--------|--------|--------|--------|--
AAAAAAAAAAAA BBBBBB CCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDD
--|--------|--------|--------|--------|--------|--------|--------|--------|--
EEEEEEEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
--|--------|--------|--------|--------|--------|--------|--------|--------|--
GGGGGGGGGGGGGGGGGGG HHHHHHHH IIIIIIIIIIIII
--|--------|--------|--------|--------|--------|--------|--------|--------|--
将任何特定的框分配给任何特定的行并不重要。 我想要的是一种算法,它将这些框包装到最少的行中。
是否有已知的算法?
我已经通过以下解决方案解决了相同的问题:
请注意,在插入元素时(步骤3.2.1),要枚举的空闲扇区集(步骤3)将发生变化。
2007年国际时间安排比赛有课程安排轨道和考试安排轨道。 许多研究人员参加了比赛。 尝试了很多启发式和元启发式方法,但最终,本地搜索元启发式方法(例如Tabu Search和Simulated Annealing )明显击败了其他算法(例如遗传算法)。
看一看一些决赛选手使用的2个开源框架:
JBoss OptaPlanner(Java,开源)Unitime(Java,开源)-适用于大学的更多信息
-Geoffrey De Smet: 创建学校时间表的算法
参考:
我只是贪婪地打包它们(从左到右进行处理,并在适合的情况下按自上而下的方向向第一首曲目添加事件)。 它既快速又具有确定性,并且很可能在实践中产生良好的结果。
这称为间隔分区。 贪心算法按开始时间的顺序分配盒子并将盒子放入适合的第一行(如果适合的地方则打开新行)会得到最佳结果。 参见例如Kleinberg&Tardos:“算法设计”。
如果我正确理解了您的问题,那么找出哪些日期重叠是最重要的。 您没有说算法是否真正有效,或者是否适用于非常大的数据。 因此,我建议您执行以下步骤:
也许通过重叠对元素进行加权,并且在步骤5中进行此最终检查可以帮助改善正常的贪婪方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.