我有一张无向图。现在,假设图表已完成。每个节点都有一个与之关联的特定值。所有边缘都具有正重量。 我想在任何2个给定节点之间找到路径,使得与路径节点相关联的值的总和最大,同时路径长度在给定阈值内。 解决方案应该是“全局的”,这意味着所获得的路径应该在所有可能的路径中是最佳的。我尝试了一种线性编程方法,但我无法正确地制定它。 任何建议或不同的解决方法都会有很大的帮助。
谢谢!
答案 0 :(得分:1)
这可能不完美,但如果阈值(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想要的!
答案 1 :(得分:1)
如果你在一般图表中寻找算法,你的问题是NP-Complete,假设路径长度阈值是n-1,每个顶点都有值1
,如果你找到问题的解决方案,你可以说给定的图形有哈密尔顿路径与否。实际上,如果最大化的顶点大小路径具有值n
,那么您将拥有哈密尔顿路径。我认为你可以使用类似Held-Karp放松的东西来找到好的解决方案。
答案 2 :(得分:0)
整数计划(这可能是个好主意,也可能不是):
对于每个顶点v,如果访问顶点v,则x v 为1,否则为0。对于每个弧a,让y a 是使用弧a的次数。我们是源头,是目的地。目标是
最大化Σ v 值(v)x v 。
约束是
Σ a 值(a)y a ≤阈值
∀v,Σ a有头v y a - Σ a有尾v y a = {-1如果v = s; 1如果v = t;否则为0(节省流量)
∀v≠x,x v ≤Σ a有头v y a (必须输入一个顶点才能访问)
∀v,x v ≤1(最多访问每个顶点一次)
∀v∉{s,t},∀切割S将顶点v与{s,t}分开,x v ≤Σ a使得尾(a)∉S∧头(a )∈S y a (仅受益于孤立循环上的顶点)。
要解决,请使用松弛值进行分支和绑定。不幸的是,最后一组约束在数量上是指数级的,所以当你解决松弛对偶时,你需要生成列。通常,对于连接问题,这意味着重复使用最小割算法来找到值得执行的剪切。祝你好运!
答案 3 :(得分:0)
如果只是将节点的权重添加到其传出边的权重,则可以忘记节点权重。然后,您可以使用shortest path problem的任何标准算法。