1
0
Ответвление 0
BE_Graphe_alejeune_rlacroix/DeLorean.java
2022-05-28 13:30:51 +02:00

77 строки
Без EOL
4 КиБ
Java

// pseudo code du rapport sur le problme ouvert
public class DeLoreanShortestPath extends ShortestPathAlgorithm {
public DijkstraAlgorithm(ShortestPathData data) {
super(data);
}
ShortestPathSolution solution;
// on pourra par exemple mettre le graphe des stations dans data
final ShortestPathData data = getInputData();
Graph gr = data.getGraph();
StationGraph grS = data.getStationGraph();
double maximumDist = ... //(ici 200000, on pourrait passer cette variable dans data puisque certains voitures n'auront pas la même autonomie)
/*On part du principe ici que le coût en temps prend déjà en compte les 10 minutes de rechargement. Il suffirait si ce n'est pas le cas de regarder si la destination de l'arc est la destination finale et si ce n'est pas le cas de rajouter 10 au coût temporel*/
// on récupère la destination et l'origine
NodeStation nodeA = getNodeStationFromNode(...)
NodeStation nodeB = getNodeStationFromNode(...)
//On récupère la liste des nodes correspondantes aux stations (stockée dans notre graphe des stations).
arrayList<NodeStation> list = getNodeStationsFromNode(...)
/*
int UpdateGraphIsodistance(Node,double,Graph)
est une méthode de la classe StationGraph qui met à jour le StationGraph par rapport à l'Isodistance autour de A dans le graphe graph. Elle renvoie le nombre d'arrêtes crées (-1 si aucune).*/
// on calcule l'Isodistance de A
if (grS.UpdateIsodistance(NodeA,maximumDist,gr) != -1){
// A.hasSuccessor(B) itère sur les successeurs d'un NodeStation (A) et vérifie si l'un d'entre eux est B
if(!NodeA.hasSuccessor(NodeB)){
// on calcule l'Isodistance de B
if (grS.UpdateIsodistance(NodeB,maximumDist,gr) != -1){
/*StationAStarAlgorithm(ShortestPathData, double) hérite de AStar et ne fait que s'adapter aux classes "Station" pour rechercher quel est le plus court chemin sur le graphe des stations*/
StationAStarAlgorithm AAlgo = new StationAStarAlgorithm(data);
StationPath aStarResult = AAlgo.doRun();
arrayList<ArcStation> way = aStarResult.getStationArc();
Path[] pathArray = new Path[way.size()];
int i = 0;
for(ArcStation i : way){
if (data.getMode() == AbstractInputData.Mode.TIME) {
pathArray[i] = way.getTimePath()
// à noter qu'on pourrait également retourner le path renvoyé par un ModifiedAStarAlgorithm lancé en temps si le choix a été fait de ne pas stocker dans les arc le chemin correspondant.
} else {
pathArray[i] = way.getLengthPath()
}
}
// à noter également que si l'on choisit de stocker des listes d'Arc plutôt que des Path il suffira de faire remplacer le Path.concatenate(...) par un new Path(gr, arcs)
// il nous faut maintenant concaténer les chemins entre chaque station
solution = new ShortestPathSolution(data, AbstractSolution.Status.OPTIMAL, Path.concatenate(pathArray));
} else {
// aucune solution car aucune NodeS dans l'isodistance de B
solution = new ShortestPathSolution(data, AbstractSolution.Status.INFEASIBLE);
}
} else {
/*ModifiedAStarAlgorithm(ShortestPathData, double) hérite de AStar et ne change que le fait qu'un arc n'est inséré que si son coût depuis l'origine est inférieur à la valeur passée en argument du constructeur */
// pas besoin de stations car B est dans l'isodistance de A
ModifiedAStarAlgorithm AAlgo = new ModifiedAStarAlgorithm(data, maximumDist);
solution = AAlgo.doRun();
}
} else {
// aucune solution car aucune NodeS dans l'isodistance de A
solution = new ShortestPathSolution(data, AbstractSolution.Status.INFEASIBLE);
}
}