private void MAJSuccesseurs(GenericNode N) { // On fait appel à GetListSucc, méthode abstraite qu'on doit réécrire pour chaque // problème. Elle doit retourner la liste complète des noeuds successeurs de N. List <GenericNode> listsucc = N.GetListSucc(); foreach (GenericNode N2 in listsucc) { // N2 est-il une copie d'un nœud déjà vu et placé dans la liste des fermés ? GenericNode N2bis = ChercheNodeDansFermes(N2); if (N2bis == null) { // Rien dans les fermés. Est-il dans les ouverts ? N2bis = ChercheNodeDansOuverts(N2); if (N2bis != null) { // Il existe, donc on l'a déjà vu, N2 n'est qu'une copie de N2Bis // Le nouveau chemin passant par N est-il meilleur ? if (N.GetGCost() + N.GetArcCost(N2) < N2bis.GetGCost()) { // Mise à jour de N2bis N2bis.SetGCost(N.GetGCost() + N.GetArcCost(N2)); // HCost pas recalculé car toujours bon N2bis.calculCoutTotal(); // somme de GCost et HCost // Mise à jour de la famille .... N2bis.Supprime_Liens_Parent(); N2bis.SetNoeud_Parent(N); // Mise à jour des ouverts L_Ouverts.Remove(N2bis); this.InsertNewNodeInOpenList(N2bis); } // else on ne fait rien, car le nouveau chemin est moins bon } else { // N2 est nouveau, MAJ et insertion dans les ouverts N2.SetGCost(N.GetGCost() + N.GetArcCost(N2)); N2.CalculeHCost(); N2.SetNoeud_Parent(N); N2.calculCoutTotal(); // somme de GCost et HCost this.InsertNewNodeInOpenList(N2); } } // else il est dans les fermés donc on ne fait rien, // car on a déjà trouvé le plus court chemin pour aller en N2 } }