【问题标题】:R: Ford-Fulkerson maximum flow step-by-step calculation?R:Ford-Fulkerson 最大流量分步计算?
【发布时间】:2020-05-19 20:47:39
【问题描述】:

我目前正在研究基于 R 文档中的此代码的 Ford-Fulkerson 算法:

nodes <- 1:6
arcs <- matrix(c(1,2,1, 1,3,7, 2,3,1, 2,4,3, 2,5,2, 3,5,4, 4,5,1, 4,6,6,
                5,6,2), byrow = TRUE, ncol = 3)
# Maximum flow with Ford-Fulkerson algorithm
maxFlowFordFulkerson(nodes, arcs, source.node = 2, sink.node = 6)

&得到以下结果:

$`s.cut`
[1] 2 3 1 5

$t.cut
[1] 4 6

$max.flow
[1] 6

结果中表明该网络的最大流量为6。

但是,我一直在尝试手动计算最大流量,无论我做什么,我得到的最大流量都只有 5。

这是我能够根据代码示例绘制的可能图表:

&我能够得到的一些可能的流程:

2 --> 4 --> 5 --> 6........[容量:1]

2 --> 5 --> 4 --> 6(回流)...[容量:1]

2 --> 5 --> 6.................................[容量:1]

2 --> 4 --> 6..........................[容量:2]

[总容量:5]

或者

2 --> 3 --> 5 --> 6........[容量:1]

2 --> 4 --> 5 --> 6........[容量:1]

2 --> 5 --> 4 --> 6(回流)...[容量:1]

2 --> 4 --> 6.............................[容量:2]

[总容量:5]

我误解了这个过程吗?任何人都可以写下逐步获得最大流量 6 的路径吗?

【问题讨论】:

    标签: r algorithm max flow ford-fulkerson


    【解决方案1】:

    我认为你的是正确的(最大流量应该是5)。也许您可以尝试igraph 进行交叉检查,例如,

    df <- as.data.frame(`colnames<-`(arcs,c("from","to","capacity")))
    g <- graph_from_data_frame(df)
    res <- max_flow(g,2,6)
    

    给了

    > res
    $value
    [1] 5
    
    $flow
    [1] 0 0 0 3 2 0 0 3 2
    
    $cut
    [1] 4 9
    
    $partition1
    + 4/6 vertices, named, from bfc5f42:
    [1] 1 2 3 5
    
    $partition2
    + 2/6 vertices, named, from bfc5f42:
    [1] 4 6
    
    $stats
    $stats$nopush
    [1] 4
    
    $stats$norelabel
    [1] 3
    
    $stats$nogap
    [1] 2
    
    $stats$nogapnodes
    [1] 2
    
    $stats$nobfs
    [1] 1
    

    【讨论】:

    • 我在其他在线示例上尝试了 optree 的 maxFlowFordFulkerson 并获得了额外的值......但是,到目前为止,igraph 的 max_flow 对所有问题都很有效。 max_flow 似乎是一个更准确的函数,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 2014-05-14
    • 2020-03-26
    • 2012-07-02
    • 2011-05-04
    • 2012-05-23
    相关资源
    最近更新 更多