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