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 } }
/// <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); }