Example #1
0
        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.GenericCas = N.GenericCas;
                // 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)
                    {
                        N2bis.GenericCas = N.GenericCas;
                        // 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) < N2.GetGCost())
                        {
                            // Mise à jour de N2bis
                            N2bis.SetGCost(N.GetGCost() + N.GetArcCost(N2));
                            // HCost pas recalculé car toujours bon
                            N2bis.RecalculeCoutTotal(); // 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.SetNoeud_Parent(N);
                        N2.calculCoutTotal(); // somme de GCost et HCost

                        //essai : si le noeud a un cout de plus d'1 million on ne l'explore pas
                        if (N2.Cout_Total >= 1000000)
                        {
                            //nothing
                        }
                        else
                        {
                            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
            }
        }
Example #2
0
        private void MAJ_Successeurs(Noeuds 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 <Noeuds> listsucc = N.ListeSuccesseur();

            foreach (Noeuds N2 in listsucc)
            {
                // N2 est-il une copie d'un nœud déjà vu et placé dans la liste des fermés ?
                Noeuds N2bis = ChercheNoeudDansFermes(N2);
                if (N2bis == null)
                {
                    // Rien dans les fermés. Est-il dans les fermes ?
                    N2bis = ChercheNoeudDansOuverts(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.CoutDepuisInit + N.CoutDeArcAvec(N2) < N2bis.CoutDepuisInit)
                        {
                            // Mise à jour de N2bis
                            N2bis.CoutDepuisInit += N.CoutDeArcAvec(N2);
                            // HCost pas recalculé car toujours bon
                            N2bis.calculCoutTotal(); // somme de GCost et HCost
                            // Mise à jour de la famille ....
                            N2bis.Supprime_Liens_Parent();
                            N2bis.Definir_Comme_Parent(N);
                            // Mise à jour des fermes
                            L_Ouverts.Remove(N2bis);
                            this.AjoutAuxOuverts(N2bis);
                        }
                        // else on ne fait rien, car le nouveau chemin est moins bon
                    }
                    else
                    {
                        // N2 est nouveau, MAJ et insertion dans les fermes
                        N2.CoutDepuisInit += N.CoutDeArcAvec(N2);
                        N2.CalculerCoutVersNoeudFinal();
                        N2.Definir_Comme_Parent(N);
                        N2.calculCoutTotal(); // somme de GCost et HCost
                        this.AjoutAuxOuverts(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
            }
        }