public override double GetArcCost(GenericNode N2) { SpecificNode N2bis = (SpecificNode)N2; return(DijkstraAForm.matrice[numero, N2bis.numero]); }
/* Fonction principale de résolution de l'algorithme */ public List <GenericNode> RechercheSolutionAEtoile(GenericNode N0, DijkstraAForm form) { int ite = 1; //Listes qui se remplira des nodes pour la résolution de l'algorithme L_Ouverts = new List <GenericNode>(); L_Fermes = new List <GenericNode>(); //Liste contenant les solutions string de l'input pour l'utilisateur //e.g : si on en est à l'étape 2 de la résolution, la liste L_FermesEvolution contiendra { {"N0"}, {"N0", "N1"} } L_OuvertsEvolution = new List <String[]>(); L_FermesEvolution = new List <String[]>(); //Le noeud passé en paramètre est supposé être le noeud initial GenericNode N = N0; L_Ouverts.Add(N0); //Enregistrement de l'étape 1 L_OuvertsEvolution.Add(ToStringList(L_Ouverts)); L_FermesEvolution.Add(ToStringList(L_Fermes)); // tant que le noeud n'est pas terminal et que ouverts n'est pas vide while (L_Ouverts.Count != 0 && N.EndState() == false) { ite++; // 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 //Enregistrement de l'étape "ite" L_OuvertsEvolution.Add(ToStringList(L_Ouverts)); L_FermesEvolution.Add(ToStringList(L_Fermes)); // 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; } } form.SetIterationInputGoal(++ite); L_Fermes.Add(N); L_Ouverts.Remove(N); this.MAJSuccesseurs(N); //Enregistrement de la dernière étape L_OuvertsEvolution.Add(ToStringList(L_Ouverts)); L_FermesEvolution.Add(ToStringList(L_Fermes)); // 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); }
// Méthodes abstraites, donc à surcharger obligatoirement avec override dans une classe fille public override bool IsEqual(GenericNode N2) { SpecificNode N2bis = (SpecificNode)N2; return(numero == N2bis.numero); }
public abstract double GetArcCost(GenericNode N2);
// Méthodes abstraites, 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>(); }