Ejemplo n.º 1
0
        /// <summary>
        /// Permet de trouver les successeurs du dernier nœud fermé
        /// </summary>
        /// <param name="N">Nœud dont on cherche les successeurs</param>
        private void MettreAJourSuccesseurs(Noeud 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 nœuds successeurs de N.
            List <Noeud> listSucc = N.ObtenirSuccesseurs();

            // Pour chaque nœud de la liste des successeurs
            foreach (Noeud noeudEvalue in listSucc)
            {
                // On vérifie s’il n’est pas une copie d’un nœud déjà vu
                // et placé dans la liste des fermés
                Noeud noeudTrouve = ChercherNoeudDansFermes(noeudEvalue);

                if (noeudTrouve == null)
                {
                    // Si ce n’est pas le cas, on vérifie également s’il n’est pas
                    // une copie d’un nœud déjà vu et placé dans la liste des fermés
                    noeudTrouve = ChercherNoeudDansOuverts(noeudEvalue);

                    if (noeudTrouve != null)
                    {
                        // Il existe, donc on l’a déjà vu.
                        // Le nouveau chemin passant par N est-il meilleur ?
                        if (N.GCout + N.ObtenirCout(noeudEvalue) < noeudTrouve.GCout)
                        {
                            // Mise à jour du nœud trouvé
                            noeudTrouve.GCout = N.GCout + N.ObtenirCout(noeudEvalue);

                            // HCost pas recalculé car toujours bon
                            noeudTrouve.CalculerCoutTotal(); // somme de GCost et HCost

                            // Mise à jour de la famille...
                            noeudTrouve.SupprimerLiensParent();
                            noeudTrouve.Parent(N);

                            // Mise à jour des ouverts
                            noeudsOuverts.Remove(noeudTrouve);
                            this.InsererNoeudDansOuverts(noeudTrouve);
                        }

                        // else on ne fait rien, car le nouveau chemin est moins bon
                    }

                    else
                    {
                        // Le nœud est nouveau. Il faut donc le mettre à jour
                        // et l’insérer dans la liste des ouverts
                        noeudEvalue.GCout = N.GCout + N.ObtenirCout(noeudEvalue);
                        noeudEvalue.CalculerHCout();
                        noeudEvalue.Parent(N);
                        noeudEvalue.CalculerCoutTotal(); // somme de GCost et HCost
                        this.InsererNoeudDansOuverts(noeudEvalue);
                    }
                }

                // else il est dans les fermés donc on ne fait rien,
                // car on a déjà trouvé le plus court chemin pour aller vers le nœud évalué
            }
        }