什么算法可以用备选方案分析依赖关系?

时间:2013-01-22 02:56:34

标签: algorithm dependencies graph-theory graph-algorithm

我有一组彼此具有各种依赖关系的元素。这些依赖关系可能很严格,例如。 a取决于bc;或者某些元素可能有替代品,例如。 s取决于tu。没有循环依赖。

我正在尝试使用依赖项信息做两件事:

  1. 确定给定的元素集是否已解决所有依赖关系
  2. 列出所有可能完全解析的元素集
  3. (实际上2给出1是微不足道的,因为我可以生成所有排列并在资源允许的情况下检查它们。虽然可能有更好的算法。)

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

2 个答案:

答案 0 :(得分:1)

我们假设您的元素列在 L 中。然后,对于 L 中的每个元素 e ,您将验证是否已解析所有直接依赖项。要验证每个元素 e ,您可以浏览 e 依赖关系列表 D 并确保所有元素 d L 中找到strong> D 。为了解决替代方案的问题,现在将每个 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_d。您可以事先生成这些索引,因为您知道 L 的每个元素的替代数量。您可以在以下代码中使用的MATLAB中查看ndgrid,假设元素 a 有三个依赖项, b 有两个:

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

有关如何使用此类预先计算的索引的参考,与您要在其中实现的语言无关。

答案 1 :(得分:0)

对于非严格依赖,如果它只有两个选择,例如。 s取决于t或u(不再),您可以将其视为2SAT-problem并解决它。