考虑节点和边的图上的路径查找算法

问题描述:

我有一个无向图。现在,假设图形是完整的。每个节点都有一个与之相关的特定值。所有边缘都具有正面权重。 我想找到任意2个给定节点之间的路径,以便与路径节点相关的值的总和最大,同时路径长度在给定阈值内。 解决方案应该是“全局的”,这意味着获得的路径应该在所有可能的路径中最优。我尝试了一种线性编程方法,但无法正确表达它。 任何建议或不同的解决方法将有很大的帮助。考虑节点和边的图上的路径查找算法

谢谢!

+0

你有什么确切的“线性规划”是什么意思? – WeaselFox 2012-03-19 09:25:43

+1

@WeaselFox,[Wikipedia上的线性规划(http://en.wikipedia.org/wiki/Linear_programming) – svick 2012-03-19 09:41:47

+1

你能带环,只要路径长度与阈值? – harold 2012-03-19 10:16:35

这可能并不完美,但如果阈值(T)足够小,则有一个简单的算法运行在O(n^3 T^2)中。这是Floyd-Warshall的一个小修改。

d = int array with size n x n x (T + 1) 
initialize all d[i][j][k] to -infty 
for i in nodes: 
    d[i][i][0] = value[i] 
for e:(u, v) in edges: 
    d[u][v][w(e)] = value[u] + value[v] 

for t in 1 .. T 
    for k in nodes: 
     for t' in 1..t-1: 
      for i in nodes: 
       for j in nodes:   
        d[i][j][t] = max(d[i][j][t], 
            d[i][k][t'] + d[k][j][t-t'] - value[k]) 

The result is the pair (i, j) with the maximum d[i][j][t] for all t in 0..T 

编辑:此假设路径被允许是并不简单,它们可以含有周期。

EDIT2:这也假定如果节点在路径中出现多次,它将被计数多次。这显然不是OP想要的!

+0

这两者有什么关系:'d [i] [k] [t'] + d [k] [j] [t-t']'? 'd [k] [j] [t-t']'的含义是什么? – 2012-03-19 12:19:54

+0

@SaeedAmiri d [i] [j] [k]是节点i和j之间路径上的顶点标签的最大总和,长度恰好为k。 d [i] [k] [t'] + d [k] [j] [t-t']是从i到k和从k到j的两条路径。第一个长度为t',第二个长度为t-t',它们一起构成长度为t的路径。 – aelguindy 2012-03-19 13:04:36

如果您在寻找普通图的算法,您的问题是NP-Complete,假设路径长度阈值为n-1,并且每个顶点的值为1,如果您找到问题的解决方案,则可以说给定的图有哈密尔顿路径。事实上,如果您的最大化顶点大小路径的值为n,那么您有一个哈密尔顿路径。我想你可以使用Held-Karp放松之类的东西来寻找好的解决方案。

+1

我认为如果允许路径不简单,你的减少会失败。我意识到OP没有提到他们寻找的是什么样的路径,但是我认为如果在答案中明确地表达了这一点会更好。 – aelguindy 2012-03-19 13:02:42

+0

@aelguindy,我确定我写了这个简单的路径,但我不知道'OP'的意见,但通常当我们谈论图中的路径时,我们讨论简单的路径(我将你引用到图中的任何教科书理论,前几页说这个)。另外,我的缩减是针对一般图形,但是'OP'表示他的图形目前是完整的,所以我意识到所有方面,但是我看到OP寻找一些线性编程,我认为最好将他/她介绍给一些相关的线性编程。 – 2012-03-19 18:06:36

整数程序(这可能是一个好主意,或者也许不是):

对于每一个顶点v,令x v是1,如果顶点v被访问,否则为0。对于每个弧a,令y a是弧a被使用的次数。让我们成为源头,成为目的地。目标是

最大化∑ v值(V)× v

约束是

一个值()Y 一个 ≤阈 &的forall; V,∑ 一个具有头部Sý一个 - ∑ 一个具有尾vÿ a = {-1如果v = s; 1如果v = t;否则为0(节约流量)
&forall的; v ≠ X,X v ≤ ∑ 一个已头部Sý一个(必须输入一个顶点参观)
&的forall; V,X v ≤ 1 (访问每个顶点最多一次)
&forall的; v ∉ {S,T},&forall的;切口s表示从{S,T}分离顶点v,X v ≤ ∑ 一个,使得尾的(a)∉ S ∧头(a)中∈小号ý一个(从没有对分离的环的顶点仅受益)。

来解决,做分支限界与松弛值。不幸的是,最后一组约束的数量是指数级的,所以当你解决宽松的双重约束时,你需要生成列。通常,对于连接问题,这意味着反复使用最小切割算法来找到值得执行的切割。祝你好运!

+0

现在看起来不错。我会分析这一点,并让你知道我是否有疑问 – arg 2012-03-22 14:38:40

如果你只需要添加一个节点的重量,它的出边的权重,你可以对结点的权忘记。然后,您可以使用shortest path problem的任何标准算法。

+0

但是这里的图表是无向的,所以我必须使它成为一个有向图。其次,边缘权重是节点之间的实际距离,我的路径长度完全取决于这个距离。因此,如果我将节点权重添加到其传出边缘(假设其为有向图),那么如何确保路径长度在阈值内? – arg 2012-03-22 14:37:02

+0

我会考虑这种方法。让我看看我能否重组问题 – arg 2012-03-22 14:39:22