Algorithm 时隙打包算法

Algorithm 时隙打包算法,algorithm,combinatorics,Algorithm,Combinatorics,我有一套活动的开始和结束时间。我想将它们渲染为一系列行中的长框,没有重叠,类似这样 00:00 01:00 02:00 03:00 04:00 05:00 06:00 07:00 08:00 --|--------|--------|--------|--------|--------|--------|--------|--------|-- AAAAAAAAAAAA BBBBBB CCCCCCCCCCCCCCCCCC

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

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
--|--------|--------|--------|--------|--------|--------|--------|--------|--
将任何特定框指定给任何特定行并不重要。我想要的是一个算法,它将把这些框打包成最少的行


有一个已知的算法吗?

我会贪婪地打包它们(从左到右,在适合的地方,从上到下向第一首曲目添加一个事件)。它速度快,确定性强,很可能在实践中产生良好的效果。

我会贪婪地打包它们(从左到右,按照自上而下的方向在合适的地方向第一首曲目添加一个事件)。它速度快且具有确定性,在实践中很可能产生良好的效果。

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

  • 查找LB=min(开始时间)和RB=max(结束时间)
  • 将长度为LB的空行添加到RB
  • 对于行中的每个“空闲时间”扇区(最初只有一个扇区:LB到RB):
    • 3.1找到适合该部门的最长要素
    • 3.2.1如果有此类元件-嵌入线路中
    • 3.2.2否则,很明显,该自由部门无法使用
  • 如果在测试所有当前自由扇区后仍有剩余元素,请转至2

  • 请注意,插入元素(步骤3.2.1)时,枚举的自由扇区集(步骤3)将发生变化。

    我已使用以下解决方案解决了相同的问题:

  • 查找LB=min(开始时间)和RB=max(结束时间)
  • 将长度为LB的空行添加到RB
  • 对于行中的每个“空闲时间”扇区(最初只有一个扇区:LB到RB):
    • 3.1找到适合该部门的最长要素
    • 3.2.1如果有此类元件-嵌入线路中
    • 3.2.2否则,很明显,该自由部门无法使用
  • 如果在测试所有当前自由扇区后仍有剩余元素,请转至2
  • 请注意,当插入一个元素(步骤3.2.1)时,被枚举的自由扇区集(步骤3)将发生变化

    2007年国际排班比赛有一个排班 跟踪和考试安排跟踪。许多研究人员参与了这项研究 竞争。人们尝试了很多启发式和超启发式,但都没有成功 结束局部搜索元启发式(例如禁忌搜索模拟退火)明显优于其他算法(如遗传算法)

    看一看一些公司使用的两个开源框架 入围者:

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

    --杰弗里·德斯米特:

    参考:

    2007年国际排班比赛有一个排班 跟踪和考试安排跟踪。许多研究人员参与了这项研究 竞争。人们尝试了很多启发式和超启发式,但都没有成功 结束局部搜索元启发式(例如禁忌搜索模拟退火)明显优于其他算法(如遗传算法)

    看一看一些公司使用的两个开源框架 入围者:

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

    --杰弗里·德斯米特:

    参考:


      • 这称为间隔分区。贪婪算法按照开始时间的顺序分配盒子,并将盒子放入适合的第一行(如果盒子不适合任何地方,则打开一个新行),从而获得最佳结果。例如,参见Kleinberg&Tardos:“算法设计”。

        这称为区间划分。贪婪算法按照开始时间的顺序分配盒子,并将盒子放入适合的第一行(如果盒子不适合任何地方,则打开一个新行),从而获得最佳结果。例如,参见Kleinberg&Tardos:“算法设计”。

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

      • 找出哪些日期彼此重叠。可能在地图中,您将每个条目映射到与其重叠的条目列表
      • 按起始时间对元素进行排序
      • 只要一行中有空格,就可以选择起始时间与最后一个元素结束时间最接近的元素
      • 从与此元素重叠的所有元素中,选择与上一个元素重叠最多且与上一个元素不重叠的元素,并将其添加到行中
      • 如果一行已满,请检查最大间隙,并查看是否有元素适合该行;否则请转到下一行

      • 可能是通过重叠对元素进行加权,并在步骤5中进行最终检查。可能有助于改进正常的贪婪方法。

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

      • 找出哪些日期彼此重叠。可能在地图中,您将每个条目映射到与其重叠的条目列表
      • 按起始时间对元素进行排序
      • 只要一行中有空格,就可以选择起始时间与最后一个元素结束时间最接近的元素
      • 从与此元素重叠的所有元素中,选择与上一个元素重叠最多且与上一个元素不重叠的元素,并将其添加到行中
      • 如果一行已满,请检查最大g