繁体   English   中英

时隙打包算法

[英]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
--|--------|--------|--------|--------|--------|--------|--------|--------|--

将任何特定的框分配给任何特定的行并不重要。 我想要的是一种算法,它将这些框包装到最少的行中。

是否有已知的算法?

我已经通过以下解决方案解决了相同的问题:

  1. 找出LB = min(startTime)和RB = max(endTime)。
  2. 将长度为LB的空行添加到RB;
  3. 对于该行中的每个“空闲时间”扇区(最初只有一个扇区:LB到RB):
    • 3.1找到适合该行业的最长元素;
    • 3.2.1如果有这样的元素-插入行中;
    • 3.2.2否则,很明显这个自由部门是不可用的;
  4. 如果在测试了所有当前的空闲扇区之后仍剩余元素,请转到2。

请注意,在插入元素时(步骤3.2.1),要枚举的空闲扇区集(步骤3)将发生变化。

2007年国际时间安排比赛有课程安排轨道和考试安排轨道。 许多研究人员参加了比赛。 尝试了很多启发式和元启发式方法,但最终,本地搜索元启发式方法(例如Tabu SearchSimulated Annealing )明显击败了其他算法(例如遗传算法)。

看一看一些决赛选手使用的2个开源框架:

JBoss OptaPlanner(Java,开源)Unitime(Java,开源)-适用于大学的更多信息

-Geoffrey De Smet: 创建学校时间表的算法

参考:

我只是贪婪地打包它们(从左到右进行处理,并在适合的情况下按自上而下的方向向第一首曲目添加事件)。 它既快速又具有确定性,并且很可能在实践中产生良好的结果。

这称为间隔分区。 贪心算法按开始时间的顺序分配盒子并将盒子放入适合的第一行(如果适合的地方则打开新行)会得到最佳结果。 参见例如Kleinberg&Tardos:“算法设计”。

如果我正确理解了您的问题,那么找出哪些日期重叠是最重要的。 您没有说算法是否真正有效,或者是否适用于非常大的数据。 因此,我建议您执行以下步骤:

  1. 找出哪些日期相互重叠。 也许在地图中,您可以在其中将每个条目映射到与其重叠的条目列表。
  2. 按开始时间对元素进行排序。
  3. 只要在一行中有空间,就选择元素的开始时间与最后一个元素的结束时间最接近的元素。
  4. 从与此元素重叠的所有元素中,选择一个与前一个元素重叠最多的元素,然后将其添加到您的行中。
  5. 如果一行已满,请检查最大的间隙并查看是否有元素适合其中; 否则继续下一行。

也许通过重叠对元素进行加权,并且在步骤5中进行此最终检查可以帮助改善正常的贪婪方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM