我有一个计算问题,在给定一组观察的情况下,我想确定考虑所有观察的最小现象集(解释)。现象可以相互引起,也就是说所有现象都可以表示为一个没有因子关系作为边缘的未加权的有向图。
我得到以下内容:
下面以图表的形式表示问题(对图片的质量感到抱歉)。每个节点都是一个现象,每个边缘代表现象之间的因果关系。边缘没有加权。由更大的“泡沫”勾勒出的每个区域代表一种可能的观察,泡沫中的所有现象都是已知导致该观察的现象的子集。
重申的问题是找到跨越图中所有区域的最短路径。 (为简单起见,假设有一条解释所有观察结果的唯一路径 - 没有分支,不需要多条路径。)
我的问题如下:
如果它对计算可行性有帮助,观察数量大约为10,000,可能现象的数量大约为100,000。
答案 0 :(得分:2)
既不会导致观察也不会导致其他现象的现象不会出现在任何最小答案中,因此我们可以假设它们中没有任何一种。换句话说,传递任何算法之一就是摆脱这些"无用的"现象。
有了这个假设,我们就像任何其他顶点一样对待观察。由于观察没有任何结果,所有观察结果都是叶顶点。由于所有现象都会引起某些现象(参见步骤1),因此没有现象是叶顶点。因此,我们可以简化问题陈述,并简单地讨论有向图的叶顶点。
一般来说,没有一条路径能够击中每片叶子的至少一个分支顶点。相反,提出问题的更好方法是寻找跨越所有叶顶点的某种最小图,但不必跨越现象。
这是图表上Steiner Tree Problem的变体。它是NP完全的。大多数变体也是NP完全的。你得到的最好的希望是足够好的东西,即近似算法。
你没有明确说明这个假设,但似乎你假设没有现象的循环因果关系(例如A导致B导致C再次导致A)。在这种情况下,您的问题出现在有向无环图上,但这并没有帮助。有针对性的问题和无向问题一样困难。
答案 1 :(得分:1)
这是一个结合哈密顿路径问题的集合覆盖探测器。让我解释一下:由于每个现象都与一组观察有关,因此您可以将每个现象看作集合覆盖问题中的一组。我们需要检查一起覆盖所有观察的每组现象,看看这个群体是否存在哈密尔顿路径,即 - 有一条包含群体中所有现象的简单路径。
一种方法是找到最小的集合覆盖(=现象组)并检查该组是否存在哈密顿路径。然后继续下一个(相等或更大)的封面,并进行相同的检查,依此类推,直到我们找到一个具有哈密顿路径的套盖。这将是涵盖所有观察的最小的一组现象,并且有一条简单的路径可以覆盖整个群体中的所有现象。