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