private void button1_Click(object sender, EventArgs e) { timer1.Enabled = true; // reset Lres = null; nbAffichee = 0; resetCouleurMap(); listBox1.Items.Clear(); // sécurité string[] sec = textBox1.Text.Split(','); int x, y; if (sec.Length != 2 || !int.TryParse(sec[0], out x) && !int.TryParse(sec[1], out y)) { textBox1.Text = "1,1"; } sec = textBox2.Text.Split(','); if (sec.Length != 2 || !int.TryParse(sec[0], out x) && !int.TryParse(sec[1], out y)) { textBox2.Text = "1,1"; } sec = textBox3.Text.Split(','); if (sec.Length != 2 || !int.TryParse(sec[0], out x) && !int.TryParse(sec[1], out y)) { textBox3.Text = "1,1"; } // création du graph Graph g = new Graph(); // path finding 1 NodeP1 N0 = new NodeP1(textBox1.Text, textBox2.Text, map); Lres = g.RechercheSolutionAEtoile(N0); // path finding 2 NodeP1 N1 = new NodeP1(textBox2.Text, textBox3.Text, map); Lres.AddRange(g.RechercheSolutionAEtoile(N1)); if (Lres.Count == 0) { labelsolution.Text = "Pas de solution"; } else { labelsolution.Text = "Une solution a été trouvée"; foreach (GenericNode N in Lres) { listBox1.Items.Add(N); } labelcountopen.Text = "Nb noeuds des ouverts : " + g.CountInOpenList().ToString(); labelcountclosed.Text = "Nb noeuds des fermés : " + g.CountInClosedList().ToString(); g.GetSearchTree(treeView1); } }
private void Revenir_a_plateforme_livraison() { // le départ est l'endroit ou est resté le chariot Emplacement depart = (Emplacement)chemin[chemin.Count() - 1]; string position = depart.GetX() + "." + depart.GetY(); // colorer le bon bouton Button btn = (Button)this.Controls.Find(position, true)[0]; btn.BackColor = Color.Blue; Program.entrepot.cell[depart.GetY(), depart.GetX()] = 0; // 2.trouver l'emplacement d'arrivée Emplacement arrivee = new Emplacement(); // si le colis est au nord, alors le chariot doit se placer sur la case en dessus soit -1 dans la matrice arrivee.SetX(0); int c = 0; double cout = 500, coutmin = 500; for (int k = 0; k < Program.entrepot.Get_largeur_entrepot(); k++) { if (Program.entrepot.cell[k, 0] != 2) { arrivee.SetY(k); nul = new Graph(arrivee, depart); chemin = nul.RechercheSolutionAEtoile(); if (chemin.Count > 0) { cout = chemin[chemin.Count() - 1].GetGCost(); } if (cout < coutmin) { coutmin = cout; c = k; } } } arrivee.SetY(c); // on fait appel à la fonction pour nous trouver nul = new Graph(arrivee, depart); chemin = nul.RechercheSolutionAEtoile(); // colorer le chemin de retour Deplacement_chariots(); Program.entrepot.cell[c, 0] = 2; Nv_colis_BTN.Visible = true; // on met le bouton du début en blanc btn.BackColor = Color.White; UnableChariots(); }
private void button1_Click(object sender, EventArgs e) { Graph g = new Graph(); NodeTaquin N0 = new NodeTaquin(textBox1.Text); List<GenericNode> Lres = g.RechercheSolutionAEtoile(N0); if (Lres.Count == 0) { labelsolution.Text = "Pas de solution"; } else { labelsolution.Text = "Une solution a été trouvée"; foreach (GenericNode N in Lres) { listBox1.Items.Add( N); } labelcountopen.Text = "Nb noeuds des ouverts : " + g.CountInOpenList().ToString(); labelcountclosed.Text = "Nb noeuds des fermés : "+ g.CountInClosedList().ToString(); g.GetSearchTree( treeView1 ); } }
private void button1_Click(object sender, EventArgs e) { Graph g = new Graph(); NodeTaquin N0 = new NodeTaquin(textBox1.Text); List <GenericNode> Lres = g.RechercheSolutionAEtoile(N0); if (Lres.Count == 0) { labelsolution.Text = "Pas de solution"; } else { labelsolution.Text = "Une solution a été trouvée"; foreach (GenericNode N in Lres) { listBox1.Items.Add(N); } labelcountopen.Text = "Nb noeuds des ouverts : " + g.CountInOpenList().ToString(); labelcountclosed.Text = "Nb noeuds des fermés : " + g.CountInClosedList().ToString(); g.GetSearchTree(treeView1); } }
/// <summary> /// Cette fonction survient après le clic de l'utilisateur sur le bouton "Valider". L'utilisateur vient de choisir les caractéristiques de son colis. /// Suite à cette validation, on vérifie l'emplacement du colis pour voir si cet emplacement est bien valide : que le colis est bien sur une étagère. /// Si les informations saisies ne sont pas valides comme : un emplacement hors des cases noires ou une hauteur supérieure à 10m, on informe l'utilisateur /// dans une message box de son erreur. Les paramètres du colis proposés par défaut donne bien sur une étagère. /// Si l'emplacement est correct, on calcule l'emplacement de fin du chariot en fonction des caractèristique du colis. /// Elle prend les paramètres habituels des gestionnnaires d'évènement et n'a pas de sortie. /// </summary> /// <entree> /// <param name="sender"> informations sur le bouton cliqué </param> /// <param name="e"> informations sur l'evenement </param> /// </entree> /// <sortie> aucune </sortie> private void Valider_BTN_Click(object sender, EventArgs e) { if (Est_un_colis(int.Parse(Colis_TB.Text), int.Parse(Colis_Localisation_TB.Text)) && int.Parse(Colis_Hauteur_TB.Text) < 11) { //1.l'emplacement du début Emplacement depart = new Emplacement(Chariot_choisi._x, Chariot_choisi._y, Chariot_choisi._orientation, int.Parse(Colis_Hauteur_TB.Text)); string position = Chariot_choisi._x + "." + Chariot_choisi._y; Program.entrepot.cell[Chariot_choisi._y, Chariot_choisi._x] = 0; // colorer le bon bouton Button btn = (Button)this.Controls.Find(position, true)[0]; btn.BackColor = Color.Blue; // quand la personne a choisi les caractéristiques de son colis string orientation = ""; try { orientation = Orientation_LIST.SelectedItem.ToString(); } catch { orientation = "Nord"; } tab_colis[nb_colis] = new Colis(int.Parse(Colis_TB.Text), int.Parse(Colis_Localisation_TB.Text), int.Parse(Colis_Hauteur_TB.Text), orientation); // colorer le colis string position_2 = int.Parse(Colis_TB.Text) + "." + int.Parse(Colis_Localisation_TB.Text); Button btn_2 = (Button)this.Controls.Find(position_2, true)[0]; btn_2.BackColor = Color.Green; if (orientation == "Nord") { btn_2.Text = "N"; } else { btn_2.Text = "S"; } btn_2.Refresh(); // 2.trouver l'emplacement d'arrivée // en fonction de l'orientation du colis, l'emplacement n'est pas le même Emplacement arrivee = new Emplacement(); // si le colis est au nord, alors le chariot doit se placer sur la case en dessus soit -1 dans la matrice if (tab_colis[nb_colis]._orientation == "Nord") { arrivee.SetY(tab_colis[nb_colis]._y - 1); } else { arrivee.SetY(tab_colis[nb_colis]._y + 1); } // la position en x ne change pas arrivee.SetX(tab_colis[nb_colis]._x); // on fait appel à la fonction pour nous trouver nul = new Graph(arrivee, depart); chemin = nul.RechercheSolutionAEtoile(); // on enleve les controles lors du remplissage du colis Valider_BTN.Visible = false; Orientation_LBL.Visible = false; Orientation_LIST.Visible = false; Colis_hauteur_LBL.Visible = false; Colis_Hauteur_TB.Visible = false; Colis_Localisation_TB.Visible = false; Colis_Position_LBL.Visible = false; Colis_Position_y_LBL.Visible = false; Colis_TB.Visible = false; Details_BTN.Visible = true; Consigne_LBL.Text = "Etape 5 : Evaluer le chemin"; Final_LBL.Visible = true; // si le chemin est null, c'est qu'il n'y a pas de solution pour que le colis puise être pris par le chariot if (chemin.Count == 0) { Final_LBL.Text = "Pas de solution possible pour ce chemin"; Final_LBL.Visible = true; Nv_colis_BTN.Visible = true; } else { Deplacement_chariots(); // le bouton du début est en bleu foncé alors que le chariot est en bleu clair btn.BackColor = Color.Blue; double cout = ((Emplacement)chemin[chemin.Count - 1]).GetGCost(); } // s'il n'y a pas de solution, on n'affiche pas le calcul du retour à la plateforme. if (chemin.Count > 0) { Depot_BTN.Visible = true; } UnableChariots(); } else { // si l'utilisateur a mal choisi l'emplacement de son colis string message = "La position du colis ne correspond pas à la disposition de l'entrepot : il doit être sur une étagère et à une hauteur inférieure ou égal à 10."; string caption = "Error Detected in Input"; DialogResult result = MessageBox.Show(message, caption); } }
private void btn_valider_Click(object sender, EventArgs e) // Methode pour bouton Calcul { if (objChoisi != null & charChoisi != null) { objet = new Objet(objChoisi.posX - 1, objChoisi.posY - 1, objChoisi.orientation, objChoisi.hauteur);//On définit l'objet avec les valeurs récupérés dans l'éditText (objet choisi) g = new Graph(objet); if (sender.Equals(btn_calcul_distance)) //Si on clique sur le bouton calcul distance { Ninit = new NodeDistance(charChoisi.posX - 1, charChoisi.posY - 1); // On définit la position du chariot choisi comme la position Initiale d'un Noeud distance nodeTemps = false; } else if (sender.Equals(btn_calcul_temps)) { Ninit = new NodeTemps(charChoisi.posX - 1, charChoisi.posY - 1, new Point(0, 0)); nodeTemps = true; } Lres = g.RechercheSolutionAEtoile(Ninit); //On calcule la liste des noeuds répondant à la distance la plus courte ou au temps le plus court if (nodeTemps) // Nobj sera un nodeTemps, on va chercher à avoir le cout en temps { // Trajet vers la zone finale Nobj = (NodeTemps)Lres[Lres.Count - 1]; //Noeud sur lequel est le chariot lorsqu'il prend l'objet } else//Nobj sera un nodeDistance, on va chercher à avoir le cout en distance { Nobj = (NodeDistance)Lres[Lres.Count - 1]; //Noeud sur lequel est le chariot lorsqu'il prend l'objet } List <Objet> zoneFinale = new List <Objet>(tabEntrepot.GetLength(0)); for (int k = 0; k < tabEntrepot.GetLength(0) - 1; k++) { Objet o = new Objet(0, k - 1, Objet.Orientation.Sud, 0); //On imagine un objet correspondant à la ligne 1. zoneFinale.Add(o); //On ajoute à la liste des zones finales. } foreach (Objet o in zoneFinale) { Graph g = new Graph(o); TrajectoireF = g.RechercheSolutionAEtoile(Nobj); //On stocke la liste de noeuds correspondant à chaque chemin pour aller vers une des zones finales et on le stocke dans la liste EnsembleTrajectoiresF.Add(TrajectoireF); //On ajoute cette trajectoire à l'ensemble des trajectoires } bestTrajectoire = EnsembleTrajectoiresF[0]; double cout = 1000000; foreach (List <GenericNode> l in EnsembleTrajectoiresF) { double c = l[l.Count - 1].Cout_Total;// Pour chaque liste de chemins dans l'ensemble des trajectoires, on récupère le cout total. if (c < cout) { cout = c; bestTrajectoire = l;//On garde la trajectoire où le cout est le plus faible } } if (nodeTemps) { lbTimeTot.Text = CalculTempsTot().ToString() + " secondes";// On appelle la méthode pour calculer le temps et on l'affiche dans un label. } if (Lres.Count > 1) { Lres.RemoveAt(0); //On supprime le premier noeud correspondant à la position du chariot } reinitialiserView(); // On reinitialise la View setViewEntrepot(); // On dessine la grille } else { label_error.Visible = true; } }
private void Deplacement_chariot(int k) { //1. on calcule leur trajet // la position de départ : leur position actuelle Emplacement ptsDepart = new Emplacement(Program.tab_chariot[k]._x, Program.tab_chariot[k]._y, Program.tab_chariot[k]._orientation, Program.tab_chariot[k]._hauteur); // la position de fin : calculé via le colis // quand la personne a choisi les caractéristiques de son colis Emplacement arrivee = new Emplacement(); // si le colis est au nord, alors le chariot doit se placer sur la case en dessus soit -1 dans la matrice if (Program.tab_chariot[k].chercher_un_colis) { #region Si le chariot a pris son colis et doit revenir à la plateforme // le chariot doit revenir à sa plateforme arrivee.SetX(0); int c = 0; double cout = 600, coutmin = 500; for (int kk = 0; kk < Program.entrepot.Get_largeur_entrepot(); kk++) { if (Program.entrepot.cell[kk, 0] != 2) { arrivee.SetY(kk); nul = new Graph(arrivee, ptsDepart); chemin = nul.RechercheSolutionAEtoile(); if (chemin.Count > 0) { cout = chemin[chemin.Count() - 1].GetGCost(); } if (cout < coutmin) { coutmin = cout; c = kk; } } } arrivee.SetY(c); #endregion } else { if (tab_colis[k]._orientation == "Nord") { arrivee.SetY(tab_colis[k]._y - 1); } else { arrivee.SetY(tab_colis[k]._y + 1); } // la position en x ne change pas arrivee.SetX(tab_colis[k]._x); } Graph trouver = new Graph(arrivee, ptsDepart); chemin = trouver.RechercheSolutionAEtoile(); // CHOIX 1 : quand le chariot est à l'emplacement final pour prendre le colis if (Program.tab_chariot[k]._x == tab_colis[k]._x && (Program.tab_chariot[k]._y - 1 == tab_colis[k]._y || Program.tab_chariot[k]._y + 1 == tab_colis[k]._y) && !Program.tab_chariot[k].chercher_un_colis) { #region Prendre le colis // on est arrivé au bout du chemin 1 Program.tab_chariot[k].chercher_un_colis = true; Program.tab_chariot[k].depot = true; Program.tab_chariot[k].depot_temps = 0; string positionArr = tab_colis[k]._x + "." + tab_colis[k]._y; Button btn_7 = (Button)this.Controls.Find(positionArr, true)[0]; // btn_4.Image = Image.FromFile("../../Images/" + arrivee.Get_orientation() + ".png"); btn_7.BackColor = Color.Purple; btn_7.Text = "X"; btn_7.Refresh(); // pour le chariot qui récupère le colis string position = Program.tab_chariot[k]._x + "." + Program.tab_chariot[k]._y; Button btn_6 = (Button)this.Controls.Find(position, true)[0]; // btn_4.Image = Image.FromFile("../../Images/" + arrivee.Get_orientation() + ".png"); btn_6.BackColor = Color.Yellow; btn_6.Text = "*"; btn_6.Refresh(); #endregion } // CHOIX 2 : quand le chariot est revenu à la livraison else if (Program.tab_chariot[k].chercher_un_colis && Program.tab_chariot[k]._x == 0) { // le chariot a donc pris son colis et est revenu sur la plateforme de livraison Program.tab_chariot[k].enLivraison = true; // pour le chariot qui récupère le colis string position = Program.tab_chariot[k]._x + "." + Program.tab_chariot[k]._y; Button btn_5 = (Button)this.Controls.Find(position, true)[0]; btn_5.BackColor = Color.Orange; btn_5.Text = "§"; btn_5.Refresh(); } // CHOIX 3 : quand il se déplace classiquement else if (chemin.Count > 1) { #region Deplacement d'un chariot vers une autre case //On clean la position de depart string positionDep = ptsDepart.GetX().ToString() + "." + ptsDepart.GetY().ToString(); Button btn_3 = (Button)this.Controls.Find(positionDep, true)[0]; btn_3.BackColor = Color.White; btn_3.Text = ""; btn_3.Refresh(); //On colore la position d'arrivee string positionArr = ((Emplacement)chemin[1]).GetX().ToString() + "." + ((Emplacement)chemin[1]).GetY().ToString(); Button btn_4 = (Button)this.Controls.Find(positionArr, true)[0]; // si la nouvelle case necessite un changement de direction if (ptsDepart.GetArcCost((Emplacement)chemin[1]) == 4 && Program.tab_chariot[k].rotation_temps != 0) { Program.tab_chariot[k].rotation = true; Program.tab_chariot[k].rotation_temps = 0; btn_3.BackColor = Color.Pink; btn_3.Text = Program.tab_chariot[k].Get_cle_chariot().ToString(); btn_3.Refresh(); Program.tab_chariot[k]._orientation = ((Emplacement)chemin[1]).Get_orientation(); } else { if (Program.tab_chariot[k].chercher_un_colis) { btn_4.BackColor = Color.Blue; } else { btn_4.BackColor = Color.Red; } btn_4.Text = Program.tab_chariot[k].Get_cle_chariot().ToString(); btn_4.Refresh(); // on enregistre les changements Program.entrepot.cell[Program.tab_chariot[k]._y, Program.tab_chariot[k]._x] = 0; Program.tab_chariot[k]._x = ((Emplacement)chemin[1]).GetX(); Program.tab_chariot[k]._y = ((Emplacement)chemin[1]).GetY(); Program.tab_chariot[k]._orientation = ((Emplacement)chemin[1]).Get_orientation(); Program.tab_chariot[k]._hauteur = 0; Program.entrepot.cell[((Emplacement)chemin[1]).GetY(), ((Emplacement)chemin[1]).GetX()] = 2; } #endregion } }