我正试图在 R
中实施“Minimum Cost Network Flow”运输问题解决方案 .
我知道这可以使用像 lpSolve
这样的东西从头开始实现 . 但是,我看到“Maximum Flow”有一个方便的 igraph
实现 . 这样一个预先存在的解决方案会更方便,但我找不到最低成本的等价函数 .
是否有 igraph
函数计算最低成本网络流量解决方案,或者有没有办法将 igraph::max_flow
函数应用于最低成本问题?
igraph
网络示例:
library(tidyverse)
library(igraph)
edgelist <- data.frame(
from = c(1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8),
to = c(2, 3, 4, 5, 6, 4, 5, 6, 7, 8, 7, 8, 7, 8, 9, 9),
capacity = c(20, 30, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99),
cost = c(0, 0, 1, 2, 3, 4, 3, 2, 3, 2, 3, 4, 5, 6, 0, 0))
g <- graph_from_edgelist(as.matrix(edgelist[,c('from','to')]))
E(g)$capacity <- edgelist$capacity
E(g)$cost <- edgelist$cost
plot(g, edge.label = E(g)$capacity)
plot(g, edge.label = E(g)$cost)
这是具有有向边的网络,“源节点”(1)和“汇聚节点”(9) . 每个边缘都有一个“容量”(这里通常设为99无限制)和一个“成本”(一个单位流过这个边缘的成本) . 我想找到流量的整数向量(x,长度= 9),它可以在通过网络传输预定义流量时最小化成本(比如从节点1到节点9的50个单位) .
Disclaimer :this post问了一个类似的问题,但没有得到令人满意的答案而且相当陈旧(2012) .
2 回答
如果有兴趣,以下是我最终解决这个问题的方法 . 我使用带有
to
节点的边数据帧,每个边的from
个节点,cost
属性和capacity
属性来创建约束矩阵 . 随后,我使用lpSolve
包将其转换为线性优化 . 一步一步下面 .从上面示例中的edgelist数据框开始
看起来像这样:
创建约束矩阵
应该导致这样的事情
为理想的解决方案提供约束
lpSolve
现在我们可以将边缘转换为图形对象并绘制解决方案
希望它有趣/有用:)
我正在寻找一个功能,但没有成功 . 原始函数调用另一个:
res <- .Call("R_igraph_maxflow", graph, source - 1, target - 1, capacity, PACKAGE = "igraph")
我不知道如何处理它 .
目前我 inverted 成本路径值,以便在对面方向使用相同的功能:
我在纸上绘制图表,我的代码同意手动解决方案这个方法应该用真实的知识值进行测试,正如我在评论中提到的那样