我有一个无向图。暂且假设该图是完全的。每个节点都有一个与之关联的特定值。所有边都有正权重。
我想找到任意两个给定节点之间的一条路径,使得路径节点的值之和最大,并且路径长度在给定的阈值内。
解决方案应该是“全局”的,也就是说,获得的路径应该是所有可能路径中最优的。我尝试了线性规划方法,但无法正确地制定它。
任何建议或不同的解决方法都将非常有帮助。
谢谢!
谢谢!
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
编辑:这假设路径可以不简单,它们可以包含环。
编辑2:这还假设如果一个节点在路径中出现多次,则将被计算多次。显然这不是原帖作者想要的!
d[i][k][t'] + d[k][j][t-t']
?d[k][j][t-t']
的意思是什么? - Saeed Amiri整数规划(这可能是个好主意,也可能不是):
对于每个顶点v,如果访问了顶点v,则令xv为1,否则为0。对于每条弧a,令ya为弧a被使用的次数。令s为源点,t为汇点。目标是
最大化 ∑v value(v) xv。
约束条件为
∑a value(a) ya ≤ 阈值
对于所有的v, ∑a有头v ya - ∑a有尾v ya = {-1 如果v = s; 1 如果v = t; 否则为0(流量守恒)}
对于所有的v ≠ x,xv ≤ ∑a有头v ya (必须进入一个顶点才能访问)
对于所有的v,xv ≤ 1(每个顶点最多访问一次)
对于所有不属于{s, t}的v,对于分离v和{s, t}的割S,xv ≤ ∑a使得tail(a) ∉ S ∧ head(a) ∈ S ya (仅从不在孤立环上的顶点中受益)。
要解决这个问题,需要使用松弛值进行分支和界限。不幸的是,最后一组约束条件的数量呈指数级增长,因此在解决松弛的对偶问题时,你需要生成列。通常对于连通性问题而言,这意味着需要反复使用最小割算法来找到值得实施的割。祝你好运!
如果您只是将节点的权重添加到其出边的权重中,那么您可以忽略节点权重。然后,您可以使用任何标准算法来解决最短路径问题。