首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Jung的Edmonds Karp获得每条边的流量?

如何使用Jung的Edmonds Karp获得每条边的流量?
EN

Stack Overflow用户
提问于 2020-05-18 22:15:28
回答 1查看 124关注 0票数 0

我正在尝试学习Java上的Max-Flow算法。当我研究的时候,我发现了用于可视化和算法的Jung库,它对我很有效。我可以计算最大流量,但我看不到每条边的计算流量。我想在可视化中将流写到边缘,如下例所示:enter image description here

代码:

代码语言:javascript
复制
import edu.uci.ics.jung.algorithms.flows.EdmondsKarpMaxFlow;
import edu.uci.ics.jung.algorithms.shortestpath.DijkstraShortestPath;
import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;

import edu.uci.ics.jung.graph.util.EdgeType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections15.Factory;
import org.apache.commons.collections15.Transformer;

public class example {
    static int edgeCount = 0;

    DirectedGraph<MyNode, MyLink> g;    

    MyNode n1, n2, n3, n4, n5, n6;

    public example() {       
    }

    public void constructGraph() {
        g = new DirectedSparseMultigraph<MyNode, MyLink>();

        n1 = new MyNode(1); 
        n2 = new MyNode(2); 
        n3 = new MyNode(3);  
        n4 = new MyNode(4); 
        n5 = new MyNode(5);
        n6 = new MyNode(6);

        g.addEdge(new MyLink(10), n1, n2, EdgeType.DIRECTED);
        g.addEdge(new MyLink(10), n1, n3, EdgeType.DIRECTED);
        g.addEdge(new MyLink(2), n2, n3, EdgeType.DIRECTED);
        g.addEdge(new MyLink(4), n2, n4, EdgeType.DIRECTED);
        g.addEdge(new MyLink(8), n2, n5, EdgeType.DIRECTED);
        g.addEdge(new MyLink(9), n3, n5, EdgeType.DIRECTED);
        g.addEdge(new MyLink(6), n5, n4, EdgeType.DIRECTED);
        g.addEdge(new MyLink(10), n4, n6, EdgeType.DIRECTED);
        g.addEdge(new MyLink(10), n5, n6, EdgeType.DIRECTED);

    }


    public void calcMaxFlow() {

        Transformer<MyLink, Double> capTransformer = new Transformer<MyLink, Double>(){
          public Double transform(MyLink link)  {
              return link.capacity;
          }
        };
        Map<MyLink, Double> edgeFlowMap = new HashMap<MyLink, Double>();

        Factory<MyLink> edgeFactory = new Factory<MyLink>() {
            public MyLink create() {
                return new MyLink(1);
            }
        };

        EdmondsKarpMaxFlow<MyNode, MyLink> alg = new EdmondsKarpMaxFlow(g, n1, n6, capTransformer, edgeFlowMap,
                edgeFactory);
        alg.evaluate();
        System.out.println("The max flow is: " + alg.getMaxFlow());

        System.out.println("The edge set is: " + alg.getMinCutEdges().toString());
    }

    public static void main(String[] args) {
        example myApp = new example();
        myApp.constructGraph();
        System.out.println(myApp.g.toString());
        myApp.calcMaxFlow();    
    }

    class MyNode {
        int id;
        public MyNode(int id) {
            this.id = id;
        }
        public String toString() {
            return "V"+id;
        }        
    }

    class MyLink {
        double capacity;
        int id;

        public MyLink(double capacity) {
            this.id = edgeCount++;
            this.capacity = capacity;
        } 

        public String toString() {
            return "E"+id;
        }

    }

}

我看了一下文档(http://jung.sourceforge.net/doc/api/edu/uci/ics/jung/algorithms/flows/EdmondsKarpMaxFlow.html)。当我使用getFlowGraph()时,我只能得到边缘的容量。它没有显示流。我得不到流量。有什么办法解决这个问题吗?谢谢。

(来源:http://www.grotto-networking.com/JUNG/BasicDirectedGraph.java)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-19 10:53:04

一旦evaluate()返回,您的edgeFlowMap将由每条边的流值填充:

EdmondsKarpMaxFlow constructor

无可否认,这有点尴尬,而且不容易发现;有a TODO可以解决这个问题,这个问题应该在3.0版本中解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61871639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档