예제 #1
0
        private void MAJSuccesseurs(Sommet s, int numEtape)
        {
            // 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 s.
            List <Sommet> listsucc = s.GetSuccesseurs();

            foreach (Sommet succ in listsucc)
            {
                // succ est-il une copie d'un nœud déjà vu et placé dans la liste des fermés ?
                Sommet succBis = SommetsFermes.Find(x => x.IsEqual(succ));
                if (succBis == null)
                {
                    // Rien dans les fermés. Est-il dans les ouverts ?
                    succBis = SommetsOuverts.Find(x => x.IsEqual(succ));
                    if (succBis != null)
                    {
                        // Il existe, donc on l'a déjà vu, succ n'est qu'une copie de N2Bis
                        // Le nouveau chemin passant par s est-il meilleur ?
                        if (s.CoutCumule + RetrouveArete(s, succ).Cout < succBis.CoutCumule)
                        {
                            // Mise à jour de succBis
                            succBis.CoutCumule = s.CoutCumule + RetrouveArete(s, succ).Cout;
                            // HCost pas recalculé car toujours bon
                            succBis.RecalculeCoutTotal(); // somme de CoutCumule et CoutHeuristique
                            // Mise à jour de la famille ....
                            succBis.SupprimeLienParent();
                            succBis.SommetParent = s;
                            // Mise à jour des ouverts
                            SommetsOuverts.Remove(succBis);
                            InsertNewNodeInOpenList(succBis, numEtape);
                        }
                        // else on ne fait rien, car le nouveau chemin est moins bon
                    }
                    else
                    {
                        // succ est nouveau, MAJ et insertion dans les ouverts
                        succ.CoutCumule   = s.CoutCumule + RetrouveArete(s, succ).Cout;
                        succ.SommetParent = s;
                        succ.CalculCoutTotal(); // somme de GCost et HCost
                        InsertNewNodeInOpenList(succ, numEtape);
                    }
                }
                // 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 succ
            }
        }
예제 #2
0
        /// <summary>
        /// Détermine si le sommet s est assez éloigné du SommetInitial, c'est-à-dire qu'ils soient séparés d'au moins 2 sommets
        /// </summary>
        public bool PointsInitialFinalAssezEloignes(Sommet s)
        {
            List <Sommet> plusProchesVoisins = s.GetSuccesseurs();

            foreach (Sommet voisin in plusProchesVoisins)
            {
                if (voisin.IsEqual(SommetInitial))
                {
                    return(false);
                }
                else
                {
                    List <Sommet> voisinsEloignes = voisin.GetSuccesseurs();
                    foreach (Sommet voisinEloigne in voisinsEloignes)
                    {
                        if (voisinEloigne.IsEqual(SommetInitial))
                        {
                            return(false);
                        }
                    }
                }
            }
            return(true);
        }