Ejemplo n.º 1
0
        /// <summary>
        /// Permet de rechercher le plus court chemin
        /// </summary>
        /// <param name="noeudInitial">Nœud de départ</param>
        /// <param name="xFinal">Ligne du nœud d’arrivée</param>
        /// <param name="yFinal">Colonne du nœud d’arrivée</param>
        /// <returns>Liste des nœuds pour aller du départ à l’arrivée</returns>
        public List <Noeud> RechercherSolutionAEtoile(Noeud noeudInitial)
        {
            noeudsOuverts = new List <Noeud>();
            noeudsFermes  = new List <Noeud>();

            Noeud noeud = noeudInitial;

            // On ajoute le nœud de départ aux ouverts
            noeudsOuverts.Add(noeudInitial);

            // Tant que le nœud n’est pas terminal
            // et que la liste des ouverts n’est pas vide
            while (noeudsOuverts.Count != 0 && noeud.VerifierFin() == false)
            {
                // Le meilleur nœud des ouverts est supposé placé
                // en tête de liste des fermés
                noeudsOuverts.Remove(noeud);
                noeudsFermes.Add(noeud);

                // Il faut trouver les nœuds successeurs de N
                this.MettreAJourSuccesseurs(noeud);
                // Inutile de retrier car les insertions ont été faites en respectant l’ordre

                // On prend le meilleur, donc celui en position 0, pour continuer
                // à explorer les états, à condition qu’il existe bien sûr
                if (noeudsOuverts.Count > 0)
                {
                    noeud = noeudsOuverts[0];
                }

                else
                {
                    noeud = null;
                }
            }

            // A* terminé
            // On retourne le chemin qui va du nœud initial au nœud final sous forme de liste
            // Le chemin est retrouvé en partant du nœud final et en accédant aux parents de manière
            // itérative jusqu’à ce qu’on tombe sur le nœud initial
            List <Noeud> _LN = new List <Noeud>();

            if (noeud != null)
            {
                _LN.Add(noeud);

                while (noeud != noeudInitial)
                {
                    noeud = noeud.Parent();
                    _LN.Insert(0, noeud);  // On insère en position 1
                }
            }

            return(_LN);
        }