1 Practicum werkstuk Complexiteit & Algoritmiek Bij de module Complexiteit & Algoritmiek wordt ti jdens de verroosterde practica in tweetallen gewerkt aan het practicumwerkstuk Elk tweetal heeft wekelijks m et de begeleidend docent een voortg angsgesprek tijdens de verroosterde practicumlessen. Het practicum werkstuk bestaat uit een drie tal 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 verslaglegg ing. Dit leidt tot d rie beoordelingen op de opdrachten en dan is het cijfer voor het practicum werkstuk 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 gevall en 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 nabesprekin g 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 nabesprek ing van het ingeleverde werk Indien het practicum werkstuk niet met een voldoende wordt afgerond, kan de student gedurende het volgende kwartiel het practicum herkansen . Dit kan door de opdracht en 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 t e stellen Bij een onvoldoende op de her kansing van het practicum werkstuk vervallen alle rechten met betrekking tot eventuele deelbeoordelingen op afzonderlijke opdrachten. 2 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 ge en 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 . O m element a[i] te vullen, genereer je net zo lang een random getal totd at er een is gevonden die niet gelijk is aan a[0] t/m a[i - 1] 2. usedPerm : Analoog aan randomPerm , maar hou d 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 z et op positie i in het array een i , dus a[i] = i V erwissel vervolgens meteen de inh oud 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 , p resenteer 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 i n de array. 2. seqMinMax : Doorl oop 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. recMi n Max : Gebruik het divide - and - conquer mechanisme: A ls 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 min i mum en maximum van beide helften. Uit deze twee minima en maxima k an 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 mogeli jk) 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 d aaraan komt, presenteer je metingen in een grafiek en geef daarbij een kritische vergelijking van je metingen met de verwachte running times. 3 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 opti maal 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 hoor college 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 DynDS Heap, 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 DynDS Heap me t heapsize H omzet in een (uitvoer)file met verlengde runs. Kies voor verschillende com binaties 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 h et 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 • get Low () - Returns th e element having least priority • get High () - Returns the element having highest priority • add ( x ) - Inserts the element x in the DEPQ • remove Low () - Removes an element with minimum pr iority and returns this element • remove High () - Removes an element with maximum pr iority and returns this element Een DEPQ kan worden geb ouwd 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 hier in ten onrechte symmetrische min - max heap genoemd, op pg . 26 staat nog een fout : keys 30 en 20 hadden aan het ei nd 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. Ontwer p 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. 4 Etto Salomons’ review van pagina 36 uit people.cs.nctu.edu.tw/~chengchc/Course_2011_Fall_DS/DS_09_Heaps.pdf 5 Opdracht 3 : Backtracking 3.1 – P ionnen p uzzeldoolhof 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 p ion mag worden verplaatst over een pijl in dezelfde kleur als de positie van de andere pion. Voorbeeld: vanuit de sta r tsituatie 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 datast ructuur voor de representatie van het puzzeldoolhof. Ontwikkel daarna een algoritme voor het oploss en 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 t oestand 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! 6 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 fig u ur zijn de sterren (A t/m K) en de planeten schematisch weergegeven, omdat het in ons probleem uitsluitend om de transpo r tmogelijkheden 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 sterren stelsels 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 materialiser en. Het overstralen kan alleen als aan alle volgende voorwaarden wordt voldaan: • t ussen stelsels die door paarse pijlen met elkaar verbonden zijn • t ussen planeten die in die stelsels een overeenkomstige plaats innemen, d.w.z. hetzelfde nummer hebben • t ussen p laneten met hetzelfde magnetisme. Het magnetisme wordt aangegeven door de kleur: o g eel: alpha positief o b lauw: alpha negatief o r ood: beta magnetisme o g roen: 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. 7