From 2ec3d4200f9ea5e3ff6aa46f75d341ddd5db93a1 Mon Sep 17 00:00:00 2001 From: Clement LACAU Date: Mon, 20 May 2024 00:31:13 +0200 Subject: [PATCH] Edge case fix + Astar Time mode --- Synthese_LACAU_ALNET.docx | Bin 0 -> 12491 bytes .../shortestpath/AStarAlgorithm.java | 12 +- .../shortestpath/DijkstraAlgorithm.java | 11 +- .../graphs/algorithm/shortestpath/Label.java | 4 +- .../algorithm/shortestpath/LabelStar.java | 14 +- .../shortestpath/AStarAlgorithmTest.java | 416 ++++++++++++++++++ .../shortestpath/DijkstraAlgorithmTest.java | 3 - 7 files changed, 446 insertions(+), 14 deletions(-) create mode 100644 Synthese_LACAU_ALNET.docx create mode 100644 be-graphes-algos/src/test/java/org/insa/graphs/algorithm/shortestpath/AStarAlgorithmTest.java diff --git a/Synthese_LACAU_ALNET.docx b/Synthese_LACAU_ALNET.docx new file mode 100644 index 0000000000000000000000000000000000000000..cf5339eb1423b42b094b901fc75ce3a555d0bc84 GIT binary patch literal 12491 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 literal 0 HcmV?d00001 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 0cc39a7..88d1dfa 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 @@ -1,13 +1,21 @@ package org.insa.graphs.algorithm.shortestpath; +import org.insa.graphs.algorithm.AbstractInputData.Mode; import org.insa.graphs.model.Node; public class AStarAlgorithm extends DijkstraAlgorithm { private Node destination; - + @Override protected Label createLabel(Node node) { - return new LabelStar(node, destination); + LabelStar retour; + if (data.getMode() == Mode.LENGTH) { + retour = new LabelStar(node, -1, destination); + } + else { + retour = new LabelStar(node, data.getGraph().getGraphInformation().getMaximumSpeed(), destination); + } + return retour; } public AStarAlgorithm(ShortestPathData data) { diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java index 36cc09b..47c7b0f 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/DijkstraAlgorithm.java @@ -74,15 +74,19 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm { // we know its origin and destination for (Arc arc : x.getNode().getSuccessors()) { if (successor.getNode().equals(arc.getDestination())) { + // data.getcost(arc) returns a cost considering the mode chosen: + // TIME or LENGTH + // Similar to using getLength / getMinimumTravelTime arc_cost = (float) data.getCost(arc); } } + final float possible_path_cost = x.getCost() + arc_cost; - if (successor.getCost() > possible_path_cost) { + if (successor.getCost() >= possible_path_cost) { // Mise à jour du label successor.setPathCost(possible_path_cost); successor.setParentNode(x.getNode()); - // Si le noeud n'a pas déjà était rajouté au tas, on le rajoute + // Si le noeud n'a pas déjà été rajouté au tas, on le rajoute // isReached permet de vérifier en complexité O(1) // C'est un léger coût en mémoire pour un gain en vitesse if (successor.isReached()) { @@ -92,7 +96,6 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm { successor.markReached(); notifyNodeReached(successor.getNode()); } - tas.insert(successor); } } @@ -112,7 +115,7 @@ public class DijkstraAlgorithm extends ShortestPathAlgorithm { Label current_label = labels.get(data.getDestination().getId()); Label parent_label = current_label; - while(current_label != null && current_label.getNode() != data.getOrigin()) + while(current_label != null && current_label.getNode().getId() != data.getOrigin().getId()) { // Find the label matching the parent node parent_label = labels.get(current_label.getParentNode().getId()); diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/Label.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/Label.java index ffdf560..bdc3da7 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/Label.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/shortestpath/Label.java @@ -1,6 +1,7 @@ package org.insa.graphs.algorithm.shortestpath; import org.insa.graphs.model.Node; +import org.insa.graphs.algorithm.AbstractInputData.Mode; public class Label implements Comparable