Beispiel #1
0
        /// <summary>
        /// Algorithme A étoile, mais quand les heuristiques sont faibles, peut prendre un noeud terminal meme si ce n'est pas le minimum de coups
        /// </summary>
        /// <param name="N0"></param>
        /// <returns></returns>
        public List <GenericNode> RechercheSolutionAttrapay(GenericNode N0)
        {
            L_Ouverts = new List <GenericNode>();
            L_Fermes  = new List <GenericNode>();
            // 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 (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
                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];
                    if (N.CalculeHCost() < 10)
                    {
                        foreach (GenericNode n in L_Ouverts)
                        {
                            if (n.EndState() == true)
                            {
                                N = n;
                            }
                        }
                    }
                }
                else
                {
                    N = null;
                }
            }

            // 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);
        }
Beispiel #2
0
 public abstract double GetArcCost(GenericNode N2);
Beispiel #3
0
 // Méthodes abstrates, donc à surcharger obligatoirement avec override dans une classe fille
 public abstract bool IsEqual(GenericNode N2);
Beispiel #4
0
 public void SetNoeud_Parent(GenericNode g)
 {
     ParentNode = g;
     g.Enfants.Add(this);
 }
Beispiel #5
0
        protected List <GenericNode> Enfants; // noeuds enfants

        public GenericNode()
        {
            ParentNode = null;
            Enfants    = new List <GenericNode>();
        }
Beispiel #6
0
 /// <summary>
 /// Returns 1 because in the Taquin problem, every action costs 1, so arcs between states cost 1.
 /// </summary>
 /// <param name="N2"></param>
 /// <returns></returns>
 public override double GetArcCost(GenericNode N2)
 {
     return(1);
 }