如何从具有独占子集的有向非循环图中查询

时间:2011-09-22 21:22:44

标签: algorithm graph-theory dependency-management directed-acyclic-graphs

抽象术语的问题:

我有一个有向无环图(DAG),它包含查询时排他的顶点子集(查询结果中每个子集只有一个项目)。当我查询图形结构时,我想获得从给定顶点流出的顶点集合,同时仅从图形中已知顶点子集中选择单个项目。

具体问题:

我有一个存储我的程序集(顶点)及其依赖项(边)的DAG。给定一个程序集或一组程序集,我需要查询以获取所有涉及的程序集及其依赖项的集合。困难的部分是每个程序集都有多个版本,并且只能将一个程序集的一个实例加载到一个进程中。给定程序集的依赖关系在程序集的各个版本之间发生变化。

这个问题或一组问题是否有名称?我可以研究一种标准算法来找到解决方案吗?


可能的解决方案领域:

传递闭包似乎接近于一个好的解决方案,但从子集(程序集版本)中选择的项目将根据通过图表的路径而改变,可能通过多个分支,因此您几乎需要跟踪通过图表的路径以生成传递闭包。

图形数据库可能会提供相当多的帮助,但除非我们绝对不得不这样做,否则我们现在要避免走这条路。

1 个答案:

答案 0 :(得分:1)

我认为从给定选项流出的顶点集看起来很混乱,因为实际上存在潜在的优化或满足问题:给定程序集A,您可以通过B1或B2或B3满足其依赖关系,以及每个然后选择会产生连锁反应。

如果我们将此视为逻辑满足问题,那么我们可以考虑一个问题,其中程序集只有两个版本,例如: A1或A2。然后,诸如(a或b或非c)之类的子句将转换为需要A1或B1或C2的上层程序集 - 可能间接通过X1,X2和X3 - 并且子句的连接将转换为上层需要所有高级程序集的级别程序集。所以我认为如果你能有效地解决一般问题,你可以有效地解决3-SAT,然后P = NP。

奇怪的是,如果你没有限制,你只允许每种类型的一个集合(A1或A2或A3,但一次不止一个),那么问题就很容易转化为Horn子句(Knuth Vol 4)第7.1.1节P 57)可以有效地解决可满足性问题。为此,您使用自然变量的倒数,因此X1表示不包括A1。然后,如果您将Horn子句版本视为一种放松问题的方法,通过忽略每个程序集的最多一个版本可以支持的约束,您得到的是一种机制,用于告诉您某些程序集版本A1 不能在解决方案中,因为X1 =非A1在Horn解决方案的核心中是真的,因此在每个令人满意的任务中都是正确的。