diff --git a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/marathon/MarathonAlgorithm.java b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/marathon/MarathonAlgorithm.java index ae806e6..be10209 100644 --- a/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/marathon/MarathonAlgorithm.java +++ b/be-graphes-algos/src/main/java/org/insa/graphs/algorithm/marathon/MarathonAlgorithm.java @@ -47,25 +47,24 @@ public class MarathonAlgorithm extends ShortestPathAlgorithm { if (!solution.isFeasible()) return solution; - while (path.getLength() < getDistance()) { - // Recuperation Arc à supprimer - Arc arcToRemove = getLongestArc(path); - Node originArcToRemove = arcToRemove.getOrigin(); - Node destinationArcToRemove = arcToRemove.getDestination(); + while (path.getLength() < distanceMarathon) { + // Recuperation Arc à supprimer (cacher) et extremites + final Arc arcToRemove = getLongestArc(path); + final Node originArcToRemove = arcToRemove.getOrigin(); + final Node destinationArcToRemove = arcToRemove.getDestination(); - // On le supprime dans une copie du tableau (getter Collections.unmodifiable dans Path.java) path.getArcs().remove(arcToRemove); - originArcToRemove.removeArc(arcToRemove); + originArcToRemove.removeArc(arcToRemove); // TODO and similar ? // Creations du chemin entre les 2 noeuds dont l'arc a été supprimé - ArcInspector arcInspector = ArcInspectorFactory.getAllFilters().get(0); - ShortestPathData newData = new ShortestPathData(graph, originArcToRemove, destinationArcToRemove, arcInspector); - DijkstraAlgorithm newDijkstra = new DijkstraAlgorithm(newData); - ShortestPathSolution newPath = newDijkstra.run(); + final ArcInspector arcInspector = ArcInspectorFactory.getAllFilters().get(0); + final ShortestPathData newData = new ShortestPathData(graph, originArcToRemove, destinationArcToRemove, arcInspector); + Path newPath = (new DijkstraAlgorithm(newData)).run().getPath(); - if (newPath.getPath() != null) { + // could get stuck in a loop if no path is found, given the current arcToRemove strategy + if (newPath != null) { // Ajout du path trouvé à l'indice où on l'a enlevé - path.getArcs().addAll(newPath.getPath().getArcs()); + path.getArcs().addAll(newPath.getArcs()); } }