Algorithm 什么算法可以分析具有备选方案的依赖关系?

Algorithm 什么算法可以分析具有备选方案的依赖关系?,algorithm,dependencies,graph-theory,graph-algorithm,Algorithm,Dependencies,Graph Theory,Graph Algorithm,我有一组元素,它们彼此之间有各种依赖关系。这些依赖关系可能是严格的,例如,a依赖于b和c;或者某些元素可能有替代项,例如,s取决于t或u。不存在循环依赖关系 我尝试对依赖项信息做两件事: 确定给定的元素集是否已解决所有依赖项 列出所有可能完全解析的元素集 (事实上,给定1,2是微不足道的,因为我可以在资源允许的情况下生成所有排列并检查它们。不过可能有更好的算法来实现这一点。) 是否有适合具有替代依赖项的元素的算法?我发现了很多只解释严格依赖关系的元素,但我不知道足够的术语来缩小搜索范围。假设您的

我有一组元素,它们彼此之间有各种依赖关系。这些依赖关系可能是严格的,例如,
a
依赖于
b
c
;或者某些元素可能有替代项,例如,
s
取决于
t
u
。不存在循环依赖关系

我尝试对依赖项信息做两件事:

  • 确定给定的元素集是否已解决所有依赖项
  • 列出所有可能完全解析的元素集
  • (事实上,给定1,2是微不足道的,因为我可以在资源允许的情况下生成所有排列并检查它们。不过可能有更好的算法来实现这一点。)


    是否有适合具有替代依赖项的元素的算法?我发现了很多只解释严格依赖关系的元素,但我不知道足够的术语来缩小搜索范围。

    假设您的元素列在L中。然后,对于L中的每个元素e,验证是否已解决所有直接依赖关系。要验证每个元素e,您可以遍历e的依赖项列表D,并确保D中的所有元素D都在L中找到。为了解决备选方案的问题,现在将每个d看作是其自身的备选依赖项列表

    for each d in e.D 
        d_ok = false
        for each alt_d in d
            if alt_d in L: d_ok = true, break
        if not d_ok: return false
    return true
    
    要列出满足依赖关系的所有可能集合,可以使用排列索引以所有可能的不同顺序迭代所有
    alt\u d
    s。您可以事先生成这些索引,因为您知道L中每个元素的备选方案数量。您可以在以下代码中使用的MATLAB中检查
    ndgrid
    ,假设元素a具有三个依赖项,元素b具有两个依赖项:

    [idx_a, idx_b] = ndgrid(1:3, 1:2);
    idx = [idx_a(:), idx_b(:)]; 
    

    有关如何使用此类预计算索引的参考信息,请独立于要在中实现此功能的语言。

    假设元素列在L中。然后,对于L中的每个元素e,验证是否已解决所有直接依赖关系。要验证每个元素e,您可以遍历e的依赖项列表D,并确保D中的所有元素D都在L中找到。为了解决备选方案的问题,现在将每个d看作是其自身的备选依赖项列表

    for each d in e.D 
        d_ok = false
        for each alt_d in d
            if alt_d in L: d_ok = true, break
        if not d_ok: return false
    return true
    
    要列出满足依赖关系的所有可能集合,可以使用排列索引以所有可能的不同顺序迭代所有
    alt\u d
    s。您可以事先生成这些索引,因为您知道L中每个元素的备选方案数量。您可以在以下代码中使用的MATLAB中检查
    ndgrid
    ,假设元素a具有三个依赖项,元素b具有两个依赖项:

    [idx_a, idx_b] = ndgrid(1:3, 1:2);
    idx = [idx_a(:), idx_b(:)]; 
    

    有关如何使用此类预计算索引的参考,请独立于要在其中实现此功能的语言。

    对于非严格依赖项,如果只有两种选择,例如s依赖于t或u(不再),则可以将其视为并求解

    对于非严格依赖关系,如果它只有两个选择,例如s依赖于t或u(不再),则可以将其视为并求解

    很好,这就是我开始画的。Python的
    any
    all
    函数也将大大简化这一过程。好的,希望您能看到我的编辑。我最初写的是错的。要澄清,您是否考虑了集合中的“根”,即是否有一个特定元素的依赖关系必须得到解决?不,我可以验证任何给定的元素集合,以确保没有依赖于未解决的依赖关系的元素。好的,那么这就必须应用于L的每个元素,但是您不必使用递归。我做了相应的编辑。啊,很好,这是我开始画的。Python的
    any
    all
    函数也将大大简化这一过程。好的,希望您能看到我的编辑。我最初写的是错的。要澄清,您是否考虑了集合中的“根”,即是否有一个特定元素的依赖关系必须得到解决?不,我可以验证任何给定的元素集合,以确保没有依赖于未解决的依赖关系的元素。好的,那么这就必须应用于L的每个元素,但是您不必使用递归。我做了相应的编辑。我不能保证只有两个依赖项。虽然从理论上讲,一组两个以上的依赖关系可以转化为两个嵌套的依赖关系(我认为),但我不能保证只有两个依赖关系。虽然从理论上讲,一组两个以上的依赖项可以转换成两个嵌套的集合(我认为)。