【问题标题】:Algorithm for generating combinations of interval relationships生成区间关系组合的算法
【发布时间】:2019-05-20 08:42:04
【问题描述】:

我想生成一些样本数据来处理不同类型的区间,并希望确保表示所有可能的区间关系。

出于我的目的,{meets,overlaps,is-finished-by} 是等价的,equals 可以忽略,并且 {B 开始 A,A 包含B} 也是等价的。我还将假设所有间隔都经过排序和标记,使得 A 在 B 之前开始,在 C 之前开始等等。所以我基本上对三种情况感兴趣:

  • A 在 B 之前(例如 A=[1,2], B=[3,4])
  • A 包含 B(例如 A=[1,4],B=[2,3])
  • A 与 B 重叠(例如 A=[1,3], B=[2,4])

引入第三个区间会产生更多情况:

  • A 在 B 之前,B 在 C 之前(例如 A=[1,2]、B=[3,4]、C=[5,6])
  • A 在 B 之前,B 包含 C(例如 A=[1,2]、B=[3,6]、C=[4,5])
  • A 在 B 之前,B 与 C 重叠(例如 A=[1,2]、B=[3,5]、C=[4,6])
  • ...

虽然在 A 在 B 之前的情况下,A 也将始终在 C 之前,但对于其他变体而言,情况并非如此,我们还需要考虑 A 和 C 的关系:

  • A 包含 B,B 与 C 重叠,A 与 C 重叠(例如 A=[1,5]、B=[2,4]、C=[3,6])
  • A 包含 B,B 与 C 重叠,A 包含 C(例如 A=[1,6]、B=[2,4]、C=[3,5])

对于给定数量的间隔,可能有多少种不同的关系组合?

生成这些组合的算法是什么?

例如,算法可能会产生以下输出来解决两个区间的情况:

combination, interval name, start, end
1, A, 1, 2
1, B, 3, 4
2, A, 1, 4
2, B, 2, 3
3, A, 1, 3
3, B, 2, 4

图片来源:Höppner, Frank & Topp, Alexander. (2007). Classification Based on the Trace of Variables over Time. 739-749. 10.1007/978-3-540-77226-2_74.


编辑:根据 MBo 的回答,添加了四个间隔的解决方案的可视化。

【问题讨论】:

    标签: algorithm combinations


    【解决方案1】:

    有 (2*n-1)!! (奇数为double factorial)n个区间的组合,序列为1,3,15,105,945...

    快速制作的 Python 实现以显示结果。在每个阶段,我们都可以开始新的间隔(比之前的开始大 1)或完成任何打开的间隔

    t = 0
    def genintervals(n, level, opstart, opened, s):
        if level == 2 * n:
            print(s)
            global t
            t += 1
            return
        if opstart < n:
            genintervals(n, level + 1, opstart + 1, opened + [opstart], s + 's' + str(opstart) + " ")
        for i in range(len(opened)):
            genintervals(n, level + 1, opstart, opened[0:i] + opened[i+1:], s + 'e' + str(opened[i]) + " ")
    
    s0 s1 s2 e0 e1 e2 
    s0 s1 s2 e0 e2 e1 
    s0 s1 s2 e1 e0 e2 
    s0 s1 s2 e1 e2 e0 
    s0 s1 s2 e2 e0 e1 
    s0 s1 s2 e2 e1 e0  //A covers B and C, B covers C
    s0 s1 e0 s2 e1 e2 
    s0 s1 e0 s2 e2 e1  //start A, start B, finish A, start C, finish C, finish B
    s0 s1 e0 e1 s2 e2 
    s0 s1 e1 s2 e0 e2 
    s0 s1 e1 s2 e2 e0 
    s0 s1 e1 e0 s2 e2 
    s0 e0 s1 s2 e1 e2 
    s0 e0 s1 s2 e2 e1 
    s0 e0 s1 e1 s2 e2
    15
    

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2010-10-30
      • 2017-09-13
      相关资源
      最近更新 更多