Пример #1
0
 private void EnleverNoeudOuvert(GenericNode N2)
 {
     L_Ouverts.Remove(N2);
 }
Пример #2
0
        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);
        }