Example #1
0
        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);
        }
Example #2
0
        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;
                }
            }
        }
Example #3
0
        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>());
                    }
                }
            }
        }
Example #4
0
        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);
        }
Example #5
0
        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)));
            }
        }
Example #6
0
 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;
 }
Example #7
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 = "";
 }
Example #8
0
        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;
                }
            }
        }
Example #9
0
        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);
        }
Example #10
0
        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);
        }
Example #11
0
        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();
        }
Example #12
0
        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);
        }
Example #13
0
 public double obliczKoszt(Wezel a, Wezel b)
 {
     return((a.x == b.x || a.y == b.y) ? 1.0 : Math.Sqrt(2.0));
 }