Practicumwerkstuk Complexiteit & Algoritmiek Bij de module Complexiteit & Algoritmiek wordt tijdens de verroosterde practica in tweetallen gewerkt aan het practicumwerkstuk. Elk tweetal heeft wekelijks met de begeleidend docent een voortgangsgesprek tijdens de verroosterde practicumlessen. Het practicumwerkstuk bestaat uit een drietal practicumopdrachten. Deze opdrachten moeten worden uitgevoerd en afgerond met een oplevering van de zelf ontwikkelde code en een compleet verslag. Het verslag omvat een beschrijving van de analyse, het ontwerp, de implementatie en de bereikte resultaten, inclusief een verantwoording van alle gemaakte keuzes. De begeleidende docent beoordeelt de software en de verslaglegging. Dit leidt tot drie beoordelingen op de opdrachten en dan is het cijfer voor het practicumwerkstuk het gemiddelde van de 3 beoordelingen voor de opdrachten. In principe wordt het cijfer toegekend aan beide studenten in geval van werken in een tweetal. In bijzondere gevallen kan hiervan worden afgeweken. De opdrachten hebben allemaal een geadviseerd inlevermoment, namelijk aan het begin van respectievelijk week 3, 6 en 9 (maandag 9:00 uur). Bij tijdige inlevering volgt zo snel mogelijk een nabespreking met feedback en een beoordeling. De ultieme deadline voor alle opdrachten is aan het begin van week 9. Tijdens de toetsperiode volgt zo snel mogelijk de vaststelling van het cijfer voor het practicumwerkstuk, eventueel nadat de studenten nog zijn opgeroepen voor een nabespreking van het ingeleverde werk. Indien het practicumwerkstuk niet met een voldoende wordt afgerond, kan de student gedurende het volgende kwartiel het practicum herkansen. Dit kan door de opdrachten alsnog te verbeteren of door middel van het uitvoeren van een vervangende opdracht. Uiterlijk aan het begin van week 9 van dat kwartiel moeten alle herkanste opdrachten zijn ingeleverd. Eventueel worden studenten nog opgeroepen voor een nabespreking alvorens het herkansingscijfer voor het practicumwerkstuk vast te stellen. Bij een onvoldoende op de herkansing van het practicumwerkstuk vervallen alle rechten met betrekking tot eventuele deelbeoordelingen op afzonderlijke opdrachten. 1 Opdracht 1: Meten aan algoritmen 1.1 – Random permutatie algoritmen We willen een random permutatie genereren van de eerste N integers. Dergelijke permutaties zijn vaak handig in simulaties. Zo zijn bijvoorbeeld [5,2,3,0,4,1] en [2,1,4,5,3,0] legale permutaties (voor N=6), maar [1,0,2,4,2,5] niet want deze bevat tweemaal een 2 en geen 3. Voor het maken van een random permutatie van de getallen 0,…,N-1 hebben we de volgende drie algoritmen: 1. randomPerm: Vul een voor een de elementen a[0] tot a[N-1] van de array a. Om element a[i] te vullen, genereer je net zo lang een random getal totdat er een is gevonden die niet gelijk is aan a[0] t/m a[i-1]. 2. usedPerm: Analoog aan randomPerm, maar houd nu een extra array used bij. Wanneer een random getal r in array a wordt gezet, zet dan ook used[r] op true. Bij het vullen van a[i] kunnen we nu dus direct zien of het gegenereerde random getal al gebruikt is of niet (i.p.v. alle plaatsen a[0] t/m a[i-1] langs te lopen). 3. swapPerm: Doorloop array a en zet op positie i in het array een i, dus a[i] = i. Verwissel vervolgens meteen de inhoud van a[i] met de inhoud van een random gekozen al gevulde positie in de array (positie 0 t/m i). Ontwikkel een programma dat voor elke waarde van N elk algoritme 10 keer uitvoert en de gemiddelde running time in elk van die situaties meet. Gebruik daarbij (voor zover mogelijk) de volgende waarden van N: 5.000, 10.000, 50.000, 100.000, 500.000, 1.000.000, 5.000.000, 10.000.000, 50.000.000, 100.000.000. Geef in je verslag een zo goed mogelijke Big-Oh schatting van de verwachte running time van elk algoritme en leg uit hoe je daaraan komt, presenteer je metingen in een grafiek en geef daarbij een kritische vergelijking van je metingen met de verwachte running times. 1.2 – Minimum en maximum algoritmen Gegeven is een array a met N random getallen. We zoeken het kleinste en het grootste getal in deze array. Hiervoor gebruiken we de volgende drie algoritmen: 1. sortedMinMax: Sorteer de array met een sorteeralgoritme naar keuze. Hierna staat het minimum vooraan en het maximum achteraan in de array. 2. seqMinMax: Doorloop de array en onthoud op elk moment het tot dan toe kleinste en het tot dan toe grootste getal. Aangekomen bij het eind van de array zijn dit het minimum en het maximum. 3. recMinMax: Gebruik het divide-and-conquer mechanisme: Als de array 1 of 2 getallen bevat, dan is meteen duidelijk wat het minimum en maximum is. Als de array meer dan 2 getallen bevat, deel hem dan op in twee helften en bepaal recursief het minimum en maximum van beide helften. Uit deze twee minima en maxima kan eenvoudig het minimum en het maximum van de originele array worden bepaald. Ontwikkel een programma dat voor elke waarde van N elk algoritme 10 keer uitvoert en de gemiddelde running time in elk van die situaties meet. Gebruik daarbij (voor zover mogelijk) de volgende waarden van N: 5.000, 10.000, 50.000, 100.000, 500.000, 1.000.000, 5.000.000, 10.000.000, 50.000.000, 100.000.000. Geef in je verslag een zo goed mogelijke Big-Oh schatting van de verwachte running time van elk algoritme en leg uit hoe je daaraan komt, presenteer je metingen in een grafiek en geef daarbij een kritische vergelijking van je metingen met de verwachte running times. 2 Opdracht 2: Toepassingen van een heap 2.1 – Replacement Selection Bij het sorteren van externe files is het van belang elke optimalisatie van een algoritme door te voeren. Een van de mogelijkheden is de startsituatie zo optimaal mogelijk te maken door alvast te zorgen voor zo lang mogelijke gesorteerde gedeelten (runs) in de te sorteren files. Om de lengte van de initiële runs in een file te verbeteren is tijdens het hoorcollege aan de orde geweest, hoe dit kan worden gerealiseerd met behulp van een dynamische heap met kladruimte (deadspace), een zogenaamde DynDSHeap. Ontwerp en implementeer een class DynDSHeap, een efficiënte datastructuur voor zo’n bijzonder soort heap, inclusief de daarbij behorende methoden. Schrijf vervolgens, op basis van de bovengenoemde beschrijving, een programma, dat een (invoer)file met N random getallen met behulp van een DynDSHeap met heapsize H omzet in een (uitvoer)file met verlengde runs. Kies voor verschillende combinaties van waarden van N en H. Gebruik bij het testen van je algoritme een geschikte testset, zodat alle bijzondere situaties worden afgedekt. Een invoerbestand met N willekeurige getallen en een heapgrootte van H zou zonder verlenging op ongeveer N/H runs komen met gemiddelde lengte H. Dankzij dit algoritme is de verwachting dat het aantal runs ongeveer halveert, zodat de runlengte dus gemiddeld 2*H wordt. Vergelijk deze verwachting met de daadwerkelijk gevonden resultaten. 2.2 – Double Ended Priority Queue Een double ended priority queue (DEPQ) is een collection waarin elementen op basis van hun prioriteit worden opgeslagen. Bij een DEPQ is zowel het element met hoogste als het element met laagste prioriteit op efficiënte wijze rechtstreeks benaderbaar. De DEPQ heeft daartoe in ieder geval de volgende methoden: • isEmpty() - Checks if DEPQ is empty and returns true if empty • size() - Returns the total number of elements present in the DEPQ • getLow() - Returns the element having least priority • getHigh() - Returns the element having highest priority • add(x) - Inserts the element x in the DEPQ • removeLow() - Removes an element with minimum priority and returns this element • removeHigh() - Removes an element with maximum priority and returns this element Een DEPQ kan worden gebouwd met behulp van een variatie op een heap, bijvoorbeeld met: • een interval heap, zie bv. www.mhhe.com/engcs/compsci/sahni/enrich/c9/interval.pdf • een min-max heap, zie bv. en.wikipedia.org/wiki/Min-max_heap • een deap, zie bv. programming.im.ncnu.edu.tw/CH9.ppt, slides 13-20, of people.cs.nctu.edu.tw/~chengchc/Course_2011_Fall_DS/DS_09_Heaps.pdf, pg. 19-28 NB: deap wordt hierin ten onrechte symmetrische min-max heap genoemd, op pg. 26 staat nog een fout: keys 30 en 20 hadden aan het eind nog verwisseld moeten worden. • een symmetrische min-max heap, zie het gedeelte over SMMH v2.0 in people.cs.nctu.edu.tw/~chengchc/Course_2011_Fall_DS/DS_09_Heaps.pdf, pg. 29-39 NB: de pseudocode op pagina 36 bevat fouten, zie de review op de volgende pagina Zie hoofdstuk 8 in www.e-reading.club/bookreader.php/138822/Mehta_- _Handbook_of_Data_Structures_and_Applications.pdf voor meer achtergrondinformatie. Ontwerp en implementeer een class DEPQ, gebruikmakend van een van bovengenoemde soorten heaps. Leg in je documentatie duidelijk uit wat de eigenschappen zijn van de door jou gekozen soort. 3 Etto Salomons’ review van pagina 36 uit people.cs.nctu.edu.tw/~chengchc/Course_2011_Fall_DS/DS_09_Heaps.pdf 4 Opdracht 3: Backtracking 3.1 – Pionnen puzzeldoolhof In onderstaand puzzeldoolhof worden in de startsituatie twee pionnen geplaatst op de posities 1 en 2. De bedoeling van de puzzel is, dat één van de pionnen uiteindelijk op de FINISH komt. Met de pionnen kunnen zetten worden gedaan: een pion mag worden verplaatst over een pijl in dezelfde kleur als de positie van de andere pion. Voorbeeld: vanuit de startsituatie kan de pion op positie 2 worden verplaatst naar positie 12. Eenzelfde pion mag meerdere keren achter elkaar worden verplaatst. Ontwerp en implementeer eerst een geschikte datastructuur voor de representatie van het puzzeldoolhof. Ontwikkel daarna een algoritme voor het oplossen van de puzzel. Bedenk hierbij, dat op elk moment de toestand van de puzzel kan worden beschreven door bijvoorbeeld de twee posities waarop de pionnen staan. Vanuit zo’n toestand is een aantal zetten mogelijk. Door een zet uit te voeren ontstaat een nieuwe toestand. Een oplossing is dan een opeenvolging van toestanden met als laatste een eindtoestand: één van de pionnen staat op FINISH. Controleer de gevonden route(s) door deze na te spelen! 5 3.2 – Interplanetaire doolhof In de 21-ste eeuw ontdekte men in een uithoek van een ver galactisch systeem een groep van 9 sterren, elk omgeven door 9 planeten. Later bleek, dat de planeten bewoond waren en wel door wezens die verre reizen konden maken, hoewel ze daarbij vaak over moesten stappen. Op bijgaande figuur zijn de sterren (A t/m K) en de planeten schematisch weergegeven, omdat het in ons probleem uitsluitend om de transportmogelijkheden gaat. Tussen de planeten rond een ster reist men met een shuttle. Planeten waartussen shuttle- verkeer mogelijk is, zijn op de tekening met elkaar verbonden met een zwart pijltje. Zo kan men bv. van A4 via A1 naar A2 reizen. Verkeer tussen de sterrenstelsels is mogelijk door middel van de zogenaamde R-Tram (Ruimtelijke TRanslatorische Mutatie). Bij dit uiterst snelle vervoer wordt materie omgezet in energie. Deze wordt overgestraald naar een planeet van een ander stelsel, waarna de passagiers, als alles goed gaat, zich weer materialiseren. Het overstralen kan alleen als aan alle volgende voorwaarden wordt voldaan: • tussen stelsels die door paarse pijlen met elkaar verbonden zijn • tussen planeten die in die stelsels een overeenkomstige plaats innemen, d.w.z. hetzelfde nummer hebben • tussen planeten met hetzelfde magnetisme. Het magnetisme wordt aangegeven door de kleur: o geel: alpha positief o blauw: alpha negatief o rood: beta magnetisme o groen: sigma magnetisme Enkele voorbeelden: • Een reiziger die van D7 naar D8 wil, kan zich van D7 naar A7 over laten stralen, daar de shuttle nemen naar A8 en zich vandaaruit terug laten stralen naar D8. • Een reiziger die van K2 naar D3 wil, kan zich van K2 over laten stralen naar B2, per shuttle naar B1, stralen naar A1, per shuttle naar A2, stralen naar D2 en vandaar neemt hij de shuttle naar D3. Ontwerp en implementeer eerst een geschikte datastructuur voor de representatie van dit galactisch systeem. Ontwikkel vervolgens een algoritme, dat een route zoekt voor een reiziger vanaf een startplaneet naar een doelplaneet, zoals bijvoorbeeld van C1 naar K8. Bedenk hierbij, dat op elk moment de toestand van de reiziger bijvoorbeeld kan worden beschreven door de planeet waarop de reiziger op dat moment is. Vanuit zo’n toestand is een aantal vervolgreizen mogelijk. Door een reis uit te voeren ontstaat een nieuwe toestand. Een oplossing is dan een opeenvolging van toestanden met als laatste een eindtoestand: de reiziger is aangekomen bij zijn doelplaneet. Controleer de gevonden route(s) door deze na te spelen! In je documentatie licht je jouw ontwerp toe en motiveer je de gemaakte keuzes. 6 7
Enter the password to open this PDF file:
-
-
-
-
-
-
-
-
-
-
-
-