De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Hoofdstuk 11.3 Algoritmen: Zoeken in een netwerk.

Verwante presentaties


Presentatie over: "Hoofdstuk 11.3 Algoritmen: Zoeken in een netwerk."— Transcript van de presentatie:

1 Hoofdstuk 11.3 Algoritmen: Zoeken in een netwerk

2 Routeplanner nKlik startpunt nKlik eindpunt nProgramma bepaalt route nKlik nieuw startpunt... start eind start nSpoorwegkaart:

3 Modellering nZoek de “beste” route elk traject heeft “kosten”; route met laagste totaalprijs is de beste nOpbouw van het netwerk staat in een file, met: uvoor elke stad: naam en coördinaten uvoor elke weg: 2 steden, en de kosten stad Amersfoort stad Amsterdam stad Apeldoorn weg Amersfoort Apeldoorn43 weg Amsterdam Hilversum29 weg Hilversum Amersfoort 16

4 Specificatie nBij eerste muisklik: aangewezen stad is het beginpunt toon die in blauw nBij tweede muisklik: aangewezen stad is eindpunt bereken de route, en toon die in rood nBij klik buiten een stad: telt niet mee en 3e, 5e, 7e... en 4e, 6e, 8e...

5 Opdeling in klassen nInteractieve interface class RouteZoeker : Form nBelangrijke object-typen class Stad class Weg class Pad class Netwerk met in elke klasse: ueen constructor-methode ueen methode Teken om zichzelf te tekenen u... met EventHandler voor: uteken uklik

6 Klasse-ontwerp wat is... wat kan... en hoe ? een object member- variabelen methode- headers methode- bodies

