2014-03-26 6 views
0

Я видел примеры jgraph и jgrapht, и там легко следовать, но теперь я уверен, как я буду использовать CompleteBipartiteGraph? Как использовать синтаксис для создания экземпляра графа?Java JGrapht Bipartite graph

http://jgrapht.org/javadoc/

http://jgrapht.org/javadoc/org/jgrapht/generate/CompleteBipartiteGraphGenerator.html

+0

Похоже, это довольно просто в использовании. (Конечно, это впечатление может быть ошибочным, но) кажется, что вы просто создаете экземпляр этого генератора, а затем вызываете 'generateGraph' с (первоначально пустым) графом, который получает вершины и ребра, созданные этим заводы. Не могли бы вы указать, что вы пробовали до сих пор и где вы застряли? – Marco13

+0

Позвольте мне спросить вас об этом. У меня есть список каждой вершины и соответствующей вершины этой соответствующей вершины. Поэтому одна сторона графика должна иметь несколько строк, идущих в несколько вершин справа. Является ли эта концепция и структура правильной для графического отображения двудольных? Какую структуру данных следует использовать, список массивов? Таким образом, это будет выглядеть так: V -> V1, V2, V3. – MAXGEN

+0

Я не понял ваш вопрос. Используя этот генератор с параметрами (5,3), вы должны создать полный двудольный граф, как в примере (верхнее правое изображение) по адресу http://en.wikipedia.org/wiki/Complete_bipartite_graph ... – Marco13

ответ

1

В ответ на вопрос "Могу ли я по-прежнему использовать этот генератор?" из комментария: вы все равно можете использовать его для создания полного двудольного графа, а затем случайным образом удалить некоторые ребра.

Но более простой подход состоял бы в том, чтобы просто сгенерировать два набора вершин и вставить между ними случайные ребра. Фактически, это так легко, что я есть, чтобы предположить, что есть дополнительные ограничения, о которых вы не упоминали до сих пор. Я вставил другой способ, в котором он удостоверился, что двудольный граф не содержит изолированные вершины (мой хрустальный шар сказал бы сделать это ...)

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import org.jgrapht.Graph; 
import org.jgrapht.UndirectedGraph; 
import org.jgrapht.VertexFactory; 
import org.jgrapht.graph.DefaultEdge; 
import org.jgrapht.graph.SimpleGraph; 

public class BipartiteGraphTest 
{ 
    public static void main(String[] args) 
    { 
     UndirectedGraph<String, DefaultEdge> graph = 
      new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); 

     VertexFactory<String> vertexFactory = new VertexFactory<String>() 
     { 
      int n = 0; 
      @Override 
      public String createVertex() 
      { 
       String s = String.valueOf(n); 
       n++; 
       return s; 
      } 
     }; 
     int numVertices0 = 10; 
     int numVertices1 = 15; 
     int numEdges = 20; 
     generateGraph(graph, numVertices0, numVertices1, numEdges, vertexFactory); 

     System.out.println(graph); 
    } 

    // Creates a bipartite graph with the given numbers 
    // of vertices and edges 
    public static <V, E> void generateGraph(Graph<V, E> graph, 
     int numVertices0, int numVertices1, int numEdges, 
     final VertexFactory<V> vertexFactory) 
    { 
     List<V> vertices0 = new ArrayList<V>(); 
     for (int i = 0; i < numVertices0; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices0.add(v); 
     } 
     List<V> vertices1 = new ArrayList<V>(); 
     for (int i = 0; i < numVertices1; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices1.add(v); 
     } 

     // Create edges between random vertices 
     Random random = new Random(0); 
     while (graph.edgeSet().size() < numEdges) 
     { 
      int i1 = random.nextInt(vertices1.size()); 
      V v1 = vertices1.get(i1); 
      int i0 = random.nextInt(vertices0.size()); 
      V v0 = vertices0.get(i0); 
      graph.addEdge(v0, v1); 
     } 

    } 

    // Creates a bipartite graph with the given numbers 
    // of vertices and edges without isolated vertices 
    public static <V, E> void generateGraphNoIsolatedVertices(
     Graph<V, E> graph, int numVertices0, int numVertices1, int numEdges, 
     final VertexFactory<V> vertexFactory, 
     List<V> vertices0, List<V> vertices1) 
    { 
     int minNumEdges = Math.max(numVertices0, numVertices0); 
     if (numEdges < minNumEdges) 
     { 
      System.out.println("At least " + minNumEdges + " are required to " + 
       "connect each of the " + numVertices0 + " vertices " + 
       "to any of the " + numVertices1 + " vertices"); 
      numEdges = minNumEdges; 
     } 

     for (int i = 0; i < numVertices0; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices0.add(v); 
     } 
     for (int i = 0; i < numVertices1; i++) 
     { 
      V v = vertexFactory.createVertex(); 
      graph.addVertex(v); 
      vertices1.add(v); 
     } 

     // Connect each vertex of the larger set with 
     // a random vertex of the smaller set 
     Random random = new Random(0); 
     List<V> larger = null; 
     List<V> smaller = null; 


     if (numVertices0 > numVertices1) 
     { 
      larger = new ArrayList<V>(vertices0); 
      smaller = new ArrayList<V>(vertices1); 
     } 
     else 
     { 
      larger = new ArrayList<V>(vertices1); 
      smaller = new ArrayList<V>(vertices0); 
     } 
     List<V> unmatched = new ArrayList<V>(smaller); 
     for (V vL : larger) 
     { 
      int i = random.nextInt(unmatched.size()); 
      V vS = unmatched.get(i); 
      unmatched.remove(i); 
      if (unmatched.size() == 0) 
      { 
       unmatched = new ArrayList<V>(smaller); 
      } 
      graph.addEdge(vL, vS); 
     } 

     // Create the remaining edges between random vertices 
     while (graph.edgeSet().size() < numEdges) 
     { 
      int i0 = random.nextInt(vertices0.size()); 
      V v0 = vertices0.get(i0); 
      int i1 = random.nextInt(vertices1.size()); 
      V v1 = vertices1.get(i1); 
      graph.addEdge(v0, v1); 
     } 

    } 


} 
+0

Спасибо. Я буду работать над этим. Его прямой подход с использованием библиотеки и, вероятно, с чем я буду работать. Я разбираю аптечный банк и делаю IDS наркотиков, которые представляют собой строки, показывающие взаимосвязь между ферментами друг друга, у них также есть строки для идентификаторов. Таким образом, график не строит сравнение. Мне нужно сделать это сам, а затем повторить так же, как и делать, и сделать вершины и края? – MAXGEN

+0

@MAXGEN Если это был вопрос, вы должны попытаться перефразировать его. По крайней мере, я не понял. – Marco13

+0

Я открываю другой вопрос, если вы можете помочь, и это может иметь больше смысла. https://stackoverflow.com/questions/22703918/java-jgraph-applet-visualize-bipartite-graph – MAXGEN