Example #1
0
 // Méthodes abstrates, donc à surcharger obligatoirement avec override dans une classe fille
 public abstract bool IsEqual(GenericNode N2);
Example #2
0
        protected List <GenericNode> Enfants; // noeuds enfants

        public GenericNode()
        {
            ParentNode = null;
            Enfants    = new List <GenericNode>();
        }
Example #3
0
 public void SetNoeud_Parent(GenericNode g)
 {
     ParentNode = g;
     g.Enfants.Add(this);
 }
Example #4
0
 public abstract double GetArcCost(GenericNode N2);
Example #5
0
 public override double GetArcCost(GenericNode N2)
 {
     Node2 N2bis = (Node2)N2;
     return Dijkstra.matrice[numero, N2bis.numero];
 }
Example #6
0
        // Méthodes abstrates, donc à surcharger obligatoirement avec override dans une classe fille
        public override bool IsEqual(GenericNode N2)
        {
            Node2 N2bis = (Node2)N2;

            return numero == N2bis.numero;
        }
Example #7
0
        public List <GenericNode> RechercheSolutionAEtoile(GenericNode N0)
        {
            L_Ouverts    = new List <GenericNode>();
            L_Fermes     = new List <GenericNode>();
            ListeOuverts = new string[50]; //Voir si on ne peut pas faire un tableau de la taille exacte du nombre de n°/noeuds !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            ListeFermes  = new string[50]; // Liste des fermés enregistrés à chaque étape
            // Le noeud passé en paramètre est supposé être le noeud initial
            GenericNode N = N0;

            L_Ouverts.Add(N0);

            // Tant que le noeud n'est pas terminal et que ouverts n'est pas vide
            //int etapeDij = 0; //(Nb. détapes - 1) de la résolution de A*
            while (L_Ouverts.Count != 0 && N.EndState() == false)
            {
                // Le meilleur noeud des ouverts est supposé placé en tête de liste
                // On le place dans les fermés
                L_Ouverts.Remove(N);
                L_Fermes.Add(N);

                // Il faut trouver les noeuds successeurs de N et les mettre dans le ouverts
                this.MAJSuccesseurs(N);
                // 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 (L_Ouverts.Count > 0)
                {
                    N = L_Ouverts[0];
                }
                else
                {
                    N = null;
                }

                //Enregistrement des étapes de recherche de F et O à chaque fois :
                for (int i = 0; i < L_Fermes.Count; i++)
                {
                    ListeFermes[etapeDij] += Convert.ToString(L_Fermes[i]);
                }
                for (int i = 0; i < L_Ouverts.Count; i++)
                {
                    ListeOuverts[etapeDij] += Convert.ToString(L_Ouverts[i]);
                }
                etapeDij++;
            }
            if (N.EndState() == true) //Dernière étape
            {
                L_Ouverts.Remove(N);
                L_Fermes.Add(N);

                //Enregistrement de la dernière étapes pour F et O :
                for (int i = 0; i < L_Fermes.Count; i++)
                {
                    ListeFermes[etapeDij] += Convert.ToString(L_Fermes[i]);
                }
                ListeOuverts[etapeDij] += "vide";
                etapeDij++;
            }

            // 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
            List <GenericNode> _LN = new List <GenericNode>();

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

                while (N != N0)
                {
                    N = N.GetNoeud_Parent();
                    _LN.Insert(0, N);  // On insère en position 1
                }
            }
            return(_LN); //seulement le n° des noeuds faisant partis du + court chemin
        }
Example #8
0
        //il faut que ça rende true si à l'etape concernée les ouverts et les fermés donné par l'utilisateur sont les bons
        public bool RechercheSolutionAEtoileValidation(GenericNode N0, int etapeValidation, string ouvertDonne, string fermeDonne)
        {
            int etape = 0;

            L_Ouverts = new List <GenericNode>();
            L_Fermes  = new List <GenericNode>();
            string ouvertCorrection = "";
            string fermeCorrection  = "";
            // Le noeud passé en paramètre est supposé être le noeud initial
            GenericNode N = N0;

            L_Ouverts.Add(N0);

            // tant que le noeud n'est pas terminal et que ouverts n'est pas vide
            while (L_Ouverts.Count != 0 && N.EndState() == false)
            {
                foreach (GenericNode x in L_Ouverts)
                {
                    ouvertCorrection += x.ToString();
                }
                if (L_Fermes.Count != 0)
                {
                    foreach (GenericNode x in L_Fermes)
                    {
                        fermeCorrection += x.ToString();
                    }
                }
                if ((etape == etapeValidation) && etudeString(ouvertCorrection, ouvertDonne) && etudeString(fermeCorrection, fermeDonne))
                {
                    return(true);
                }

                /* Si à l'étape que l'on corrige, les ouvert et les fermés donnés sont les mêmes que les ouverts et les fermés trouvés par A* alors on retourne true.
                 * Sinon on retourne false : l'utilisateur c'est trompé !
                 */

                // Le meilleur noeud des ouverts est supposé placé en tête de liste
                // On le place dans les fermés
                L_Ouverts.Remove(N);
                L_Fermes.Add(N);



                // Il faut trouver les noeuds successeurs de N
                this.MAJSuccesseurs(N);
                // 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 (L_Ouverts.Count > 0)
                {
                    N = L_Ouverts[0];
                }
                else
                {
                    N = null;
                }
                // Il faut ensuite nettoyer les string ouvertCorrection et fermeCorrection pour les étapes suivantes:
                ouvertCorrection = "";
                fermeCorrection  = "";
                etape++;
            }
            return(false); // Si on sort de la boucle while c'est que l'utilisateur c'est trompé
        }