From b345659e138a3e8b01f865b8d1322c1ff28e33b0 Mon Sep 17 00:00:00 2001 From: Tiphaine Pellerin Date: Fri, 5 Jun 2026 08:46:31 +0200 Subject: [PATCH] finalisation de la classe de tests --- .../org/insa/graphs/gui/simple/Launch.java | 112 +++++++++--------- .../org/insa/graphs/gui/simple/Launch$1.class | Bin 1292 -> 1292 bytes .../org/insa/graphs/gui/simple/Launch.class | Bin 8848 -> 8899 bytes 3 files changed, 58 insertions(+), 54 deletions(-) diff --git a/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/Launch.java b/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/Launch.java index fa77904..a602032 100644 --- a/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/Launch.java +++ b/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/Launch.java @@ -24,8 +24,6 @@ import org.insa.graphs.model.Path; import org.insa.graphs.model.io.BinaryGraphReader; import org.insa.graphs.model.io.GraphReader; -import org.insa.graphs.gui.simple.ExceptionCheminImpossible; - public class Launch { /** @@ -62,14 +60,10 @@ public class Launch { public static void main(String[] args) throws Exception, ExceptionCheminImpossible { - // Chemins vers les cartes (les fichiers .path ne sont plus nécessaires ici) - final String[] mapName = { - "/mnt/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/toulouse.mapgr", - "/mnt/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/insa.mapgr", - "/mnt/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/toulouse.mapgr", - "/mnt/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/france.mapgr" }; + // Chemins vers les cartes (les fichiers .path ne sont plus nécessaires ici) + final String mapName = "/mnt/commetud/3eme Annee MIC/Graphes-et-Algorithmes/Maps/toulouse.mapgr"; - final Graph[] graph = new Graph[4]; + Graph graph ; Random rand = new Random(); int[] orig = new int[4]; @@ -88,35 +82,35 @@ public class Launch { for (int i = 0; i < 4; i++) { // Lecture du graphe try (final GraphReader reader = new BinaryGraphReader(new DataInputStream( - new BufferedInputStream(new FileInputStream(mapName[0]))))) { + new BufferedInputStream(new FileInputStream(mapName))))) { - graph[0] = reader.read(); - System.out.println("Carte chargée avec succès : " + mapName[0]); + graph = reader.read(); + System.out.println("Carte chargée avec succès : " + mapName); } - // Création de l'affichage graphique + // Création de l'affichage graphique final Drawing drawing = createDrawing(); - drawing.drawGraph(graph[0]); + drawing.drawGraph(graph); - // Nombre de nÅ“uds maximum disponibles sur cette carte - int numNodes = graph[0].size() - 1; + // Nombre de nœuds maximum disponibles sur cette carte + int numNodes = graph.size() - 1; System.out.println("nombre de noeud max : " + numNodes); // --- DEBUT DES TESTS ALEATOIRES --- - // On crée 10 paires de points aléatoires pour chaque carte + // On crée 2 paires de points aléatoires pour chaque carte int nbTests = 2; for (int t = 1; t <= nbTests; t++) { Node origin; Node destination; // Choix de l'origine et de la destination if (i == 1 || i == 2) { - origin = graph[0].getNodes().get(orig[j]); - destination = graph[0].getNodes().get(dest[j]); + origin = graph.getNodes().get(orig[j]); + destination = graph.getNodes().get(dest[j]); j++; } else { - origin = graph[0].getNodes().get(rand.nextInt(numNodes)); - destination = graph[0].getNodes().get(rand.nextInt(numNodes)); + origin = graph.getNodes().get(rand.nextInt(numNodes)); + destination = graph.getNodes().get(rand.nextInt(numNodes)); } System.out.println(String.format( @@ -124,7 +118,7 @@ public class Launch { nbTests, origin.getId(), destination.getId())); - data = new ShortestPathData(graph[0], origin, destination, + data = new ShortestPathData(graph, origin, destination, ArcInspectorFactory.getAllFilters().get(2)); dijkstra = new DijkstraAlgorithm(data); @@ -137,25 +131,25 @@ public class Launch { // --- VERIFICATION ET COMPARAISON DES RESULTATS --- - // Cas 1 : Aucun chemin trouvé par Dijkstra + // Cas 1 : Aucun chemin trouvé par Dijkstra if (!paths.isFeasible() || paths.getPath() == null) { System.out - .println("\n Dijkstra : Aucun chemin trouvé (Infeasible)."); + .println("\n Dijkstra : Aucun chemin trouvé (Infeasible)."); - // Alerte de sécurité si un autre algo prétend en trouver un + // Alerte de sécurité si un autre algo prétend en trouver un if (paths2.isFeasible() || paths3.isFeasible()) { System.out.println( - "\n Bellman ou A* ont trouvé un chemin alors que Dijkstra dit que c'est impossible !"); + "\n Bellman ou A* ont trouvé un chemin alors que Dijkstra dit que c'est impossible !"); } throw new ExceptionCheminImpossible("pas de chemin possible"); } - // Cas 2 : Un chemin a été trouvé + // Cas 2 : Un chemin a été trouvé else { - System.out.println("\n Dijkstra : Chemin trouvé !"); + System.out.println("\n Dijkstra : Chemin trouvé !"); - // Cas particulier : Origine égale à la destination + // Cas particulier : Origine égale à la destination if (origin.equals(destination)) { - System.out.println("\n L'origine est égale à la destination."); + System.out.println("\n L'origine est égale à la destination."); } Path pDijkstra = paths.getPath(); @@ -171,13 +165,13 @@ public class Launch { if (Math.abs( pDijkstra.getLength() - pBellman.getLength()) < 1e-2) { System.out.println( - "\n Même distance entre Dijkstra et Bellman"); + "\n Même distance entre Dijkstra et Bellman"); } else { float diff = Math .abs(pDijkstra.getLength() - pBellman.getLength()); System.out.println( - "\n Distance différente entre Dijkstra et Bellman --> différence de" + "\n Distance différente entre Dijkstra et Bellman --> différence de" + diff); } // test sur le temps de parcours (on laisse 1 seconde de marge) @@ -185,20 +179,20 @@ public class Launch { if (Math.abs(pDijkstra.getMinimumTravelTime() - pBellman.getMinimumTravelTime()) < 1.0) { System.out.println( - "\n Même temps de parcours entre Dijkstra et Bellman"); + "\n Même temps de parcours entre Dijkstra et Bellman"); } else { double diff = Math.abs(pDijkstra.getMinimumTravelTime() - pBellman.getMinimumTravelTime()); System.out.println( - "\n Temps différents entre Dijkstra et Bellman --> différence de" + "\n Temps différents entre Dijkstra et Bellman --> différence de" + diff); } } } else { System.out.println( - "\n Probleme : Bellman n'a trouvé aucun chemin alors que Dijkstra oui."); + "\n Probleme : Bellman n'a trouvé aucun chemin alors que Dijkstra oui."); } // Comparaison des algos Dijkstra et A* @@ -207,13 +201,13 @@ public class Launch { if (Math.abs( pDijkstra.getLength() - pAStar.getLength()) < 1e-2) { System.out - .println("\n Même distance entre Dijkstra et A* "); + .println("\n Même distance entre Dijkstra et A* "); } else { float diff2 = Math .abs(pDijkstra.getLength() - pAStar.getLength()); System.out.println( - " Distance différente entre Dijkstra et A* --> différence de " + " Distance différente entre Dijkstra et A* --> différence de " + diff2); } // test sur le temps de parcours @@ -221,36 +215,46 @@ public class Launch { if (Math.abs(pDijkstra.getMinimumTravelTime() - pAStar.getMinimumTravelTime()) < 1.0) { System.out.println( - "\n Même temps de parcours entre Dijkstra et A*"); + "\n Même temps de parcours entre Dijkstra et A*"); } else { double diff2 = Math.abs(pDijkstra.getMinimumTravelTime() - pAStar.getMinimumTravelTime()); System.out.println( - "\n Temps différents entre Dijkstra et A* --> différence de" + "\n Temps différents entre Dijkstra et A* --> différence de" + diff2); } } } else { System.out.println( - "\n Probleme : A* n'a trouvé aucun chemin alors que Dijkstra oui."); + "\n Probleme : A* n'a trouvé aucun chemin alors que Dijkstra oui."); } } } } // --- CAS : CHEMIN IMPOSSIBLE --- - // PAS FINI (points à récup sur carte) + // PAS FINI (points à récup sur carte) + try (final GraphReader reader = new BinaryGraphReader(new DataInputStream( + new BufferedInputStream(new FileInputStream(mapName))))) { - Node origin = graph[0].getNodes().get(27869); - Node destination = graph[0].getNodes().get(14534); + graph = reader.read(); + System.out.println("Carte chargée avec succès : " + mapName); + } + + // Création de l'affichage graphique + final Drawing drawing = createDrawing(); + drawing.drawGraph(graph); + + Node origin = graph.getNodes().get(27869); + Node destination = graph.getNodes().get(14534); System.out.println(String.format( "\n[Test chemin impossible] Origine ID: %d | Destination ID: %d", origin.getId(), destination.getId())); - data = new ShortestPathData(graph[0], origin, destination, + data = new ShortestPathData(graph, origin, destination, ArcInspectorFactory.getAllFilters().get(2)); dijkstra = new DijkstraAlgorithm(data); @@ -264,25 +268,25 @@ public class Launch { // --- VERIFICATION --- if (!paths.isFeasible() || paths.getPath() == null) { - System.out.println("\n Dijkstra : Aucun chemin trouvé (Infeasible)."); - // Alerte de sécurité si un autre algo prétend en trouver un + System.out.println("\n Dijkstra : Aucun chemin trouvé (Infeasible)."); + // Alerte de sécurité si un autre algo prétend en trouver un if (paths2.isFeasible() || paths3.isFeasible()) { System.out.println( - "\n Bellman ou A* ont trouvé un chemin alors que Dijkstra dit que c'est impossible !"); + "\n Bellman ou A* ont trouvé un chemin alors que Dijkstra dit que c'est impossible !"); } throw new ExceptionCheminImpossible("pas de chemin possible"); } // CAS : DEPART = ARRIVEE - int numNodes = graph[0].size() - 1; - Node origine = graph[0].getNodes().get(rand.nextInt(numNodes)); + int numNodes = graph.size() - 1; + Node origine = graph.getNodes().get(rand.nextInt(numNodes)); Node destinations = origine; System.out.println(String.format( "\n[Test origine = dest] Origine ID: %d | Destination ID: %d", origine.getId(), destinations.getId())); - data = new ShortestPathData(graph[0], origine, destinations, + data = new ShortestPathData(graph, origine, destinations, ArcInspectorFactory.getAllFilters().get(0)); dijkstra = new DijkstraAlgorithm(data); @@ -295,14 +299,14 @@ public class Launch { // --- VERIFICATION --- - System.out.println("\n Dijkstra : Chemin trouvé !"); + System.out.println("\n Dijkstra : Chemin trouvé !"); - // Cas particulier : Origine égale à la destination + // Cas particulier : Origine égale à la destination if (origine.equals(destinations)) { - System.out.println("\n L'origine est égale à la destination."); + System.out.println("\n L'origine est égale à la destination."); } // --- FIN DES TESTS ALEATOIRES POUR CETTE CARTE --- // } } -} \ No newline at end of file +} diff --git a/be-graphes-gui/target/classes/org/insa/graphs/gui/simple/Launch$1.class b/be-graphes-gui/target/classes/org/insa/graphs/gui/simple/Launch$1.class index 3f5d61ff261d7d4ed6fec36e0497a699fd484c1e..ba8a8f2ad9b07d1a94b461ffbb5dbff2730cc986 100644 GIT binary patch delta 47 zcmeC->fzd8#KNdH*_fq7R+E8?L5o3@L7PE}L5D$}L6^aRL65+c77qZy CYzLSC delta 47 zcmeC->fzd8#KNdC*_fq7R-1u~L5D$_L61S6L7%|@2rU>48EhDgCLdw(006@3 B2dV%7 diff --git a/be-graphes-gui/target/classes/org/insa/graphs/gui/simple/Launch.class b/be-graphes-gui/target/classes/org/insa/graphs/gui/simple/Launch.class index 943b7e7bf8afaea4c9b669eacd490a406e0e8d59..44ced59628d20f39e901fb2cd568e66fa9d6c3e3 100644 GIT binary patch literal 8899 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