private void EnleverNoeudOuvert(GenericNode N2) { L_Ouverts.Remove(N2); }
public List <Noeud> Dijkstra(Noeud noeudInit, Noeud noeudFinal) { List <Noeud> SuccNoeudCourant; Noeud noeudCourant = new Noeud(noeudInit.ID); //Noeud noeudCourant = noeudInit; L_Ouverts.Add(noeudCourant); int NbNoeud = matrice.GetLength(0); while (L_Ouverts.Count != 0 && noeudCourant.estNoeudFinal(noeudFinal.ID) == false) { //On commence par passer le noeud courant dans les fermes : L_Fermes.Add(noeudCourant); L_Ouverts.Remove(noeudCourant); //On cherche les noeuds successeurs du noeud courant dans le graph: SuccNoeudCourant = noeudCourant.GetListeSuccesseurs(this.matrice); // On vient placer tous les successeurs dans les ouverts (on fait attention à ceux déjà présents dans les ouverts) foreach (Noeud noeud in SuccNoeudCourant) { Noeud N2 = ChercheNoeudDansFermes(noeud); if (N2 == null) { // Si il n'est pas déjà dans les fermés on le cherche dans les ouverts N2 = ChercheNoeudDansOuverts(noeud); if (N2 != null) { //il est dans les ouverts on regarde si ce nouveau chemin est meilleur if (N2.InitCout > noeud.CoutEntreNoeud(noeudCourant, matrice) + noeudCourant.InitCout) { //Si celui des fermés à un cout chemin supérieur à celui qui vient de sortir N2.InitCout = noeud.CoutEntreNoeud(noeudCourant, matrice) + noeudCourant.InitCout; // On supprime son noeud parent N2.Supprime_Liens_Parent(); // On modifie et on y met ce nouveau noeud parent N2.SetNoeud_Parent(noeudCourant); // On vire des ouverts le noeud N2 avec le mauvais parent L_Ouverts.Remove(N2); // On remet le bon dedans (et on trie à la bonne place) this.InsertDansOuverts(N2); } } else //il n'est ni dans les fermes, ni dans les ouverts { // Noeud est nouveau, on calcule son cout et on lui affecte un parent (le noeud courant) noeud.InitCout = noeudCourant.InitCout + noeudCourant.CoutEntreNoeud(noeud, matrice); Noeud enfant = new Noeud(noeud.ID, noeud.InitCout); enfant.SetNoeud_Parent(noeudCourant); // On l'insere à la bonne place dans les ouverts this.InsertDansOuverts(enfant); } }//Si N2 est déjà dans les fermés on ne le visite pas donc il n'est pas inséré dans les ouverts } if (L_Ouverts.Count > 0) { List <Noeud> tempoOuvert = new List <Noeud>(); List <Noeud> tempoFermes = new List <Noeud>(); foreach (Noeud noeud in L_Ouverts) { tempoOuvert.Add(noeud); } foreach (Noeud noeud in L_Fermes) { tempoFermes.Add(noeud); } ListeDesOuverts.Add(tempoOuvert); ListeDesFermes.Add(tempoFermes); noeudCourant = L_Ouverts[0]; } else { //On arrive sur une liste des ouverts vides, il n'y a pas de solution noeudCourant = null; } } // On créee une liste pour renvoyer le chemin le plus court List <Noeud> CheminLePlusCourt = new List <Noeud>(); if (noeudCourant != null) { CheminLePlusCourt.Add(noeudCourant); while (noeudCourant.NoeudParent != null) { noeudCourant = noeudCourant.NoeudParent; CheminLePlusCourt.Insert(0, noeudCourant); // On insère en position 1 } } return(CheminLePlusCourt); }