| src/controleur/AEtoileCorrespondance.java |
| 1 | | package controleur; |
| 2 | | |
| 3 | | import java.util.ArrayList; |
| 4 | | import modele.Station; |
| 5 | | |
| 6 | | /** |
| 7 | | * Sous classe spécifique pour l'utilisation de l'algorithme A* avec des |
| 8 | | * correspondances |
| 9 | | */ |
| 10 | | class AEtoileCorrespondance extends AEtoile |
| 11 | | { |
| 12 | | /** |
| 13 | | * {@link controleur.Requete Requête} qui contient les informations |
| 14 | | * nécessaires à l'algorithme |
| 15 | | */ |
| 16 | | private Requete requete; |
| 17 | | |
| 18 | | /** |
| 19 | | * Liste de {@link modele.Station stations} nécessaire au fonctionnement de |
| 20 | | * l'algorithme |
| 21 | | */ |
| 22 | | private ArrayList<Station> openList; |
| 23 | | |
| 24 | | /** |
| 25 | | * Liste de {@link modele.Station stations} nécessaire au fonctionnement de |
| 26 | | * l'algorithme |
| 27 | | */ |
| 28 | | private ArrayList<Station> closedList; |
| 29 | | |
| 30 | | /** |
| 31 | | * |
| 32 | | */ |
| 33 | | public AEtoileCorrespondance() |
| 34 | | { |
| 35 | | |
| 36 | | } |
| 37 | | |
| 38 | | /** |
| 39 | | * Démarre l'algorithme |
| 40 | | */ |
| 41 | | @Override |
| 42 | | void lancement() |
| 43 | | { |
| 44 | | |
| 45 | | } |
| 46 | | |
| 47 | | /** |
| 48 | | * Getter du {@link controleur.Trajet trajet} |
| 49 | | * |
| 50 | | * @return Trajet correspondant à la requête |
| 51 | | */ |
| 52 | | public ArrayList<Trajet> getTrajet() |
| 53 | | { |
| 54 | | return this.listeTrajet; |
| 55 | | } |
| 56 | | |
| 57 | | /** |
| 58 | | * Récupère le plus court chemin et l'ajoute au {@link controleur.Trajet |
| 59 | | * trajet} |
| 60 | | * |
| 61 | | * @param stationActuelle Point de départ de la recherche du plus court |
| 62 | | * chemin |
| 63 | | * @param stationArrivee Point d'arrivée de la recherche du plus court |
| 64 | | * chemin |
| 65 | | */ |
| 66 | | private void plusCourtChemin(Station stationActuelle, Station stationArrivee) |
| 67 | | { |
| 68 | | |
| 69 | | } |
| 70 | | |
| 71 | | } |
| src/controleur/AEtoileDepart.java |
| 1 | package controleur; |
| 2 | |
| 3 | import java.util.ArrayList; |
| 4 | import java.util.TreeMap; |
| 5 | import java.util.HashMap; |
| 6 | import java.util.HashSet; |
| 7 | import modele.Station; |
| 8 | import modele.Segment; |
| 9 | |
| 10 | /** |
| 11 | * @author Alexandre Moreau |
| 12 | */ |
| 13 | class AEtoileDepart extends AEtoile |
| 14 | { |
| 15 | private Requete requete; |
| 16 | private TreeMap<String, Station> listeStation; |
| 17 | private Station depart; |
| 18 | private Station arrive; |
| 19 | private int time; |
| 20 | private Trajet meilleurTrajet; |
| 21 | private HashMap<Integer, ContraintePosition> etape; |
| 22 | |
| 23 | public AEtoileDepart(Requete requet, TreeMap<String, Station> station) |
| 24 | { |
| 25 | requete = requet; |
| 26 | listeStation = station; |
| 27 | depart = listeStation.get(requete.getDepart().getStation()); |
| 28 | arrive = listeStation.get(requete.getArrivee().getStation()); |
| 29 | etape = requete.getListeEtape(); |
| 30 | lancement(); |
| 31 | } |
| 32 | |
| 33 | public void lancement() |
| 34 | { |
| 35 | if (etape.size()==0) |
| 36 | { |
| 37 | cheminPlusCourt(depart, arrive); |
| 38 | } |
| 39 | else |
| 40 | { |
| 41 | for (int i=1; i<=etape.size(); i++) |
| 42 | { |
| 43 | Station etape1 = listeStation.get(etape.get(i).getStation()); |
| 44 | if (i==1) |
| 45 | { |
| 46 | cheminPlusCourt(depart, etape1); |
| 47 | } |
| 48 | else |
| 49 | { |
| 50 | Station etapeprecedente = meilleurTrajet.dernierSegment().getDestination(); |
| 51 | cheminPlusCourt(etapeprecedente, etape1); |
| 52 | } |
| 53 | } |
| 54 | Station etapeprecedente = meilleurTrajet.dernierSegment().getDestination(); |
| 55 | cheminPlusCourt(etapeprecedente, arrive); |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | public TreeMap<Double, Segment> classement(Station d, Station a, HashSet<Segment> segmentvoisin) |
| 60 | { |
| 61 | TreeMap<Double,Segment> classementSegment = new TreeMap<Double,Segment>(); |
| 62 | for(Segment segment: segmentvoisin) |
| 63 | { |
| 64 | if(segment.getDestination()!=d) |
| 65 | { |
| 66 | classementSegment.put(distance(segment.getDestination(),a),segment); |
| 67 | } |
| 68 | } |
| 69 | return classementSegment; |
| 70 | } |
| 71 | |
| 72 | private void cheminPlusCourt(Station d, Station a) |
| 73 | { |
| 74 | int vitesse = 50; |
| 75 | int tempstrajet; |
| 76 | HashSet<Segment> segmentvoisin = d.getDestinations(); |
| 77 | TreeMap<Double,Segment> classementSegment = classement(d,a, segmentvoisin); |
| 78 | Segment voisin = classementSegment.get(classementSegment.firstKey()); |
| 79 | tempstrajet = (int) (distance(d,voisin.getDestination())/(vitesse*60)); |
| 80 | tempstrajet += attente(time); |
| 81 | meilleurTrajet = new Trajet(voisin,tempstrajet); |
| 82 | while(voisin.getDestination()!=a) |
| 83 | { |
| 84 | int corres=0; |
| 85 | classementSegment.clear(); |
| 86 | segmentvoisin = meilleurTrajet.dernierSegment().getDestination().getDestinations(); |
| 87 | classementSegment = classement(d,a, segmentvoisin); |
| 88 | voisin = classementSegment.get(classementSegment.firstKey()); |
| 89 | tempstrajet = (int) (distance(d,voisin.getDestination())/(vitesse*60)); |
| 90 | if(voisin.getNumero()!=meilleurTrajet.dernierSegment().getNumero()) |
| 91 | { |
| 92 | if(voisin.getSens() != meilleurTrajet.dernierSegment().getSens()) |
| 93 | { |
| 94 | tempstrajet += attente(time); |
| 95 | corres=1; |
| 96 | } |
| 97 | } |
| 98 | meilleurTrajet.addChemin(voisin,tempstrajet,corres); |
| 99 | } |
| 100 | } |
| 101 | |
| 102 | |
| 103 | private int attente(int heure) |
| 104 | { |
| 105 | if((heure>390 && heure<570) || (heure>720 && heure<840) || (heure>1050 && heure<1170)) |
| 106 | { |
| 107 | return 3; |
| 108 | } |
| 109 | else |
| 110 | { |
| 111 | return 7; |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | private double distance(Station a, Station b) |
| 116 | { |
| 117 | double constante = Math.PI / 180; |
| 118 | double latitudeA = a.getLatitude() * constante; |
| 119 | double longitudeA = a.getLongitude() * constante; |
| 120 | double latitudeB = b.getLatitude() * constante; |
| 121 | double longitudeB = b.getLongitude() * constante; |
| 122 | |
| 123 | double t1 = Math.sin(latitudeA) * Math.sin(latitudeB); |
| 124 | double t2 = Math.cos(latitudeA) * Math.cos(latitudeB); |
| 125 | double t3 = Math.cos(longitudeA - longitudeB); |
| 126 | double t4 = t2 * t3; |
| 127 | double t5 = t1 + t4; |
| 128 | double rad_dist = Math.atan(-t5/Math.sqrt(-t5 * t5 +1)) + 2 * Math.atan(1); |
| 129 | |
| 130 | return (rad_dist * 3437.74677 * 1.1508) * 1.6093470878864446; |
| 131 | } |
| 132 | |
| 133 | } |
| src/controleur/AEtoileDuree.java |
| 1 | | package controleur; |
| 2 | | |
| 3 | | import java.util.ArrayList; |
| 4 | | import modele.Station; |
| 5 | | |
| 6 | | /** |
| 7 | | * Sous classe spécifique pour l'utilisation de l'algorithme A* avec des durées |
| 8 | | */ |
| 9 | | class AEtoileDuree extends AEtoile |
| 10 | | { |
| 11 | | /** |
| 12 | | * {@link controleur.Requete Requête} qui contient les informations |
| 13 | | * nécessaires à l'algorithme |
| 14 | | */ |
| 15 | | private Requete requete; |
| 16 | | |
| 17 | | /** |
| 18 | | * Liste de {@link modele.Station stations} nécessaire au fonctionnement de |
| 19 | | * l'algorithme |
| 20 | | */ |
| 21 | | private ArrayList<Station> openList; |
| 22 | | |
| 23 | | /** |
| 24 | | * Liste de {@link modele.Station stations} nécessaire au fonctionnement de |
| 25 | | * l'algorithme |
| 26 | | */ |
| 27 | | private ArrayList<Station> closedList; |
| 28 | | |
| 29 | | /** |
| 30 | | * |
| 31 | | */ |
| 32 | | public AEtoileDuree() |
| 33 | | { |
| 34 | | |
| 35 | | } |
| 36 | | |
| 37 | | /** |
| 38 | | * Démarre l'algorithme |
| 39 | | */ |
| 40 | | @Override |
| 41 | | void lancement() |
| 42 | | { |
| 43 | | |
| 44 | | } |
| 45 | | |
| 46 | | /** |
| 47 | | * Getter du {@link controleur.Trajet trajet} |
| 48 | | * |
| 49 | | * @return Trajet correspondant à la requête |
| 50 | | */ |
| 51 | | public ArrayList<Trajet> getTrajet() |
| 52 | | { |
| 53 | | return this.listeTrajet; |
| 54 | | } |
| 55 | | |
| 56 | | /** |
| 57 | | * Récupère le plus court chemin et l'ajoute au {@link controleur.Trajet |
| 58 | | * trajet} |
| 59 | | * |
| 60 | | * @param stationActuelle Point de départ de la recherche du plus court |
| 61 | | * chemin |
| 62 | | * @param stationArrivee Point d'arrivée de la recherche du plus court |
| 63 | | * chemin |
| 64 | | */ |
| 65 | | private void plusCourtChemin(Station stationActuelle, Station stationArrivee) |
| 66 | | { |
| 67 | | |
| 68 | | } |
| 69 | | |
| 70 | | } |