我有一组包含开始和结束时间的事件。我想将它们渲染为一系列没有重叠的行中的长框,类似这样的
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
--|--------|--------|--------|--------|--------|--------|--------|--------|--
将任何特定框分配给任何特定行并不重要。我想要的是一个算法,它将这些框打包成最小的行数。
这有一个已知的算法吗?
答案 0 :(得分:2)
我用以下解决方案解决了同样的问题:
请注意,插入元素时(步骤3.2.1),枚举的自由扇区集(步骤3)将会改变。
答案 1 :(得分:2)
2007年国际时间表比赛有一个课程安排 跟踪和考试安排轨道。许多研究人员参与其中 竞争。尝试了大量的启发式和元启发式,但是在 结束本地搜索元启发式(例如禁忌搜索和 模拟退火)明显优于其他算法(如遗传算法)。
看看一些使用的2个开源框架 入围:
JBoss OptaPlanner(Java,开源)Unitime(Java,开源) - 更多大学
- Geoffrey De Smet:Algorithm for creating a school timetable
参考:
答案 2 :(得分:0)
我只是贪婪地打包它们(从左到右进行,并在自上而下的方向上向第一个轨道添加一个事件)。它速度快,确定性很强,很可能在实践中产生良好的效果。
答案 3 :(得分:0)
这称为间隔分区。贪婪算法按照开始时间的顺序分配框,并将框放入适合的第一行(或者如果它不适合则打开一个新行)可以得到最佳结果。参见例如Kleinberg& Tardos:“Algorithm Design”。
答案 4 :(得分:0)
如果我理解你的问题,最重要的是找出哪些日期重叠。你没有说,算法是否真的有效,或者它是否应该适用于非常大的数据。因此,我建议采取以下步骤:
可能通过重叠对元素进行加权,并在步骤5中进行最后检查。这可能有助于改善正常的贪婪方法。