public void UpdateSuccessors(ANode <TMove> N, ANode <TMove> finalState) { // 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. var listsucc = this.FilterNode != null?this.game.NextNodes(N, node => this.FilterNode.SameAs(node)) : this.game.NextNodes(N); foreach (var N2 in listsucc) { // N2 est-il une copie d'un nœud déjà vu et placé dans la liste des fermés ? var N2bis = graph.FindIfExistInClosed(N2); if (N2bis == null) { // Rien dans les fermés. Est-il dans les ouverts ? N2bis = graph.FindIfExistInOpened(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.GCost + 1 < N2bis.GCost) { // Mise à jour de N2bis N2bis.GCost = N.GCost + 1; // HCost pas recalculé car toujours bon // Mise à jour de la famille .... N.Attach(N2bis, N2.MoveFromParent); // Mise à jour des ouverts graph.Opened.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 N.Attach(N2, N2.MoveFromParent); N2.GCost = N.GCost + 1; N2.HCost = N2.Heuristics(finalState); this.InsertNewNodeInOpenList(N2); } // Insertion pour respecter l'ordre du cout total le plus petit au plus grand } // 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 } }