From 94a837123b145a7c44084c62ec95e1d23253bd2d Mon Sep 17 00:00:00 2001 From: bezza Date: Sun, 25 May 2025 17:31:16 +0200 Subject: [PATCH 1/3] ajout restriction autres voies pour les test --- .../java/org/insa/graphs/algorithm/MyArcInspector.java | 8 +++++++- .../java/org/insa/graphs/gui/simple/TestDijkstra.java | 8 ++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/MyArcInspector.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/MyArcInspector.java index d656bd3..fcc624c 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/MyArcInspector.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/MyArcInspector.java @@ -21,7 +21,13 @@ public class MyArcInspector implements ArcInspector { boolean result=true; if (this.restreint){ RoadInformation.RoadType type=arc.getRoadInformation().getType(); - if (type==RoadInformation.RoadType.PEDESTRIAN || type==RoadInformation.RoadType.CYCLEWAY ) { + if (type != RoadInformation.RoadType.MOTORWAY && + type != RoadInformation.RoadType.TRUNK && + type != RoadInformation.RoadType.PRIMARY && + type != RoadInformation.RoadType.SECONDARY && + type != RoadInformation.RoadType.TERTIARY && + type != RoadInformation.RoadType.RESIDENTIAL && + type != RoadInformation.RoadType.UNCLASSIFIED ) { result=false; } } diff --git a/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/TestDijkstra.java b/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/TestDijkstra.java index df873f2..d81a1df 100644 --- a/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/TestDijkstra.java +++ b/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/TestDijkstra.java @@ -175,10 +175,10 @@ public class TestDijkstra { // System.out.println("== Trajet long (et pénible avec les enfants) =="); // testScenario("bretagne.mapgr",564429,602395 , Mode.LENGTH, false,false,false); - System.out.println("== Test bug dijkstra temps =="); - testScenario("paris.mapgr", 27361, 36108, Mode.TIME, true,false,false); + // System.out.println("== Test bug dijkstra temps =="); + // testScenario("paris.mapgr", 27361, 36108, Mode.TIME, true,false,false); // ce test mettait en lumière un problème d'arrondi qui est mtn résolu. - // System.out.println("== Trajet impossible (piste cyclable) =="); - // testScenario("insa.mapgr",90,922 , Mode.LENGTH, false,false,true); //marche pas + System.out.println("== Trajet impossible (piste cyclable) =="); + testScenario("insa.mapgr",90,922 , Mode.LENGTH, false,false,true); //marche pas } } From aa1301c4e0eaa675fb2846d5be96fc94c4f812a4 Mon Sep 17 00:00:00 2001 From: bezza Date: Mon, 26 May 2025 15:13:55 +0200 Subject: [PATCH 2/3] =?UTF-8?q?d=C3=A9placement=20de=20testdijkstra=20dans?= =?UTF-8?q?=20be-graphes-gui/src/test/java/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../simple => test/java}/TestDijkstra.java | 32 ++++--------------- 1 file changed, 6 insertions(+), 26 deletions(-) rename be-graphes-gui/src/{main/java/org/insa/graphs/gui/simple => test/java}/TestDijkstra.java (87%) diff --git a/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/TestDijkstra.java b/be-graphes-gui/src/test/java/TestDijkstra.java similarity index 87% rename from be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/TestDijkstra.java rename to be-graphes-gui/src/test/java/TestDijkstra.java index d81a1df..42ecd60 100644 --- a/be-graphes-gui/src/main/java/org/insa/graphs/gui/simple/TestDijkstra.java +++ b/be-graphes-gui/src/test/java/TestDijkstra.java @@ -1,14 +1,9 @@ -package org.insa.graphs.gui.simple; -import java.awt.BorderLayout; -import java.awt.Dimension; + import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.FileInputStream; -import javax.swing.JFrame; -import javax.swing.SwingUtilities; - import org.insa.graphs.algorithm.AbstractInputData.Mode; import org.insa.graphs.algorithm.ArcInspector; import org.insa.graphs.algorithm.MyArcInspector; @@ -17,33 +12,15 @@ import org.insa.graphs.algorithm.shortestpath.BellmanFordAlgorithm; import org.insa.graphs.algorithm.shortestpath.DijkstraAlgorithm; import org.insa.graphs.algorithm.shortestpath.ShortestPathData; import org.insa.graphs.algorithm.shortestpath.ShortestPathSolution; -import org.insa.graphs.gui.drawing.Drawing; -import org.insa.graphs.gui.drawing.components.BasicDrawing; +import org.insa.graphs.model.Arc; import org.insa.graphs.model.Graph; import org.insa.graphs.model.Node; import org.insa.graphs.model.Path; -import org.insa.graphs.model.Arc; import org.insa.graphs.model.io.BinaryGraphReader; import org.insa.graphs.model.io.GraphReader; public class TestDijkstra { - public static Drawing createDrawing() throws Exception { - BasicDrawing basicDrawing = new BasicDrawing(); - SwingUtilities.invokeAndWait(new Runnable() { - @Override - public void run() { - JFrame frame = new JFrame("BE Graphes - Launch"); - frame.setLayout(new BorderLayout()); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - frame.setVisible(true); - frame.setSize(new Dimension(800, 600)); - frame.setContentPane(basicDrawing); - frame.validate(); - } - }); - return basicDrawing; - } // fonction pour tester un scénario public static void testScenario(String map, int depart, int arrivee, Mode mode, boolean petitGraphe, boolean Astar, boolean restreint) throws Exception { @@ -179,6 +156,9 @@ public class TestDijkstra { // testScenario("paris.mapgr", 27361, 36108, Mode.TIME, true,false,false); // ce test mettait en lumière un problème d'arrondi qui est mtn résolu. System.out.println("== Trajet impossible (piste cyclable) =="); - testScenario("insa.mapgr",90,922 , Mode.LENGTH, false,false,true); //marche pas + testScenario("insa.mapgr",90,922 , Mode.LENGTH, false,false,true); + System.out.println("== Trajet impossible (piste cyclable) == sans restriction"); + testScenario("insa.mapgr",90,922 , Mode.LENGTH, false,false,false); //marche pas + } } From 1aee5a57c3b4966b14ac38a33ed9e52af7a882d0 Mon Sep 17 00:00:00 2001 From: Matteo Date: Mon, 26 May 2025 18:21:48 +0200 Subject: [PATCH 3/3] correction fastest path pour A* et avancement ProblemeOuvert --- .../shortestpath/AStarAlgorithm.java | 3 +- .../shortestpath/LabelProblemeOuvert | 16 -- .../shortestpath/LabelProblemeOuvert.java | 30 ++++ .../algorithm/shortestpath/LabelStar.java | 55 ++++++- .../shortestpath/ProblemeOuvert.java | 150 ++++++++++++++++++ 5 files changed, 230 insertions(+), 24 deletions(-) delete mode 100644 be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert create mode 100644 be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert.java diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/AStarAlgorithm.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/AStarAlgorithm.java index 4db278f..29df1a0 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/AStarAlgorithm.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/AStarAlgorithm.java @@ -9,7 +9,8 @@ public class AStarAlgorithm extends DijkstraAlgorithm { @Override protected LabelStar createLabel(Node node) { - return new LabelStar(node, false, Double.POSITIVE_INFINITY, null, getInputData().getDestination()); + ShortestPathData data = getInputData(); //pour récupérer la vitesse maximale du graphe, la destination et si on est en fastestpath ou shortestpath + return new LabelStar(node, false, Double.POSITIVE_INFINITY,null,data); } diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert deleted file mode 100644 index 3478429..0000000 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert +++ /dev/null @@ -1,16 +0,0 @@ -/*public class LabelProblemeOuvert extends Label { - private double autonomieRestante; - - public LabelProblemeOuvert(Node sommet, boolean marque, double cout, Arc pere, double autonomieRestante) { - super(sommet, marque, cout, pere); - this.autonomieRestante = autonomieRestante; - } - - public double getAutonomieRestante() { - return autonomieRestante; - } - - public void setAutonomieRestante(double autonomieRestante) { - this.autonomieRestante = autonomieRestante; - } -}*/ diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert.java new file mode 100644 index 0000000..e4f32fd --- /dev/null +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelProblemeOuvert.java @@ -0,0 +1,30 @@ +package org.insa.graphs.algorithm.shortestpath; + +import org.insa.graphs.model.Arc; +import org.insa.graphs.model.Node; +public class LabelProblemeOuvert extends Label { + private double autonomieRestante; //double pour la cohérence avec les autres couts qui sont en double eux aussi + + public LabelProblemeOuvert(Node sommet, boolean marque, double cout, Arc pere, double autonomieRestante) { + super(sommet, marque, cout, pere); + this.autonomieRestante = autonomieRestante; + } + + public double getAutonomieRestante() { + return autonomieRestante; + } + + public void setAutonomieRestante(double autonomieRestante) { + this.autonomieRestante = autonomieRestante; + } + + @Override + public double getTotalCost() { //normalement pas besoin + return this.getCoutRealise(); + } + + /*@Override + public int compareTo(LabelProblemeOuvert other) { + return Double.compare(this.getTotalCost(), other.getTotalCost()); + }*/ +} diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelStar.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelStar.java index 3ebdc92..88a9240 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelStar.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/LabelStar.java @@ -1,5 +1,6 @@ package org.insa.graphs.algorithm.shortestpath; +import org.insa.graphs.algorithm.AbstractInputData; import org.insa.graphs.model.Arc; import org.insa.graphs.model.Node; import org.insa.graphs.model.Point; @@ -7,30 +8,70 @@ import org.insa.graphs.model.Point; public class LabelStar extends Label { - - private Node destination; - public LabelStar(Node sommetCourant, Boolean marque, double coutRealise, Arc pere,Node destination) { +; + private ShortestPathData pathData; + public LabelStar(Node sommetCourant, Boolean marque, double coutRealise, Arc pere, ShortestPathData data) { super(sommetCourant, marque, coutRealise, pere); - this.destination=destination; + this.pathData = data; //pour récupérer la vitesse maximale du graphe, la destination et si on est en fastestpath ou shortestpath } //pour optimiser l'algo : ATTENTION PAS à L'initialisation pas le faire sinon ça va le faire pr tout les pts //on rajoute un paremètre distance ds le label et quand on passe sur le label si c'est linfini on le calcule - @Override + /*@Override public double getTotalCost() { //pourquoi getTotalCost ? psq il est utilisé dans le compareTo //System.out.println("cout realise : " + getCoutRealise()+ "\n distance : "distance(getSommetCourant().getPoint(),this.destination.getPoint())); double cout=getCoutRealise(); - Point calcul = this.destination.getPoint(); + Point calcul = this.pathData.getDestination().getPoint(); cout+=calcul.distanceTo(this.getSommetCourant().getPoint()); return (cout); - } + }*/ //pas nécessaire normalement /*public int compareTo(LabelStar other) { return Double.compare(this.getTotalCost(), other.getTotalCost()); }*/ + /** + * Calcule le coût total estimé (f = g + h) pour l'algorithme A*. + * g (getCoutRealise()) est le coût actuel depuis le départ. + * h est l'heuristique : + * - En mode DISTANCE: distance à vol d'oiseau (via distanceTo) jusqu'à la destination. + * - En mode TEMPS: distance à vol d'oiseau (via distanceTo) / vitesse maximale sur le graphe. + * @return Le coût total estimé. + */ + @Override + public double getTotalCost() { + double gCost = getCoutRealise(); // Coût actuel depuis l'origine (distance ou temps) + double hCost = 0.0; + + Node current = getSommetCourant(); + Node destinationNode = this.pathData.getDestination(); // Obtention de la destination depuis pathData + Point currentPoint = current.getPoint(); + Point destinationPoint = destinationNode.getPoint(); + if (currentPoint == null || destinationPoint == null) { + return gCost; // Heuristique nulle si points non valides + } + + //calcul vol d'oiseau + double distanceToDestinationMeters = currentPoint.distanceTo(destinationPoint); + + //différencier TIME et DISTANCE + if (this.pathData.getMode() == AbstractInputData.Mode.TIME) { + int maxSpeedKmH = this.pathData.getGraph().getGraphInformation().getMaximumSpeed(); + + // Conversion de la vitesse max en mètres par seconde (m/s) + double maxSpeedMpS = maxSpeedKmH / 3.6; + hCost = distanceToDestinationMeters / maxSpeedMpS; // hCost est maintenant en secondes + + } else { + // Heuristique pour le mode DISTANCE (ou par défaut) + hCost = distanceToDestinationMeters; // hCost est en mètres + } + + return gCost + hCost; + } + } \ No newline at end of file diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/ProblemeOuvert.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/ProblemeOuvert.java index 0658cce..d66b785 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/ProblemeOuvert.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/ProblemeOuvert.java @@ -106,3 +106,153 @@ gérer le problème de la recharge, quand la faire ? */ +package org.insa.graphs.algorithm.shortestpath; + +import java.util.ArrayList; +import java.util.Collections; + +import org.insa.graphs.algorithm.AbstractSolution.Status; +import org.insa.graphs.algorithm.utils.BinaryHeap; +import org.insa.graphs.model.Arc; +import org.insa.graphs.model.Graph; +import org.insa.graphs.model.Node; +import org.insa.graphs.model.Path; +import org.insa.graphs.model.RoadInformation.RoadType; +//import org.insa.graphs.algorithm.shortestpath.ProblemeOuvert; + +public class ProblemeOuvert extends DijkstraAlgorithm { + + + private double MAX_BATTERY = 200; + + public ProblemeOuvert(ShortestPathData data) { + super(data); + } + + @Override + protected LabelProblemeOuvert createLabel(Node node) { + return new LabelProblemeOuvert(node, false, Double.POSITIVE_INFINITY, null, MAX_BATTERY); + } + + protected void tryUpdateLabel(LabelProblemeOuvert[] labels, BinaryHeap