在图表中,找到具有特定属性的最长路径?

时间:2014-09-17 13:22:14

标签: algorithm graph graph-theory longest-path

我有一个有向图(更具体地说,一个控制流图),每个顶点都有一组属性。

我想找到(或写入)一个算法,在给定具有属性V的顶点P的情况下,找到到某个顶点E的最长路径,这样<从allV的{​​{1}}个可能路径中的em>所有顶点包含属性E

示例1

说我有以下图表。 (请原谅糟糕的ascii绘图。)

P

+----+ +--------+P +--------+ | +----+ | | V1 | | | | | +--v--+ | +----+P ++ | | +-----++ +--v--+ | | +----+P | | | | +-----+ +--v--+ +--v--+ | |P +-+ +-+P | | +-----+ | | +-----+ | | | | | | | +v-v--+ | V6 |P +---------+ | +-----+ | | | | | | | | | | +-v--v-+ V7 |P | +---+--+ | | +---v--+ V8 |!P | +------+ 开始,V1始终在所有可能路径上保留的最长路径为P - &gt; V1。请注意其他路径,例如V7 - &gt; V1,&#34;有效&#34;因为V6总是成立,但是P - &gt; V1是最长的。

示例2

此示例与上述内容相同,但现在V7未在P中保留:

V3

在这种情况下,从 +----+ +--------+P +--------+ | +----+ | | V1 | | | | | +--v--+ | +----+P ++ | | +-----++ +--v--+ | | +----+!P | V3 | | | +-----+ +--v--+ +--v--+ | |P +-+ +-+P | | +-----+ | | +-----+ | | | | | | | +v-v--+ | V6 |P +---------+ | +-----+ | | | | | | | | | | +-v--v-+ V7 |P | +---+--+ | | +---v--+ V8 |!P | +------+ 开始,V1始终在所有可能路径中保留的最长路径为P - &gt; V1。路径V6 - &gt; V1无效,因为V7V1之间存在V7不存在的路径。

关于我的情况的进一步说明

  • 图表可能是循环的。
  • 图表将是&#34;中小型&#34;大小,可能有1000个顶点或更少。
  • 图表不一定总是有一个根和一个叶子,就像上面的例子一样。

问题

是否有用于计算此类路径的标准算法?

1 个答案:

答案 0 :(得分:3)

问题没有已知的有效解决方案,因为它很容易从Hamiltonian Path Problem缩小,它说 - 给定图表 - 是否有一条路径通过所有顶点一次?

减少很简单 - 给定哈密顿路径问题,用p标记所有节点,并找到最长路径。由于哈密顿路径是NP-Complete,这个问题也是如此,并且没有已知的多项式解。

另一种方法是使用brute-force search(最简单的形式是生成所有排列并选择最有效的排列) - 但对于大型图形而言,这将变得不可能。您可能还需要考虑使用启发式方法(找到“好”解决方案,但不是最优解决方案),如遗传算法。
另一种可能的解决方案是将问题减少到Traveling Salesman Problem,并使用一些现有的TSP求解器。请注意,虽然这个问题也是NP难的,但由于它经过深入研究,因此对于中等大小的图形有一些非常有效的解决方案。

另外,如果你的图形恰好是“特殊的”(例如DAG),你可以利用一些智能技术来实现多项式时间的显着加速,如动态编程。