Exemple #1
0
 // AjouteBranche est exclusivement appelée par GetSearchTree; les noeuds sont ajoutés de manière récursive
 public void AjouteBranche(Noeud GN, TreeNode TN, bool visible)
 {
     foreach (Noeud GNfils in GN.Enfants)
     {
         TreeNode TNfils;
         if (visible)
         {
             TNfils = new TreeNode("?");
         }
         else
         {
             TNfils = new TreeNode(Convert.ToString(GNfils.ID));
         }
         TN.Nodes.Add(TNfils);
         if (GNfils.Enfants.Count > 0)
         {
             AjouteBranche(GNfils, TNfils, visible);
         }
     }
 }
Exemple #2
0
        public FormDijkstra()
        {
            InitializeComponent();
            this.FormBorderStyle      = FormBorderStyle.FixedSingle;
            listBoxRepFermes.Enabled  = false;
            listBoxRepOuverts.Enabled = false;
            reponses    = new List <String> [2];
            reponses[0] = new List <string>();
            reponses[1] = new List <string>();
            InitialisationFichierTexte("graphe1.txt");
            Noeud          Ninit    = new Noeud(numinitial);
            Noeud          NF       = new Noeud(numfinal);
            ArbreRecherche sol      = new ArbreRecherche(matrice);
            List <Noeud>   solution = sol.Dijkstra(Ninit, NF);

            ListeDesOuverts = sol.ListeDesOuverts;
            ListeDesFermes  = sol.ListeDesFermes;
            sol.GetArbreRecherche(this.treeViewExercice, true);
            sol.GetArbreRecherche(this.treeViewNonVisible, false);
            this.treeViewExercice.ExpandAll();
        }
Exemple #3
0
        public List <Noeud> Dijkstra(Noeud noeudInit, Noeud noeudFinal)
        {
            List <Noeud> SuccNoeudCourant;
            Noeud        noeudCourant = new Noeud(noeudInit.ID);

            //Noeud noeudCourant = noeudInit;
            L_Ouverts.Add(noeudCourant);
            int NbNoeud = matrice.GetLength(0);

            while (L_Ouverts.Count != 0 && noeudCourant.estNoeudFinal(noeudFinal.ID) == false)
            {
                //On commence par passer le noeud courant dans les fermes :
                L_Fermes.Add(noeudCourant);
                L_Ouverts.Remove(noeudCourant);
                //On cherche les noeuds successeurs du noeud courant dans le graph:
                SuccNoeudCourant = noeudCourant.GetListeSuccesseurs(this.matrice);
                // On vient placer tous les successeurs dans les ouverts (on fait attention à ceux déjà présents dans les ouverts)
                foreach (Noeud noeud in SuccNoeudCourant)
                {
                    Noeud N2 = ChercheNoeudDansFermes(noeud);
                    if (N2 == null)
                    {
                        // Si il n'est pas déjà dans les fermés on le cherche dans les ouverts
                        N2 = ChercheNoeudDansOuverts(noeud);
                        if (N2 != null)
                        {
                            //il est dans les ouverts on regarde si ce nouveau chemin est meilleur
                            if (N2.InitCout > noeud.CoutEntreNoeud(noeudCourant, matrice) + noeudCourant.InitCout)
                            {
                                //Si celui des fermés à un cout chemin supérieur à celui qui vient de sortir
                                N2.InitCout = noeud.CoutEntreNoeud(noeudCourant, matrice) + noeudCourant.InitCout;
                                // On supprime son noeud parent
                                N2.Supprime_Liens_Parent();
                                // On modifie et on y met ce nouveau noeud parent
                                N2.SetNoeud_Parent(noeudCourant);
                                // On vire des ouverts le noeud N2 avec le mauvais parent
                                L_Ouverts.Remove(N2);
                                // On remet le bon dedans (et on trie à la bonne place)
                                this.InsertDansOuverts(N2);
                            }
                        }
                        else //il n'est ni dans les fermes, ni dans les ouverts
                        {
                            // Noeud est nouveau, on calcule son cout et on lui affecte un parent (le noeud courant)
                            noeud.InitCout = noeudCourant.InitCout + noeudCourant.CoutEntreNoeud(noeud, matrice);
                            Noeud enfant = new Noeud(noeud.ID, noeud.InitCout);
                            enfant.SetNoeud_Parent(noeudCourant);
                            // On l'insere à la bonne place dans les ouverts
                            this.InsertDansOuverts(enfant);
                        }
                    }//Si N2 est déjà dans les fermés on ne le visite pas donc il n'est pas inséré dans les ouverts
                }
                if (L_Ouverts.Count > 0)
                {
                    List <Noeud> tempoOuvert = new List <Noeud>();
                    List <Noeud> tempoFermes = new List <Noeud>();
                    foreach (Noeud noeud in L_Ouverts)
                    {
                        tempoOuvert.Add(noeud);
                    }
                    foreach (Noeud noeud in L_Fermes)
                    {
                        tempoFermes.Add(noeud);
                    }
                    ListeDesOuverts.Add(tempoOuvert);
                    ListeDesFermes.Add(tempoFermes);
                    noeudCourant = L_Ouverts[0];
                }
                else
                {
                    //On arrive sur une liste des ouverts vides, il n'y a pas de solution
                    noeudCourant = null;
                }
            }
            // On créee une liste pour renvoyer le chemin le plus court
            List <Noeud> CheminLePlusCourt = new List <Noeud>();

            if (noeudCourant != null)
            {
                CheminLePlusCourt.Add(noeudCourant);
                while (noeudCourant.NoeudParent != null)
                {
                    noeudCourant = noeudCourant.NoeudParent;
                    CheminLePlusCourt.Insert(0, noeudCourant);  // On insère en position 1
                }
            }
            return(CheminLePlusCourt);
        }
Exemple #4
0
 public void SetNoeud_Parent(Noeud g)
 {
     NoeudParent = g;
     g.Enfants.Add(this);
 }
Exemple #5
0
 public int CoutEntreNoeud(Noeud N2, int[,] matrice)
 {
     return(matrice[this.ID, N2.ID]);
 }
Exemple #6
0
 public bool estEgal(Noeud N2)
 {
     return(this.ID == N2.ID);
 }