1

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

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

  1. 确定给定的一组元素是否已解决所有依赖关系
  2. 列出所有可能的完全解析的元素集

(事实上​​ 2 在给定 1 的情况下是微不足道的,因为我可以在资源允许的情况下生成所有排列并检查它们。不过可能有更好的算法。)

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

4

2 回答 2

1

假设您的元素列在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_ds。您可以预先生成这些索引,因为您知道L的每个元素的备选数量。您可以在 MATLAB 中签出ndgrid,如以下代码所示,假设元素a具有三个依赖项,而b具有两个:

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

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

于 2013-01-22T03:17:59.487 回答
0

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

于 2013-01-22T03:27:26.950 回答