private void button1_Click(object sender, EventArgs e) { int wymiar = (Int32)wymiaryNumeric.Value; labirynt = new Labirynt(wymiar); buttons = new Button[wymiar * wymiar]; int index = 0; for (int i = 0; i < wymiar; i++) { for (int j = 0; j < wymiar; j++) { Button b = new Button(); Button b2 = new Button(); b.Size = new Size(30, 30); b.Location = new Point(i * 30, j * 30); b.Text = i + " " + j; b.Tag = labirynt.getWezel(i, j); b.BackColor = Color.White; b.Click += new EventHandler(buttonClick); buttons[index++] = b; } } buttons[0].BackColor = Color.Green; wezelPoczatkowy = labirynt.getWezel(0, 0); buttons[buttons.Length - 1].BackColor = Color.Red; wezelKoncowy = labirynt.getWezel(wymiar - 1, wymiar - 1); panel1.Controls.AddRange(buttons); }
private void timer1_Tick(object sender, EventArgs e) { if (ida == null || listaTmp == null || !monitorujCheckBox.Checked) { return; } if (!sciezkaWyszukiwana) { return; } Control.ControlCollection kontrolki = panel2.Controls; List <Wezel> zablokowane = ida.labirynt.pobierzZablokowane(); // wyczyszczenie kolorow + dodanie przeszkod foreach (Button kontrolka in kontrolki) { kontrolka.BackColor = Color.White; Wezel wezelKontrolka = (Wezel)kontrolka.Tag; foreach (Wezel w in zablokowane) { if (wezelKontrolka.x.Equals(w.x) && wezelKontrolka.y.Equals(w.y)) { kontrolka.BackColor = Color.Gray; } } } // dodanie aktualnie badanej sciezki try { if (listaTmp == null) { return; } foreach (Wezel wezel in listaTmp) { foreach (Button kontrolka in kontrolki) { Wezel wezelKontrolka = (Wezel)kontrolka.Tag; if (wezelKontrolka.x.Equals(wezel.x) && wezelKontrolka.y.Equals(wezel.y)) { kontrolka.BackColor = Color.Yellow; } } } }catch (Exception exc) { } // narysowanie poczatku i konca foreach (Button kontrolka in kontrolki) { Wezel wezelKontrolka = (Wezel)kontrolka.Tag; if (wezelKontrolka.x.Equals(ida.koniec.x) && wezelKontrolka.y.Equals(ida.koniec.y)) { kontrolka.BackColor = Color.Red; } else if (wezelKontrolka.x.Equals(ida.start.x) && wezelKontrolka.y.Equals(ida.start.y)) { kontrolka.BackColor = Color.Green; } } }
public List <Wezel> szukajSciezki(int startX, int startY, int koniecX, int koniecY, Labirynt labirynt, int maxCzasWykonywania = 0) { maxCzasWykonania = maxCzasWykonywania; if (maxCzasWykonania != 0) { czasKoncowy = DateTime.Now.AddSeconds(maxCzasWykonywania); } double maxGlebokosc = obliczHeurystyke(start, koniec) * kosztAkcji; Object t; for (;;) { // przekroczono max czas wykonania - 30sek if (maxCzasWykonania != 0 && DateTime.Compare(DateTime.Now, czasKoncowy) > 0) { uplynalCzasWykonywania = true; return(new List <Wezel>()); } sciezka.Clear(); t = szukaj(start, 0, maxGlebokosc, 0); try // Double { double doub = (Double)t; if (Double.IsPositiveInfinity(doub)) { sciezka.Clear(); iloscNiepowodzen++; return(new List <Wezel>()); } else { double d = (Double)t; maxGlebokosc = d; } } catch (Exception e) // Wezel { try { Wezel x = (Wezel)t; iloscPowodzen++; return(sciezka); } catch (Exception exc) // nic z powyzszych { return(new List <Wezel>()); } } } }
public Wezel[,] stworzWezly(int wymiar) { Wezel[,] wezly = new Wezel[wymiar, wymiar]; for (int i = 0; i < wymiar; ++i) { for (int j = 0; j < wymiar; ++j) { wezly[i, j] = new Wezel(j, i); } } return(wezly); }
public double obliczHeurystyke(Wezel a, Wezel b) { switch (wybranaHeurystyka) { case "euclidean": return(heurystyka.euclidean(Math.Abs(b.x - a.x), Math.Abs(b.y - a.y))); case "chebyshev": return(heurystyka.chebyshev(Math.Abs(b.x - a.x), Math.Abs(b.y - a.y))); default: return(heurystyka.manhattan(Math.Abs(b.x - a.x), Math.Abs(b.y - a.y))); } }
public IDAStar(int startX, int startY, int koniecX, int koniecY, Labirynt labirynt, string wybranaHeurystyka, double kosztAkcji = 1.0, int opoznienie = 0) { this.opoznienie = opoznienie; this.kosztAkcji = kosztAkcji; heurystyka = new Heurystyka(); this.wybranaHeurystyka = wybranaHeurystyka; start = labirynt.getWezel(startX, startY); koniec = labirynt.getWezel(koniecX, koniecY); this.labirynt = labirynt; wezlyOdwiedzone = 0; iloscPowodzen = 0; iloscNiepowodzen = 0; lacznaDlugoscSciezki = 0; maxCzasWykonania = 0; }
private void button1_Click_1(object sender, EventArgs e) { panel1.Controls.Clear(); panel2.Controls.Clear(); manhattanRadio.Checked = true; wymiaryNumeric.Value = 5; wezelKoncowy = null; labirynt = null; buttons = null; wybranyStart = true; wybranyKoniec = true; wezelPoczatkowy = null; wezlyWyszukane = null; ida = null; timeTextBox.Text = ""; powodzeniaTextBox.Text = ""; niepowodzeniaTextBox.Text = ""; sredniaDlugoscSciezkiTextBox.Text = ""; iloscRozwinietychWezlowTextBox.Text = ""; }
protected void buttonClick(object sender, EventArgs e) { Button b = sender as Button; Wezel wezel = (Wezel)b.Tag; if (b.BackColor.Equals(Color.Green)) { b.BackColor = Color.White; wybranyStart = false; } else if (b.BackColor.Equals(Color.Red)) { b.BackColor = Color.White; wybranyKoniec = false; } else if (b.BackColor.Equals(Color.Gray)) { b.BackColor = Color.White; labirynt.ustawOdblokowane(wezel.x, wezel.y, true); } else if (b.BackColor.Equals(Color.White)) { if (!wybranyStart) { b.BackColor = Color.Green; wybranyStart = true; wezelPoczatkowy = wezel; } else if (!wybranyKoniec) { b.BackColor = Color.Red; wybranyKoniec = true; wezelKoncowy = wezel; } else { labirynt.ustawOdblokowane(wezel.x, wezel.y, false); b.BackColor = Color.Gray; } } }
public Wezel[] pobierzSasiadow(Wezel Wezel) { int x = Wezel.x; int y = Wezel.y; List <Wezel> listaSasiadow = new List <Wezel>(); Wezel[,] wezly = this.wezly; // Gora if (jestOdblokowane(x, y - 1)) { listaSasiadow.Add(wezly[y - 1, x]); } // Prawo if (jestOdblokowane(x + 1, y)) { listaSasiadow.Add(wezly[y, x + 1]); } // Dol if (jestOdblokowane(x, y + 1)) { listaSasiadow.Add(wezly[y + 1, x]); } // Lewo if (jestOdblokowane(x - 1, y)) { listaSasiadow.Add(wezly[y, x - 1]); } int ilosc = listaSasiadow.Count; Wezel[] sasiedzi = new Wezel[ilosc]; for (int i = 0; i < ilosc; i++) { sasiedzi[i] = listaSasiadow.ElementAt(i); } return(sasiedzi); }
public Labirynt kopiuj() { int wymiar = this.wymiar; Wezel[,] stareWezly = wezly; Labirynt nowyLabirynt = new Labirynt(wymiar); Wezel[,] noweWezly = new Wezel[wymiar, wymiar]; for (int i = 0; i < wymiar; ++i) { for (int j = 0; j < wymiar; ++j) { noweWezly[i, j] = new Wezel(j, i, stareWezly[i, j].odblokowane); } } nowyLabirynt.wezly = noweWezly; return(nowyLabirynt); }
private void button2_Click(object sender, EventArgs e) { if (labirynt == null) { return; } Control.ControlCollection kontrolki = panel1.Controls; if (monitorujCheckBox.Checked) { panel2.Controls.Clear(); foreach (Button b in kontrolki) { Button button = new Button(); button.Tag = b.Tag; button.BackColor = b.BackColor; button.Size = b.Size; button.Location = b.Location; button.Text = b.Text; panel2.Controls.Add(button); } } Thread watek = new Thread(() => { sciezkaWyszukiwana = true; double kosztAkcji = (Double)kosztAkcjiNumeric.Value; // z opoznieniem i sledzeniem zmian if (monitorujCheckBox.Checked) { ida = new IDAStar(wezelPoczatkowy.x, wezelPoczatkowy.y, wezelKoncowy.x, wezelKoncowy.y, labirynt, sprawdzRadio(), kosztAkcji, (Int32)opoznienieNumeric.Value); } //bez else { ida = new IDAStar(wezelPoczatkowy.x, wezelPoczatkowy.y, wezelKoncowy.x, wezelKoncowy.y, labirynt, sprawdzRadio(), kosztAkcji, 0); } ida.zglosZdarzenie += zdarzenieZmianyBadanejSciezki; timeTextBox.Text = "..."; powodzeniaTextBox.Text = "..."; niepowodzeniaTextBox.Text = "..."; sredniaDlugoscSciezkiTextBox.Text = "..."; iloscRozwinietychWezlowTextBox.Text = "..."; DateTime data1, data2; if (maxCzasWykonaniaCheckBox.Checked) { int maxCzasWykonania = (Int32)maxCzasNumeric.Value; data1 = DateTime.Now; wezlyWyszukane = ida.szukajSciezki(wezelPoczatkowy.x, wezelPoczatkowy.y, wezelKoncowy.x, wezelKoncowy.y, labirynt, maxCzasWykonania); data2 = DateTime.Now; } else { data1 = DateTime.Now; wezlyWyszukane = ida.szukajSciezki(wezelPoczatkowy.x, wezelPoczatkowy.y, wezelKoncowy.x, wezelKoncowy.y, labirynt); data2 = DateTime.Now; } if (wezlyWyszukane.Count == 0) { if (ida.uplynalCzasWykonywania) { timeTextBox.Text = ida.maxCzasWykonania + "s minęło"; powodzeniaTextBox.Text = ida.maxCzasWykonania + "s minęło"; niepowodzeniaTextBox.Text = ida.maxCzasWykonania + "s minęło"; sredniaDlugoscSciezkiTextBox.Text = ida.maxCzasWykonania + "s minęło"; iloscRozwinietychWezlowTextBox.Text = ida.maxCzasWykonania + "s minęło"; } else { timeTextBox.Text = "-"; powodzeniaTextBox.Text = "-"; niepowodzeniaTextBox.Text = "-"; sredniaDlugoscSciezkiTextBox.Text = "-"; iloscRozwinietychWezlowTextBox.Text = "-"; } } else { wezlyWyszukane.RemoveAt(0); wezlyWyszukane.RemoveAt(0); foreach (Wezel w in wezlyWyszukane) { foreach (Control kontrolka in kontrolki) { Wezel wezelKontrolka = (Wezel)kontrolka.Tag; if (wezelKontrolka.x.Equals(w.x) && wezelKontrolka.y.Equals(w.y)) { kontrolka.BackColor = Color.Yellow; } } } timeTextBox.Text = Math.Ceiling((data2 - data1).TotalMilliseconds).ToString(); powodzeniaTextBox.Text = ida.iloscPowodzen.ToString(); niepowodzeniaTextBox.Text = ida.iloscNiepowodzen.ToString(); sredniaDlugoscSciezkiTextBox.Text = ((Double)ida.lacznaDlugoscSciezki / (ida.iloscNiepowodzen + ida.iloscPowodzen)).ToString(); iloscRozwinietychWezlowTextBox.Text = ida.wezlyOdwiedzone.ToString(); sciezkaWyszukiwana = false; } }); watek.Start(); }
public Object szukaj(Wezel wezel, double g, double maxGlebokosc, int glebokosc) { if (maxCzasWykonania != 0 && DateTime.Compare(DateTime.Now, czasKoncowy) > 0) { uplynalCzasWykonywania = true; return(new List <Wezel>()); } wezlyOdwiedzone++; double f = g + obliczHeurystyke(wezel, koniec) * kosztAkcji; if (wezel.x == koniec.x && wezel.y == koniec.y) { sciezka.Add(new Wezel(wezel.x, wezel.y)); //lacznaDlugoscSciezki += sciezka.Count; iloscPowodzen++; return(wezel); } if (f > maxGlebokosc) { iloscNiepowodzen++; return(f); } double min = Double.PositiveInfinity; Object t; Wezel sasiad; Wezel[] sasiedzi = labirynt.pobierzSasiadow(wezel); for (int k = 0; k < sasiedzi.Length; ++k) { sasiad = sasiedzi[k]; testowane.Add(sasiad); lacznaDlugoscSciezki += testowane.Count; if (opoznienie > 0) { zglosZdarzenie(testowane, null); Thread.Sleep(opoznienie); } t = szukaj(sasiad, g + obliczKoszt(wezel, sasiad), maxGlebokosc, glebokosc + 1); try // Wezel { Wezel test = (Wezel)t; sciezka.Add(new Wezel(sasiad.x, sasiad.y)); //lacznaDlugoscSciezki += sciezka.Count; iloscPowodzen++; return(test); } catch (Exception exc) // Double { try { iloscNiepowodzen++; testowane.Remove(sasiad); lacznaDlugoscSciezki += testowane.Count; if (opoznienie > 0) { zglosZdarzenie(testowane, null); Thread.Sleep(opoznienie); } double x = (Double)t; if (x < min) { min = x; } } catch (Exception ex) { // nic z powyzszych } } } return(min); }
public double obliczKoszt(Wezel a, Wezel b) { return((a.x == b.x || a.y == b.y) ? 1.0 : Math.Sqrt(2.0)); }