Example #1
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;
                    }
                }
            }
        }
Example #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);
        }
Example #3
0
 int GeefTotaleAfstand(Knoop[] knopen_calc)
 {
     return(Afstandsberekenaar.BerekenRouteLengte(knopen_calc));
 }