Knoop[] GenereerKnopen(int aantalKnopen) { Knoop[] knopen = new Knoop[aantalKnopen]; KnopenGenerator KG = new KnopenGenerator(); knopen = KG.GeneerKnopen(aantalKnopen); return(knopen); }
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); }
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; } } } }
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(); }; }