如何在流网络中的每个接收器中查找最终存储量?

时间:2017-06-26 18:24:41

标签: algorithm graph-theory max-flow

我有一个带有单源和多个接收器的流网络。如果我从源流出1加仑的水,那么所有的水在节点处分裂并最终存储在不同的水槽中。这里每个边缘重量c(u,v)代表u的水分解比。如何在每个水槽中找到最终存储的水量?

手动计算的示例:

Example of the problem

1 个答案:

答案 0 :(得分:1)

这是absorbing Markov chain的一个例子。

设Q [j,i]是从第j个非汇聚节点到第i个非汇聚节点的流量比例。

令R [j,i]为从第j个非汇聚节点到第i个汇聚节点的流量比例。

然后让矩阵N = inv(I-Q),矩阵B = N * R。

第i个汇聚节点中的最终流量由B [0,i]给出。

第一个案例的Python示例:

import numpy as np

# Rows are proportion of flow out of each non-sink vertex
Q = np.zeros((3,3))
Q[0,:] = 0,0.3,0.7 # Flow out of S
Q[1,:] = 0,0,0     # Flow out of a
Q[2,:] = 0,0.5,0   # Flow out of b
# Rows are flow from non-sink to sink nodes
R = np.zeros((3,2))
R[1,:] = 0.1,0.9
R[2,:] = 0,0.5 
N = np.matrix(np.identity(len(Q)) - Q).I
B = N*R
print B[0,:]

打印

[[ 0.065  0.935]]

说明

一旦我们设置了矩阵,我们就可以通过从包含[1,0,0](代表开始时的一加仑)和空行向量e的行向量v开始来模拟流程的一个时间步长(代表水槽中的水量。)

在每个时间步中我们计算:

e += v * R # This works out the amount of flow that has reached the end
v = v * Q # This works out the amount of flow that is still in the network

如果我们模拟这个时间足够长,我们最终会接近0,接近答案。

但是我们可以将e的值写为:

e = v*R + v*Q*R + v*Q*Q*R + v*Q*Q*Q*R +...
  = v * (I + Q + Q*Q + Q*Q*Q + ...) * R
  = v * inv(I-Q) * R
  = v * N * R
  = v * B
  = [1,0,0] * B
  = first row of B