7 De klasse RouteZoeker class RouterZoeker : Form { Netwerk netwerk; Stad stad1; Pad pad; “het” netwerk de “blauwe” stad of null het “rode” pad of null Button b; TextBox t; Label lab; we tekenen alles zelf! void klik(..., MouseEventArgs mea) { } void teken(..., PaintEventArgs pea) { } Event-handlers

8 De klasse Netwerk class Netwerk { Stad [ ] Steden; ICollection Wegen; alle steden op de kaart we gaan per stad alle uitgaande wegen bewaren ICollection Steden;

9 De klasse Stad class Stad { string Naam; ICollection Wegen; Point Plek; Utrecht

10 De klasse Weg class Weg { Stad Doel; int Kosten;

11 De klasse Pad class Pad { IList Steden; Stad Hier; Pad Rest; int Kosten; null ongeveer een LinkedList, maar dan zelfgemaakt

12 Methoden van Stad class Stad {String Naam; Point Plek; ICollection wegen; Stad ( { } void Teken (Graphics gr, Brush br) { Naam = s; Plek = p; String s, Point p ) Wegen = new LinkedList ( ); gr. FillRectangle(br, Plek.X-5, Plek.Y-5, 10, 10 ); gr. DrawString (Naam, font, br, Plek + new Size(6,-15) ); Utrecht } static Font font = new...

13 Methoden van Weg class Weg {Stad Doel; int Kosten; Weg ( { } void Teken (Graphics gr, Pen pen ) { } Doel =s; Kosten = k; Stad s, int k ) gr. DrawLine ( pen, bron.Plek,Doel.Plek );, Stad bron ) wordt niet getekend

14 Methoden van Pad class Pad { Stad Hier; Pad Rest; int Kosten; Pad ( { } void Teken (Graphics gr, Brush br, Pen pen) { } Hier = s; Rest = r; Kosten = k; Stad s, Pad r, int k ) Hier. Teken (gr, br); totale kosten van het pad if (Rest != null) Kosten += Rest.Kosten; if (Rest != null) { } Rest. Teken (gr, br, pen); gr.DrawLine( pen, Hier.Plek, Rest.Hier.Plek );

15 Methoden van Netwerk class Netwerk { ICollection Steden; Netwerk ( ) { } void Teken (Graphics gr) { } Steden = new LinkedList ( ); foreach ( Stad stad in Steden ) { } stad. Teken (gr, Brushes.Black); foreach ( Weg w in stad.wegen ) w.Teken (gr, Pens.Black, stad) bron

16 Methoden van RouteZoeker class RouteZoeker { Netwerk netwerk; Stad stad1; Pad pad; init ( ) { } void teken (object o, PaintEventArgs pea) { Graphics gr = pea.Graphics; } netwerk = new Netwerk(); stad1=null; pad=null; netwerk. teken (gr); if (pad != null) pad. teken(gr, Brushes.Red, Pens.Red); if (stad1 != null) stad1. teken(gr, Brushes.Blue);

17 Opbouw van het Netwerk nLees een file met regels zoals: stad Almelo stad Amersfoort stad Amsterdam stad Apeldoorn stad Arnhem weg Arnhem Zutphen29 weg Zutphen Deventer16 weg Deventer Zwolle31 weg Amsterdam Weesp14 weg Weesp Hilversum15 weg Hilversum Amersfoort 16 commando locatie kosten

18 Opbouw van het Netwerk void Lees (string filenaam ) { while ( (regel=sr.ReadLine()) != null ) { string [] r = regel.Split(" ", StringSplitOptions.RemoveEmpty ); if (r[0] == "stad") { } else { new Point( int.Parse(r[2]), int.Parse(r[3]) ) ); this. bouwStad (r[1] this.bouwWeg( r[1], r[2], int.Parse(r[3]) ); } } } if (r.Length==4) StreamReader sr = new StreamReader(filenaam);

19 Opbouw van het Netwerk void bouwStad (string naam, Point p) { } Stad st = new Stad(naam, p); void bouwWeg (string van, string naar, int kosten) { } Steden. Add (st); Stad st1 = this. vindStad (van); Stad st2 = this. vindStad (naar); st1. BouwWeg (st2, kosten); st2. BouwWeg (st1, kosten); Netwerk’s Stad’s void BouwWeg(Stad doel, int k) { } Wegen. Add ( new Weg(doel, k) ); class Stad {

20 Opbouw van het Netwerk Stad vindStad (String naam) { } foreach ( Stad st in Steden ) { } if ( st.naam == naam ) return st ; return null ; Stad VindStad (Point p) { foreach ( Stad st in steden ) { } if ( return st ; return null ; p.X-st.Plek.X < 5 && p.Y-st.Plek.Y <5 ) Math.abs( )

21 Interactie in RouteZoeker class RouteZoeker : Form { Netwerk netwerk; Stad stad1; Pad pad; void klik (..., MouseEventArgs mea) { } mea.Locationnetwerk. VindStad( );Stad s = if (stad1==null) else stad1 = s; pad = netwerk. ZoekPad (stad1, s ); this. Invalidate (); { stad1 = null; } if ( s != null ) { } eerste klik of tweede klik?

22 Het zoek-algoritme maak een stapel van nog-niet-complete, maar veelbelovende paden Pad ZoekPad (Stad begin, Stad eind) { Stack paden = new Stack ();

23 Het zoeken begint... Pad pad; pad = new Pad(begin, null, 0); null 0 hij is niet groot... maar wel veelbelovend! paden. push (pad);

24 Onderzoek paden uit stapel... while ( paden.Count > 0 ) Pad pad = paden. pop(); if (pad.Hier==eind) return pad; beter = new Pad( paden. Push(beter); pad. Hier. Wegenforeach ( Weg weg in weg.Doel, pad, weg.Kosten); return null; { } { } )

25 Pas op: foreach ( Weg weg in pad.Hier.Wegen ) { } beter = new Pad( paden. Push(beter); weg.Doel, pad, weg.Kosten); één van de wegen kom je net vandaan! if ( ! pad. Bevat (weg.Doel) ) { } niet in een kringetje zoeken!

26 while (... ) { pad =... if (compleet) return pad; for (...) if ( !kring ) paden.Push(...) } return null; Niet de eerste oplossing, maar de beste zoeken! while (... ) { pad =... if (compleet) return pad; for (...) if ( !kring ) paden.Push(...) } return null; beste = null; return beste; beste=pad;if (beter) beste=pad; && !zinloos)

27 Uitwerking nWat is “beter” ? nWat is “niet zinloos” ? if ( beste==null || pad.Kosten < beste.Kosten ) beste = pad; if ( beste==null || pad.Kosten + weg.Kosten < beste.Kosten ) paden.Push (new Pad (...) );

28 wegen = new SortedSet ( ordenen qua afstand tot doel Verbetering van het algoritme nDe meest veelbelovende eerst onderzoeken nDus in volgorde van afstand tot naar pushen class Stad : IComparer { { int Compare( Weg a, Weg b) { return this.afstand(b.doel) – this.afstand(a.doel); } );pad.Hier.Wegen, naar moet een lComparer zijn

29 Routezoeker compleet!


Download ppt "Hoofdstuk 11.3 Algoritmen: Zoeken in een netwerk."

Verwante presentaties


Ads door Google