Пример #1
0
 public void InsertNewNodeInOpenList(Sommet NewNode, int numEtape)
 {
     // Insertion pour respecter l'ordre du cout total le plus petit au plus grand
     if (SommetsOuverts.Count == 0)
     {
         SommetsOuverts.Add(NewNode);
     }
     else
     {
         Sommet s      = SommetsOuverts[0];
         bool   trouve = false;
         int    i      = 0;
         do
         {
             if ((NewNode.CoutTotal < s.CoutTotal) && (!EtatsSuccessifsOuverts[numEtape - 1].Contains(s)))//si s n'était pas présent dans les ouverts de l'étape précédente
             {
                 SommetsOuverts.Insert(i, NewNode);
                 trouve = true;
             }
             else
             {
                 i++;
                 if (SommetsOuverts.Count == i)
                 {
                     s = null;
                     SommetsOuverts.Insert(i, NewNode);
                 }
                 else
                 {
                     s = SommetsOuverts[i];
                 }
             }
         }while ((s != null) && (trouve == false));
     }
 }
Пример #2
0
        public void RechercheSolutionAEtoile()
        {
            int    numEtape = 1;
            Sommet s        = SommetInitial;

            SommetsOuverts.Add(s);
            EtatsSuccessifsOuverts.Add(DeepCopy(SommetsOuverts));
            EtatsSuccessifsFermes.Add(DeepCopy(SommetsFermes));
            // tant que le noeud n'est pas terminal et que ouverts n'est pas vide
            while (SommetsOuverts.Count != 0 && s.EndState() == false)
            {
                // Le meilleur noeud des ouverts est supposé placé en tête de liste
                // On le place dans les fermés
                SommetsOuverts.Remove(s);
                SommetsFermes.Add(s);

                // Il faut trouver les noeuds successeurs de s
                MAJSuccesseurs(s, numEtape);
                // 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
                // A condition qu'il existe bien sûr
                if (SommetsOuverts.Count > 0)
                {
                    s = SommetsOuverts.First();
                }
                else
                {
                    s = null;
                }
                EtatsSuccessifsOuverts.Add(DeepCopy(SommetsOuverts));
                EtatsSuccessifsFermes.Add(DeepCopy(SommetsFermes));
                numEtape++;
            }
            SommetsOuverts.Remove(SommetFinal);
            SommetsFermes.Add(SommetFinal);
            EtatsSuccessifsOuverts.Add(SommetsOuverts);
            EtatsSuccessifsFermes.Add(SommetsFermes);
            // A* terminé
            // On retourne le chemin qui va du noeud initial au noeud final sous forme de liste
            // Le chemin est retrouvé en partant du noeud final et en accédant aux parents de manière
            // itérative jusqu'à ce qu'on tombe sur le noeud initial
            if (s != null)
            {
                PlusCourtChemin.Add(s);
                CoutPlusCourtChemin = s.CoutTotal;
                while (!s.IsEqual(SommetInitial))
                {
                    s = s.SommetParent;
                    PlusCourtChemin.Insert(0, s);  // On insère en position 1
                }
            }
        }