示例#1
0
      public 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.RecalculeCoutTotal();   // 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.SetNoeud_Parent(N);
                      N2.CalculCoutTotal();   // somme de GCost et HCost. HCost calculé dans cette fonction
                      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
          }
      }