private 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.calculCoutTotal(); // 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.SetHCost(N2.CalculeHCost()); N2.SetNoeud_Parent(N); N2.calculCoutTotal(); // somme de GCost et HCost 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 } }
private void UpdateSuccessors(GenericNode node) { // 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> successors = node.GetSuccessors(); foreach (GenericNode successorNode in successors) { // N2 est-il une copie d'un nœud déjà vu et placé dans la liste des fermés ? GenericNode closedSuccessor = SearchInClosed(successorNode); if (closedSuccessor == null) { // Rien dans les fermés. Est-il dans les ouverts ? GenericNode openedSuccessor = SearchInOpened(successorNode); if (openedSuccessor != 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 (node.GCost + node.GetArcCost(successorNode) < openedSuccessor.GCost) { // Mise à jour de N2bis // somme de GCost et HCost effectuée à la mise à jour de GCost openedSuccessor.GCost = node.GCost + node.GetArcCost(successorNode); // HCost pas recalculé car toujours bon // Mise à jour de la famille .... openedSuccessor.FlushParent(); openedSuccessor.ParentNode = node; // Mise à jour des ouverts OpenedNodes.Remove(openedSuccessor); this.InsertNewNodeInOpenList(openedSuccessor); } // else on ne fait rien, car le nouveau chemin est moins bon } else { // N2 est nouveau, MAJ et insertion dans les ouverts successorNode.GCost = node.GCost + node.GetArcCost(successorNode); successorNode.ParentNode = node; this.InsertNewNodeInOpenList(successorNode); } } // 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 } }
protected 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.GetNom()); if (N2bis == null) { // Rien dans les fermés. Est-il dans les ouverts ? N2bis = ChercheNodeDansOuverts(N2.GetNom()); 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.Cout_Total + N.GetArcCost(N2) < N2bis.Cout_Total) { // Mise à jour de N2bis N2bis.SetGCost(N.GetGCost() + N.GetArcCost(N2)); // HCost pas recalculé car toujours bon N2bis.calculCoutTotal(); // 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.SetNoeud_Parent(N); N2.SetGCost(N.GetGCost() + N.GetArcCost(N2)); N2.CalculeHCost(); N2.calculCoutTotal(); // somme de GCost et HCost 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 } }