2017-04-21 5 views
1

J'espère que vous allez bien! J'essaye de coder un programme où j'ai besoin de créer un graphique pondéré dynamique et obtenir le chemin le plus court d'un sommet à l'autre. Mais après l'exécution du programme, je reçois cette exception:JGrapht: erreur de graphique dynamique après l'ajout des sommets et des arêtes

run: 
TEST1 
TEST Vertex Add 
Exception in thread "main" java.lang.IllegalArgumentException: no such vertex in graph: 1 
at org.jgrapht.graph.AbstractGraph.assertVertexExist(AbstractGraph.java:132) 
at org.jgrapht.graph.AbstractBaseGraph.addEdge(AbstractBaseGraph.java:141) 
at dijkstra.Dijkstra.main(Dijkstra.java:26) 
C:\Users\Lucas\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1 
BUILD FAILED (total time: 0 seconds) 

Voici le code:

import org.jgrapht.*; 
    import org.jgrapht.alg.*; 
    import org.jgrapht.graph.*; 
    import java.util.List; 
    import java.util.concurrent.ThreadLocalRandom; 
    import org.jgrapht.alg.shortestpath.DijkstraShortestPath; 

    public class Dijkstra { 
public static void main(String args[]) { 

    SimpleWeightedGraph<String, DefaultWeightedEdge> graph = new SimpleWeightedGraph<String, DefaultWeightedEdge>(DefaultWeightedEdge.class); 

    int i = generateNumberByRange(1,5); 

    System.out.println("TEST1"); 
    for(int j=0; j<i; j++){ 

     graph.addVertex(String.valueOf(j)); 
     System.out.println("TEST Vertex Add"); 

    } 
    for(int j=0;j<i;j++){ 

     DefaultWeightedEdge e1 = graph.addEdge(String.valueOf(j),String.valueOf(j+1)); 
     graph.setEdgeWeight(e1, generateNumberByRange(10,20)); 
     System.out.println(graph.getEdgeWeight(e1)); 
    } 

    System.out.println("TEST2"); 
     graph.addVertex(String.valueOf(i)); 
     DefaultWeightedEdge e = graph.addEdge("0","1"); 
     graph.setEdgeWeight(e, generateNumberByRange(10,20)); 


    System.out.println("TEST3"); 

    System.out.println("Shortest path from START to END:"); 
    //List shortest_path = DijkstraShortestPath.findPathBetween(graph,"0",String.valueOf(i)); 
    List shortest_path; 
    //shortest_path = DijkstraShortestPath.findPathBetween(graph, "0","2"); 
    //System.out.println(shortest_path); 

} 

    public static int generateNumberByRange(int START, int END){ 
    return ThreadLocalRandom.current().nextInt(START, END + 1); 
     } 
     } 

Répondre

0

En fait, vous devez modifier cette boucle:

for(int j=0;j<i;j++){ 

     DefaultWeightedEdge e1 = graph.addEdge(String.valueOf(j),String.valueOf(j+1)); 
     graph.setEdgeWeight(e1, generateNumberByRange(10,20)); 
     System.out.println(graph.getEdgeWeight(e1)); 
    } 

à

for(int j=0;j<i-1;j++){ 

     DefaultWeightedEdge e1 = graph.addEdge(String.valueOf(j),String.valueOf(j+1)); 
     graph.setEdgeWeight(e1, generateNumberByRange(10,20)); 
     System.out.println(graph.getEdgeWeight(e1)); 
    } 

parce qu'à la fin de la boucle vous essayez d'obtenir le sommet qui a cet indice i + 1` qui n'existe pas.

Espérons cette aide

+1

Merci beaucoup! cela fonctionne –

+0

Heureux que cela fonctionne pour vous – Yacino