private void PlotPoint2D(Sommet s) { PointF ptf = s.Pt; Font f = new Font("Calibri", 11, FontStyle.Bold); Brush b = Brushes.Black; if (s.IsEqual(grapheDijkstra.SommetInitial) || s.IsEqual(grapheDijkstra.SommetFinal)) { b = Brushes.Blue; } dessin.DrawString(s.Label, f, b, ptf); if (s.IsEqual(grapheDijkstra.SommetActuel)) { SolidBrush aBrush = new SolidBrush(Color.Red); int w = 7; dessin.FillRectangle(aBrush, ptf.X - w / 2, ptf.Y - w / 2, w, w); } }
public void RechercheSolutionAEtoile() { int numEtape = 1; Sommet s = SommetInitial; SommetsOuverts.Add(s); EtatsSuccessifsOuverts.Add(DeepCopy(SommetsOuverts)); EtatsSuccessifsFermes.Add(DeepCopy(SommetsFermes)); // tant que le noeud n'est pas terminal et que ouverts n'est pas vide while (SommetsOuverts.Count != 0 && s.EndState() == false) { // Le meilleur noeud des ouverts est supposé placé en tête de liste // On le place dans les fermés SommetsOuverts.Remove(s); SommetsFermes.Add(s); // Il faut trouver les noeuds successeurs de s MAJSuccesseurs(s, numEtape); // Inutile de retrier car les insertions ont été faites en respectant l'ordre // On prend le meilleur, donc celui en position 0, pour continuer à explorer les états // A condition qu'il existe bien sûr if (SommetsOuverts.Count > 0) { s = SommetsOuverts.First(); } else { s = null; } EtatsSuccessifsOuverts.Add(DeepCopy(SommetsOuverts)); EtatsSuccessifsFermes.Add(DeepCopy(SommetsFermes)); numEtape++; } SommetsOuverts.Remove(SommetFinal); SommetsFermes.Add(SommetFinal); EtatsSuccessifsOuverts.Add(SommetsOuverts); EtatsSuccessifsFermes.Add(SommetsFermes); // A* terminé // On retourne le chemin qui va du noeud initial au noeud final sous forme de liste // Le chemin est retrouvé en partant du noeud final et en accédant aux parents de manière // itérative jusqu'à ce qu'on tombe sur le noeud initial if (s != null) { PlusCourtChemin.Add(s); CoutPlusCourtChemin = s.CoutTotal; while (!s.IsEqual(SommetInitial)) { s = s.SommetParent; PlusCourtChemin.Insert(0, s); // On insère en position 1 } } }