Ejemplo n.º 1
0
        Knoop[] GenereerKnopen(int aantalKnopen)
        {
            Knoop[]         knopen = new Knoop[aantalKnopen];
            KnopenGenerator KG     = new KnopenGenerator();

            knopen = KG.GeneerKnopen(aantalKnopen);
            return(knopen);
        }
Ejemplo n.º 2
0
        public Knoop[] ZoekRoute(Knoop[] knopenGen)
        {
            for (int i = 0; i <= knopenGen.Length - 1; i++)
            {
                knopenGen[i].setVoorganger(-1);
                knopenGen[i].setOpvolger(-1);
            }

            Knoop[] knopenNew = new Knoop[knopenGen.Length];

            //eerst vanuit startpunt verbinding leggen naar dichtsbijzijnde punt
            int afstandZijde            = 0;
            int minlengte               = 32000; //bewust zeer hoge waarde
            int index_kandidaatOpvolger = 0;

            for (int i = 1; i <= knopenGen.Length - 1; i++)
            {
                afstandZijde = Afstandsberekenaar.BerekenAfstand2Knopen(knopenGen[0], knopenGen[i]);
                if (afstandZijde < minlengte)
                {
                    minlengte = afstandZijde;
                    index_kandidaatOpvolger = i;
                }
            }
            knopenGen[0].setOpvolger(index_kandidaatOpvolger);
            knopenGen[index_kandidaatOpvolger].setVoorganger(0);
            //eerste verbinding gelegd

            knopenGen[0].setVoorganger(999); //tijdelijk blokkeren startknoop voor koppeling in volgende stuk

            knopenNew[0] = new Knoop(knopenGen[0].getX(), knopenGen[0].getY());
            knopenNew[1] = new Knoop(knopenGen[index_kandidaatOpvolger].getX(), knopenGen[index_kandidaatOpvolger].getY());
            int newindex = 1;

            int actueel = index_kandidaatOpvolger;

            index_kandidaatOpvolger = 0;
            int  aantalIncompleet = 0;
            int  indexIncompleet  = 0;
            bool ketenincompleet  = true;

            while (ketenincompleet)
            {
                minlengte = 32000;
                bool kandidaat_gevonden = false;
                for (int i = 1; i <= knopenGen.Length - 1; i++)
                {
                    if (i != actueel)
                    {
                        if (knopenGen[i].getVoorganger() == -1)
                        {
                            afstandZijde = Afstandsberekenaar.BerekenAfstand2Knopen(knopenGen[i], knopenGen[actueel]);
                            if (afstandZijde < minlengte)
                            {
                                minlengte = afstandZijde;
                                index_kandidaatOpvolger = i;
                                kandidaat_gevonden      = true;
                            }
                        }
                    }
                }
                if (kandidaat_gevonden)
                {
                    knopenGen[actueel].setOpvolger(index_kandidaatOpvolger);
                    knopenGen[index_kandidaatOpvolger].setVoorganger(actueel);
                    actueel = index_kandidaatOpvolger;

                    //bouw geleidelijk de uitvoerarray verder op
                    newindex            = newindex + 1;
                    knopenNew[newindex] = new Knoop(knopenGen[index_kandidaatOpvolger].getX(), knopenGen[index_kandidaatOpvolger].getY());
                }
                //check of alles een opvolger heeft
                ketenincompleet  = false;
                aantalIncompleet = 0;
                for (int j = 1; j <= knopenGen.Length - 1; j++)
                {
                    if (knopenGen[j].getOpvolger() == -1)
                    {
                        ketenincompleet  = true;
                        indexIncompleet  = j;
                        aantalIncompleet = aantalIncompleet + 1;
                    }
                }
                //voorkom loopen als er nog maar 1 knoop over is, die moet naar 0
                if (aantalIncompleet == 1)
                {
                    //laatste knoop knopen aan starpunt
                    knopenGen[indexIncompleet].setOpvolger(0);
                    knopenGen[0].setVoorganger(indexIncompleet);
                    ketenincompleet = false;
                    //geen element meer aan knopennew toevoegen
                }
            }

            return(knopenNew);
        }
