Exemple #1
0
 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.GetNom());
         if (N2bis == null)
         {
             // Rien dans les fermés. Est-il dans les ouverts ?
             N2bis = ChercheNodeDansOuverts(N2.GetNom());
             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(N,N2) < N2bis.GetGCost())
                 {
                     // Mise à jour de N2bis
                     N2bis.SetGCost(N.GetGCost() + N.GetArcCost(N,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(N,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
     }
 }