打包时隙的算法

时间:2014-09-05 09:49:44

标签: algorithm combinatorics

我有一组包含开始和结束时间的事件。我想将它们渲染为一系列没有重叠的行中的长框,类似这样的

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
--|--------|--------|--------|--------|--------|--------|--------|--------|--

将任何特定框分配给任何特定行并不重要。我想要的是一个算法,它将这些框打包成最小的行数。

这有一个已知的算法吗?

5 个答案:

答案 0 :(得分:2)

我用以下解决方案解决了同样的问题:

  1. 查找LB = min(startTime)和RB = max(endTime)。
  2. 将长度为LB的空行添加到RB;
  3. 对于行中的每个“空闲时间”扇区(最初只有一个扇区:LB到RB):
    • 3.1找到适合该行业的最长元素;
    • 3.2.1如果有这样的元素 - 嵌入在行中;
    • 3.2.2否则很明显这个自由部门无法使用;
  4. 如果在测试了所有当前空闲扇区后仍有剩余元素,请转到2.
  5. 请注意,插入元素时(步骤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)

如果我理解你的问题,最重要的是找出哪些日期重叠。你没有说,算法是否真的有效,或者它是否应该适用于非常大的数据。因此,我建议采取以下步骤:

  1. 找出哪些日期相互重叠。也许在地图中,您可以将每个条目映射到与其重叠的条目列表。
  2. 按开始时间对元素进行排序。
  3. 只要在一行中有空格,就选择元素,其中元素的起始时间最接近最后一个元素的结束时间。
  4. 从与此重叠的所有元素中,选择重叠最多的元素,与前一个重叠,并将其添加到行中。
  5. 如果一行已满,请检查最大间隙并查看元素是否适合它;否则转到下一行。
  6. 可能通过重叠对元素进行加权,并在步骤5中进行最后检查。这可能有助于改善正常的贪婪方法。