Ejemplo n.º 3
0
        public Knoop[] ZoekRoute(Knoop[] knopenGen)
        {
            for (int i = 0; i <= knopenGen.Length - 1; i++)
            {
                knopenGen[i].setVoorganger(-1);
                knopenGen[i].setOpvolger(-1);
            }


            Knoop[] knopenNew = new Knoop[knopenGen.Length];
            //draag invoerwaarde rechtstreeks aan uitvoerwaarde over

            for (int i = 0; i <= knopenGen.Length - 1; i++)
            {
                knopenNew[i] = new Knoop(knopenGen[i].getX(), knopenGen[i].getY());
            }

            //alleen brute force voor alles berekenen bij max 10 punten, daarna te lange rekenduur
            if (knopenGen.Length > 11)
            {
                return(knopenNew);
            }

            //bij max 11 knopen brute force: alle mogelijkheden berekenen
            //maak even grote integerarray minus startelement
            int[] permutatieArray = new int[knopenGen.Length - 1];
            for (int i = 1; i <= knopenGen.Length - 1; i++)
            {
                permutatieArray[i - 1] = i;
            }
            int minlengte = 32000;

            perm(permutatieArray, knopenGen.Length - 1, 0);

            return(knopenNew);


            void perm(int[] s, int n, int i)
            {
                int tussen = 0;

                if (i >= n - 1)
                {
                    //klaar met een permutatie, bereken lengte van traject
                    Knoop[] tijdelijk = new Knoop[knopenGen.Length];
                    tijdelijk[0] = new Knoop(knopenGen[0].getX(), knopenGen[0].getY());
                    for (int z = 1; z <= s.Length; z++)
                    {
                        tijdelijk[z] = new Knoop(knopenGen[s[z - 1]].getX(), knopenGen[s[z - 1]].getY());
                    }

                    int actueleLengte = Afstandsberekenaar.BerekenRouteLengte(tijdelijk);
                    if (actueleLengte < minlengte)
                    {
                        minlengte = actueleLengte;
                        for (int q = 0; q <= knopenGen.Length - 1; q++)
                        {
                            knopenNew[q].setX(tijdelijk[q].getX());
                            knopenNew[q].setY(tijdelijk[q].getY());
                        }
                    }
                }
                else
                {
                    perm(s, n, i + 1);
                    for (int j = i + 1; j < n; j++)
                    {
                        tussen = s[i];
                        s[i]   = s[j];
                        s[j]   = tussen;
                        perm(s, n, i + 1);
                        tussen = s[i];
                        s[i]   = s[j];
                        s[j]   = tussen;
                    }
                }
            }
        }
Ejemplo n.º 4
0
        TextView _lengteTextveld;      //tonen totale lengte van een route

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.Main);

            Knoop[] knopen_gen; //  coordinaten, random gegenereerd

            _aantalTextveld = FindViewById <TextView>(Resource.Id.nknopen);
            //toon de startwaarde 6
            _aantalTextveld.Text = aantalKnopen.ToString();

            //totale lengte van de route
            _lengteTextveld = FindViewById <TextView>(Resource.Id.lengte);

            _minButton = FindViewById <Button>(Resource.Id.minButton);
            if (aantalKnopen == 6)
            {
                _minButton.Enabled = false;
            }

            _minButton.Click += (sender, e) =>
            {
                if (aantalKnopen == 11)
                {
                    aantalKnopen = aantalKnopen - 3;
                }
                else
                {
                    aantalKnopen = aantalKnopen - 2;
                }
                _aantalTextveld.Text = aantalKnopen.ToString();
                if (aantalKnopen == 6)
                {
                    _minButton.Enabled = false;
                }
                if (aantalKnopen < 25)
                {
                    _plusButton.Enabled = true;
                }

                knopen_gen = GenereerKnopen(aantalKnopen);
                TekenKnopen(knopen_gen);
                _lengteTextveld.Text = "";
            };

            _plusButton        = FindViewById <Button>(Resource.Id.plusButton);
            _plusButton.Click += (sender, e) =>
            {
                if (aantalKnopen == 8)
                {
                    aantalKnopen = aantalKnopen + 3;
                }
                else
                {
                    aantalKnopen = aantalKnopen + 2;
                }
                _aantalTextveld.Text = aantalKnopen.ToString();
                if (aantalKnopen > 6)
                {
                    _minButton.Enabled = true;
                }
                if (aantalKnopen == 25)
                {
                    _plusButton.Enabled = false;
                }

                knopen_gen = GenereerKnopen(aantalKnopen);
                TekenKnopen(knopen_gen);
                _lengteTextveld.Text = "";
            };


            _route1Button   = FindViewById <Button>(Resource.Id.route1Button);
            _route2Button   = FindViewById <Button>(Resource.Id.route2Button);
            _lengteTextveld = FindViewById <TextView>(Resource.Id.lengte);

            //genereren en tekenen punten bij opstarten app, alle schermelementen zijn gevonden
            knopen_gen = GenereerKnopen(aantalKnopen);
            TekenKnopen(knopen_gen);
            _lengteTextveld.Text = ""; //schoonmaken na eventuele vorige routeronde

            //einde initiele acties bij opstarten app

            //bereken en teken de gevonden route
            _route1Button.Click += (sender, e) => {
                Knoop[] knopen_calc = new Knoop[aantalKnopen];
                knopen_calc = BerekenRoute1(knopen_gen);
                TekenRoute(knopen_gen, knopen_calc);

                //toon de lengte van de route
                _lengteTextveld.Text = GeefTotaleAfstand(knopen_calc).ToString();
            };

            //bereken en teken de gevonden route volgens slimmer algoritme
            _route2Button.Click += (sender, e) => {
                Knoop[] knopen_calc = new Knoop[aantalKnopen];
                knopen_calc = BerekenRoute2(knopen_gen);
                TekenRoute(knopen_gen, knopen_calc);

                //toon de lengte van de route
                _lengteTextveld.Text = GeefTotaleAfstand(knopen_calc).ToString();
            };
        }