首页 > 解决方案 > BarabasiAlbertGenerator 实现

问题描述

我想实现 BarabasiAlbertGenerator 来生成图形。在 main 方法中创建所有 Factory 对象并将生成器类中的 Objects (V, E) 更改为 (Integer, String) 后,在进行所有可能的修改后,两个错误让我担心。1. index_vertex.put(v, i); type mismatch 2. index_vertex.put(newVertex, new Integer(vertex_index.size() - 1));// Integer 的对象不能被实例化。我做了几次铸造错误仍然出现。请任何有关如何纠正错误的帮助。

    public class BarabasiAlbertGenerator<Integer, String> implements EvolvingGraphGenerator<Integer, String> {


    mGraph = graphFactory.create();

    vertex_index = new ArrayList<Integer>(2*init_vertices);
    index_vertex = new HashMap<Integer, Integer>(2*init_vertices);
    for (int i = 0; i < init_vertices; i++) {
        Integer v = vertexFactory.create();
        mGraph.addVertex(v);
        vertex_index.add(v);
        index_vertex.put(v, i);
        seedVertices.add(v);
    }

    mElapsedTimeSteps = 0;
}

    for (Pair<Integer> pair : added_pairs)
    {
        Integer v1 = pair.getFirst();
        Integer v2 = pair.getSecond();
        if (mGraph.getDefaultEdgeType() != EdgeType.UNDIRECTED || 
                !mGraph.isNeighbor(v1, v2))
            mGraph.addEdge(edgeFactory.create(), pair);
    }
    // now that we're done attaching edges to this new vertex, 
    // add it to the index
    vertex_index.add(newVertex);
    index_vertex.put(newVertex, new Integer(vertex_index.size() - 1));
}




    public static void main(String[] args) {
                SparseGraph<Integer, String> sir = new SparseGraph<Integer, String>();
        ConstantFactory<Graph<Integer, String>> graphFactory = new ConstantFactory<Graph<Integer, String>>(sir);
        InstantiateFactory<Integer> vertexFactory = new InstantiateFactory<Integer>(Integer.class);
        InstantiateFactory<String> edgeFactory = new InstantiateFactory<String>(String.class);
        HashSet<Integer> seedVertices = new HashSet<Integer>();
            int evolve = 1;
            int node = 10;
            int agents = 100;

            BarabasiAlbertGenerator<Integer, String> bbr = new BarabasiAlbertGenerator<Integer, String>(graphFactory, vertexFactory, edgeFactory, agents, node, seedVertices);
            bbr.evolveGraph(evolve);
            Layout<Integer, String> layout = new CircleLayout(sir);
            layout.setSize(new Dimension(300,300));
            BasicVisualizationServer<Integer,String> vv =
            new BasicVisualizationServer<Integer,String>(layout);
            vv.setPreferredSize(new Dimension(350,350));
            // Setup up a new vertex to paint transformer...
            Transformer<Integer,Paint> vertexPaint = new Transformer<Integer,Paint>() {
            public Paint transform(Integer i) {
            return Color.GREEN;
            }
            };
            // Set up a new stroke Transformer for the edges
            float dash[] = {10.0f};
            final Stroke edgeStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,
            BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
            Transformer<String, Stroke> edgeStrokeTransformer =
            new Transformer<String, Stroke>() {
            public Stroke transform(String s) {
            return edgeStroke;
            }
            };
            vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
            vv.getRenderContext().setEdgeStrokeTransformer(edgeStrokeTransformer);
            vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
            //vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
            vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
            JFrame frame = new JFrame("Undirected Graph ");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(vv);
            frame.pack();
            frame.setVisible(true);


}

标签: junitjunit4eclipse-junojung

解决方案


我认为您不想使用 InstantiateFactory。

在将程序更改为如下所示(主要是顶点和边缘工厂)后,我能够运行您的程序:

        public static void main(String[] args) {
            SparseGraph<Integer, String> sir = new SparseGraph<Integer, String>();
            ConstantFactory<Graph<Integer, String>> graphFactory = new ConstantFactory<Graph<Integer, String>>(sir);
            Factory<Integer> vertexFactory = new Factory<Integer>() {
                    int i = 0;
                    public Integer create() {
                            return i++;
                    }
            };
            Factory<String> edgeFactory = new Factory<String>() {
                    int i = 0;
                    public String create() {
                            return "" + i++;
                    }
            };
            HashSet<Integer> seedVertices = new HashSet<Integer>();
            int evolve = 1;
            int node = 10;
            int agents = 100;

            BarabasiAlbertGenerator<Integer, String> bbr = new BarabasiAlbertGenerator<Integer, String>(graphFactory, vertexFactory, edgeFactory, agents, node, seedVertices);
            bbr.evolveGraph(evolve);
            Layout<Integer, String> layout = new CircleLayout(sir);
            layout.setSize(new Dimension(300, 300));
            BasicVisualizationServer<Integer, String> vv =
                    new BasicVisualizationServer<Integer, String>(layout);
            vv.setPreferredSize(new Dimension(350, 350));
            // Setup up a new vertex to paint transformer...
            Transformer<Integer, Paint> vertexPaint = new Transformer<Integer, Paint>() {
                    public Paint transform(Integer i) {
                            return Color.GREEN;
                    }
            };
            // Set up a new stroke Transformer for the edges
            float dash[] = {10.0f};
            final Stroke edgeStroke = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,
                    BasicStroke.JOIN_MITER, 10.0f, dash, 0.0f);
            Transformer<String, Stroke> edgeStrokeTransformer =
                    new Transformer<String, Stroke>() {
                            public Stroke transform(String s) {
                                    return edgeStroke;
                            }
                    };
            vv.getRenderContext().setVertexFillPaintTransformer(vertexPaint);
            vv.getRenderContext().setEdgeStrokeTransformer(edgeStrokeTransformer);
            vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
            //vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());
            vv.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.CNTR);
            JFrame frame = new JFrame("Undirected Graph ");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(vv);
            frame.pack();
            frame.setVisible(true);


    }

确保您的导入是正确的。我用了这些:

import edu.uci.ics.jung.algorithms.generators.random.BarabasiAlbertGenerator;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.SparseGraph;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.Renderer;
import org.apache.commons.collections15.Factory;
import org.apache.commons.collections15.Transformer;
import org.apache.commons.collections15.functors.ConstantFactory;

import javax.swing.*;
import java.awt.*;
import java.util.HashSet;

推荐阅读