0

Java Jung Graph パ​​ッケージから次のものを構築しようとしています: EdmondsKarp オブジェクト

EdmondsKarpMaxFlow<MyNode, MyLink> alg = new EdmondsKarpMaxFlow<MyNode, MyLink>(g, n2, n5, capTransformer, edgeFlowMap, flowEdgeFactory);

エラーが発生した理由がわかりません。NetBeans からのエラー メッセージは次のとおり
reason: actual argument org.apache.commons.collections15.Transformer<selfsimilarity.MyLink,java.lang.Double> cannot be converted to org.apache.commons.collections15.Transformer<selfsimilarity.MyLink,java.lang.Number> by method invocation conversionです。

私は基本的にチュートリアルに従っています。

EdmondsKarpMaxFlow のインスタンス化は、コンストラクターの下部にあります。コンストラクターの後で、すべてのパラメーターのコードを EdmondsKarp オブジェクトに渡します。これらのパラメーターは、グラフ、ソース ノードとシンク ノード、容量トランスフォーマー、マップ、およびエッジ ファクトリです。

public GraphAlgTests()
    {
        g = new DirectedSparseMultigraph<MyNode, MyLink>();
        // Create some MyNode objects to use as vertices
        MyNode n1 = new MyNode(1); MyNode n2 = new MyNode(2); MyNode n3 = new MyNode(3);  
        MyNode n4 = new MyNode(4); MyNode n5 = new MyNode(5); 
        // Add some directed edges along with the vertices to the graph
        g.addEdge(new MyLink(2.0, 48),n1, n2, EdgeType.DIRECTED); // This method
        g.addEdge(new MyLink(2.0, 48),n2, n3, EdgeType.DIRECTED);
        g.addEdge(new MyLink(3.0, 192), n3, n5, EdgeType.DIRECTED); 
        g.addEdge(new MyLink(2.0, 48), n5, n4, EdgeType.DIRECTED); // or we can use
        g.addEdge(new MyLink(2.0, 48), n4, n2); // In a directed graph the
        g.addEdge(new MyLink(2.0, 48), n3, n1); // first node is the source 
        g.addEdge(new MyLink(10.0, 48), n2, n5);// and the second the destination

        EdmondsKarpMaxFlow<MyNode, MyLink> alg = new EdmondsKarpMaxFlow<MyNode, MyLink>(g, n2, n5, capTransformer, edgeFlowMap, flowEdgeFactory);
    }

public class MyNode 
{
    private int id; // good coding practice would have this as private
    public MyNode(int id) 
    {
        this.id = id;
    }
    public String toString() 
    {                        // Always a good idea for debuging
        return "v"+id;       // JUNG2 makes good use of these.
    }        
}


public class MyLink 
{
    double capacity; // should be private 
    double weight;   // should be private for good practice
    int id;
    int edgeCount = 0;

    public MyLink(double weight, double capacity) 
    {
        this.id = edgeCount++; 
        this.weight = weight;
        this.capacity = capacity;
    } 
    public String toString() 
    { // Always good for debugging
        return "E"+id;
    }
}

   Transformer<MyLink, Double> capTransformer = new Transformer<MyLink, Double>()
   //INFO: Gives the capacity of an edge, denoted here as a "link"
   {
       @Override
       public Double transform(MyLink link)
       {
           return link.capacity;
       }
   };

   Map<MyLink, Double> edgeFlowMap = new HashMap<MyLink, Double>();
   Factory<MyLink> flowEdgeFactory = new Factory<MyLink>()
   {
        @Override
        public MyLink create()
        {
            return new MyLink(1.0, 1.0);
        }
   };

他に役立つことがあれば、お知らせください。助けてくれてありがとう!

4

1 に答える 1

2

そのコンストラクターのJavadocがあなたに伝えていることを正確に伝えています:

public EdmondsKarpMaxFlow(DirectedGraph<V,E> directedGraph,
                          V source,
                          V sink,
                          org.apache.commons.collections15.Transformer<E,Number> edgeCapacityTransformer,
                          Map<E,Number> edgeFlowMap,
                          org.apache.commons.collections15.Factory<E> edgeFactory)

あなたTransformer<MyLink, Double>それが必要なときです<MyLink, Number>(そしてそのtransform()中のあなたのメソッドは a を返すように定義する必要がありますNumber

これはおそらく API のある時点で変更されており、使用しているチュートリアルは古くなっています。多くの場合、API は返されるオブジェクトに対して呼び出しdoubleValue()を行っています。Number

同じことがあなたedgeFlowMapにも当てはまるようです。

于 2012-12-29T19:31:09.430 に答える