BarabasiAlbertGenerator реализация - PullRequest
       24

BarabasiAlbertGenerator реализация

0 голосов
/ 13 декабря 2018

Я хотел реализовать BarabasiAlbertGenerator для генерации графа.После создания всех объектов Factory в методе main и изменения Object (V, E) на (Integer, String) в классе генератора две ошибки меня беспокоили после внесения всех возможных изменений.1. index_vertex.put (v, i);несоответствие типов 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);


}

1 Ответ

0 голосов
/ 13 декабря 2018

Не думаю, что вы хотите использовать 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;
...