From 2e9b5f4b262195999f8f531b1998c39c5b3496c8 Mon Sep 17 00:00:00 2001 From: Tiphaine Pellerin Date: Thu, 4 Jun 2026 20:00:43 +0200 Subject: [PATCH] update de launch --- .../gui/simple/ExceptionCheminImpossible.java | 20 ++ .../org/insa/graphs/gui/simple/Launch.java | 288 ++++++++++-------- .../simple/ExceptionCheminImpossible.class | Bin 0 -> 421 bytes .../org/insa/graphs/gui/simple/Launch.class | Bin 1716 -> 8848 bytes 4 files changed, 180 insertions(+), 128 deletions(-) create mode 100644 be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/ExceptionCheminImpossible.java create mode 100644 be-graphes-gui/target/classes/org/insa/graphs/gui/simple/ExceptionCheminImpossible.class diff --git a/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/ExceptionCheminImpossible.java b/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/ExceptionCheminImpossible.java new file mode 100644 index 0000000..44fd08a --- /dev/null +++ b/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/ExceptionCheminImpossible.java @@ -0,0 +1,20 @@ +package org.insa.graphs.gui.simple; + +import java.io.IOException; + +/** + * Exception thrown when a format-error is detected when reading a graph (e.g., + * non-matching check bytes). + */ +public class ExceptionCheminImpossible extends IOException { + + /** + * Create a new format exception with the given message. + * + * @param message Message for the exception. + */ + public ExceptionCheminImpossible(String message) { + super(message); + } + +} 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 1fa985b..fa77904 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 @@ -62,7 +62,7 @@ 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) + // 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", @@ -72,145 +72,176 @@ public class Launch { final Graph[] graph = new Graph[4]; Random rand = new Random(); - // for (int i = 0; i < 4; i++) { - // Lecture du graphe - try (final GraphReader reader = new BinaryGraphReader(new DataInputStream( - new BufferedInputStream(new FileInputStream(mapName[0]))))) { + int[] orig = new int[4]; + orig[0] = 9396; + orig[1] = 17670; + orig[2] = 1034; + orig[3] = 3099; + int[] dest = new int[4]; + dest[0] = 16820; + dest[1] = 39143; + dest[2] = 1290; + dest[3] = 16818; - graph[0] = reader.read(); - System.out.println("Carte chargée avec succès : " + mapName[0]); - } + int j = 0; - // Création de l'affichage graphique - final Drawing drawing = createDrawing(); - drawing.drawGraph(graph[0]); + for (int i = 0; i < 4; i++) { + // Lecture du graphe + try (final GraphReader reader = new BinaryGraphReader(new DataInputStream( + new BufferedInputStream(new FileInputStream(mapName[0]))))) { - // Nombre de nœuds maximum disponibles sur cette carte - int numNodes = graph[0].getNodes().size()-1; - - // --- DEBUT DES TESTS ALEATOIRES --- - // On crée 10 paires de points aléatoires pour chaque carte - int nbTests = 2; - for (int t = 1; t <= nbTests; t++) { - - // Choix de l'origine et de la destination - Node origin = graph[0].getNodes().get(rand.nextInt(numNodes)); - Node destination = graph[0].getNodes().get(rand.nextInt(numNodes)); - - System.out.println( - String.format("\n[Test %d/%d] Origine ID: %d | Destination ID: %d", - t, nbTests, origin.getId(), destination.getId())); - - - data = new ShortestPathData(graph[0], origin, destination, - ArcInspectorFactory.getAllFilters().get(1)); - - dijkstra = new DijkstraAlgorithm(data); - bellman = new BellmanFordAlgorithm(data); - AEtoile = new AStarAlgorithm(data); - - paths = dijkstra.doRun(); - paths2 = bellman.doRun(); - paths3 = AEtoile.doRun(); - - // --- VERIFICATION ET COMPARAISON DES RESULTATS --- - - // Cas 1 : Aucun chemin trouvé par Dijkstra - 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 - if (paths2.isFeasible() || paths3.isFeasible()) { - System.out.println( - "\n Bellman ou A* ont trouvé un chemin alors que Dijkstra dit que c'est impossible !"); - } - throw new ExceptionCheminImpossible("pas de chemin possible"); + graph[0] = reader.read(); + System.out.println("Carte chargée avec succès : " + mapName[0]); } - // Cas 2 : Un chemin a été trouvé - else { - System.out.println("\n Dijkstra : Chemin trouvé !"); - // Cas particulier : Origine égale à la destination - if (origin.equals(destination)) { - System.out.println("\n L'origine est égale à la destination."); - } + // Création de l'affichage graphique + final Drawing drawing = createDrawing(); + drawing.drawGraph(graph[0]); - Path pDijkstra = paths.getPath(); - Path pBellman = paths2.getPath(); - Path pAStar = paths3.getPath(); + // Nombre de nÅ“uds maximum disponibles sur cette carte + int numNodes = graph[0].size() - 1; + System.out.println("nombre de noeud max : " + numNodes); - // Affichage du chemin de Dijkstra sur l'interface - drawing.drawPath(pDijkstra); - - // Comparaison des algos Dijkstra et Bellman-Ford - if (pBellman != null) { - // test sur les distances (on laisse 1 cm de marge) - if (Math.abs(pDijkstra.getLength() - pBellman.getLength()) < 1e-2) { - System.out - .println("\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" - + diff); - } - // test sur le temps de parcours (on laisse 1 seconde de marge) - if (Math.abs(pDijkstra.getMinimumTravelTime() - - pBellman.getMinimumTravelTime()) < 1.0) { - System.out.println( - "\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" - + diff); - } + // --- DEBUT DES TESTS ALEATOIRES --- + // On crée 10 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]); + j++; } else { - System.out.println( - "\n Probleme : Bellman n'a trouvé aucun chemin alors que Dijkstra oui."); + origin = graph[0].getNodes().get(rand.nextInt(numNodes)); + destination = graph[0].getNodes().get(rand.nextInt(numNodes)); } - // Comparaison des algos Dijkstra et A* - if (pAStar != null) { - // test sur les distances - if (Math.abs(pDijkstra.getLength() - pAStar.getLength()) < 1e-2) { - System.out.println("\n Même distance entre Dijkstra et A* "); - } - else { - float diff2 = - Math.abs(pDijkstra.getLength() - pAStar.getLength()); + System.out.println(String.format( + "\n[Test %d/%d] Origine ID: %d | Destination ID: %d", t, + nbTests, origin.getId(), destination.getId())); + + + data = new ShortestPathData(graph[0], origin, destination, + ArcInspectorFactory.getAllFilters().get(2)); + + dijkstra = new DijkstraAlgorithm(data); + bellman = new BellmanFordAlgorithm(data); + AEtoile = new AStarAlgorithm(data); + + paths = dijkstra.doRun(); + paths2 = bellman.doRun(); + paths3 = AEtoile.doRun(); + + // --- VERIFICATION ET COMPARAISON DES RESULTATS --- + + // Cas 1 : Aucun chemin trouvé par Dijkstra + 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 + if (paths2.isFeasible() || paths3.isFeasible()) { System.out.println( - " Distance différente entre Dijkstra et A* --> différence de " - + diff2); - } - // test sur le temps de parcours - if (Math.abs(pDijkstra.getMinimumTravelTime() - - pAStar.getMinimumTravelTime()) < 1.0) { - System.out.println( - "\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" - + diff2); + "\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é else { - System.out.println( - "\n Probleme : A* n'a trouvé aucun chemin alors que Dijkstra oui."); + System.out.println("\n Dijkstra : Chemin trouvé !"); + + // Cas particulier : Origine égale à la destination + if (origin.equals(destination)) { + System.out.println("\n L'origine est égale à la destination."); + } + + Path pDijkstra = paths.getPath(); + Path pBellman = paths2.getPath(); + Path pAStar = paths3.getPath(); + + // Affichage du chemin de Dijkstra sur l'interface + drawing.drawPath(pDijkstra); + + // Comparaison des algos Dijkstra et Bellman-Ford + if (pBellman != null) { + // test sur les distances (on laisse 1 cm de marge) + if (Math.abs( + pDijkstra.getLength() - pBellman.getLength()) < 1e-2) { + System.out.println( + "\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" + + diff); + } + // test sur le temps de parcours (on laisse 1 seconde de marge) + if (i != 2) { + if (Math.abs(pDijkstra.getMinimumTravelTime() + - pBellman.getMinimumTravelTime()) < 1.0) { + System.out.println( + "\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" + + diff); + } + } + } + else { + System.out.println( + "\n Probleme : Bellman n'a trouvé aucun chemin alors que Dijkstra oui."); + } + + // Comparaison des algos Dijkstra et A* + if (pAStar != null) { + // test sur les distances + if (Math.abs( + pDijkstra.getLength() - pAStar.getLength()) < 1e-2) { + System.out + .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 " + + diff2); + } + // test sur le temps de parcours + if (i != 2) { + if (Math.abs(pDijkstra.getMinimumTravelTime() + - pAStar.getMinimumTravelTime()) < 1.0) { + System.out.println( + "\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" + + diff2); + } + } + } + else { + System.out.println( + "\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) Node origin = graph[0].getNodes().get(27869); Node destination = graph[0].getNodes().get(14534); @@ -220,7 +251,7 @@ public class Launch { origin.getId(), destination.getId())); data = new ShortestPathData(graph[0], origin, destination, - ArcInspectorFactory.getAllFilters().get(0)); + ArcInspectorFactory.getAllFilters().get(2)); dijkstra = new DijkstraAlgorithm(data); bellman = new BellmanFordAlgorithm(data); @@ -233,16 +264,17 @@ 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)); Node destinations = origine; @@ -263,14 +295,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/ExceptionCheminImpossible.class b/be-graphes-gui/target/classes/org/insa/graphs/gui/simple/ExceptionCheminImpossible.class new file mode 100644 index 0000000000000000000000000000000000000000..638784c8ee22379d6dd89b36937e79d97a30871d GIT binary patch literal 421 zcmbVHO-sW-5PchCqp?~W(WBta4{$HiOSPAxPzZXc^uCQtGLr0uY$E%j*2qZ^7=W^Wlh#hGhL9G z6{U5Kmbnh#3+z3rCnd?s+1-jL(7Pl<^+aI*IPM6!GO3)`6`6E=vJmj6_CbeO!)71r z=m`vBGWxbDmb$uEEG`hmHc|OPRn+32qhDv_1V-_H437nZLOZ9@PX3QEfpBh{D$zI8 z8aP}9`knl|eZ>(32WU%ha|)gTqX|52pm%!qij5cEJcK;M?mA><{9 literal 0 HcmV?d00001 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 d0397429b7ceda8ae4cc221ee0ae7a2cc41228b0..943b7e7bf8afaea4c9b669eacd490a406e0e8d59 100644 GIT binary patch literal 8848 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 delta 412 zcmbQ>x`kKZ)W2Q(7#J9A8SL2^m>3xpCog0cnXJIXyV39@Go$2WF&4Rc{;b5ZME#t^ zymWonqN4mF4hAzuhEt(=MXAO4Ic2FS3d#Ao1(`XCC7Jno3I#>^Nja&x#a0SjoURqg zsRbZW=Zw_c%skKBg8bs*OrW$va$;Uyeu+X-ssh}Ql6-|kg_6pGRCIm$!k83xBaioyxb_VnPKpqo=7?5NG%h)rBgGCq^SQxCpENccEAk77oRRYo= QU<<@7K)xY^9h9X60L0UB3IG5A