Rush Hour. Concurrency Opgave 3, Herfst

Vergelijkbare documenten
Netchange. Concurrency Opgave 2, December

Examen Datastructuren en Algoritmen II

Het Eindfeest. Algoritmiek Opgave 6, Voorjaar

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Oefeningen Jaarproject I

Opgave 2. Binaire informatie

Tentamen Programmeren in C (EE1400)

Informatica: C# WPO 12

Grafen en BFS. Mark Lekkerkerker. 24 februari 2014

Datastructuren en Algoritmen

Informatica: C# WPO 13

Programmeren (1) Examen NAAM:

Datastructuren en algoritmen voor CKI

Programmeren in C++ Efficiënte zoekfunctie in een boek

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

DomJudge-Practicum. Open Dag UU

Zelf een Afsluitknop maken in Windows 10 ( of 7 of 8.x )

Variabelen en statements in ActionScript

Informatica: C# WPO 10

Waarom ga je schrijven? Om de directeur te overtuigen

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Computationele Intelligentie

Practicumopgave 3: SAT-solver

Handleiding bij de Booktest Generator

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel.

Algoritmisch Denken: Dodo s Bit Parity

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

GO spelregels. Wim Berkelmans

De Leidsche Flesch Studievereniging voor Natuurkunde, Sterrenkunde, Wiskunde en Informatica sinds DLF Pointerworkshop

Computationele Intelligentie

Informatica: C# WPO 11

Hoe maak ik een fotocollage met Pixlr?

Opgaven Kunstmatige Intelligentie 1 maart 2017

Zo gaat jouw kunstwerk er straks uitzien. Of misschien wel heel anders.

Een gelinkte lijst in C#

Waarom ga je schrijven? Om de directeur te overtuigen

5. Werken met afbeeldingen

TECHNISCHE UNrVERSITElT DELFT Faculteit Elektrotechniek, Wiskunde en Informatica

Oefeningenexamen Informatica: juni 2015

Voornaam. Achternaam. adres

Toets Programmeren, 2YP05 op donderdag 13 november 2008, 09:00-12:00

Voor de database wordt een Access 2000 bestand gebruikt, met voorlopig 1 tabel:

Automating Complex Workflows using Processing Modeler

TELEPORTEREN MET VARIABELEN

Datum. Vraag het bedrag in BEF. Reken om naar EURO. Toon het bedrag in EURO. --- Vraag het bedrag in BEF Reken om naar EURO---

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Handleiding bij de workshop Animatie in Microsoft PowerPoint Hoe maak je een animatie in Microsoft PowerPoint 2010? Handleiding voor kinderen

Examen Algoritmen en Datastructuren III

Je gaat leren programmeren in Ruby. En daarna in Ruby een spelletje maken. Websites zoals Twitch en Twitter gemaakt zijn met behulp van Ruby?

13. Symbool-, Lijnstijlbibliotheek (Resource Editor)... 1

Aan de gang. Wiskunde B-dag 2015, vrijdag 13 november, 9:00u-16:00u

Je gaat leren programmeren en een spel bouwen met de programmeertaal Python. Websites zoals YouTube en Instagram zijn gebouwd met Python.

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

OPDRACHTKAART. Thema: Prepress. InDesign 15. Pagina s PP Voorkennis: De vorige praktijkopdrachten afgerond.

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011

DB Alerts vernieuwde app voor Android gebruikers

Bij het opstarten van Small Basic verschijnt er de onderstaande werkomgeving.

HANDLEIDING PROGRAMMEREN IN PASCAL (LAZARUS)

Examen Algoritmen en Datastructuren III

onderzoek werkblad naam: Biodiversiteit les & In de klas Buiten - zoekkaart Bodemdiertjes of site dierenzoeker.nl of de app dierenzoeker

Visual Basic.NET. Visual Basic.NET. M. den Besten 0.3 VB. NET

Algoritmiek. 2 februari Introductie

Stacks and queues. Hoofdstuk 6

Twaalfde college algoritmiek. 13 mei Branch & Bound Heap, Heapsort & Heapify

Rush Hour: pad-planning met een robot-arm

13 tips tegen een trage PC. Een trage PC, wat zijn de mogelijkheden om dit te voorkomen of te verhelpen: 1.Taakbeheer.

Modelleren en Programmeren

Tentamen Programmeren in C (EE1400)

Let s play baseball! Let s get ready! Voorkennis: Sprites, Lopen, Variabelen, Scores, xy. Leerdoelen: 3D illusie, Klonen

9.18 Macro s: oefeningen

Weet jij een paar leuke lijstjes? Denk bijvoorbeeld aan alle kinderen in je klas of al je vriendjes of vriendinnetjes.

Inleiding Programmeren 2

woensdag 2/3/4² - Diepenbeek OPGAVEN CAT 4

Handleiding Japanse puzzels

Inhoud. Voorwoord. Het materiaal Doel van het spel Verloop van het spel Slaan en atari Zelfmoord Ko Oog Twee ogen Einde van het spel Puzzels

Handleiding Opdrachtkaarten maken.

Informatie gebruik Digi Bord

Kerstvakantiecursus. wiskunde A. Rekenregels voor vereenvoudigen. Voorbereidende opgaven VWO kan niet korter

Computationale Intelligentie Dirk Thierens

Waarom ga je schrijven? Om mensen ervan te overtuigen dat een plek in je buurt opgeknapt moet worden.

Handleiding Mijneigenweb.nl

Stroomschema s maken in Word

Bijlage Inlezen nieuwe tarieven per verzekeraar

Examen Datastructuren en Algoritmen II

Hoe? RIVER CROSSING. Taal 1. Waar? Tijd? Extra? SPEL DENK

OEFENINGEN PYTHON REEKS 6

Aan het begin verliet Tony Campmans ons team, we hebben dus het hele project met één persoon minder gewerkt.

RUBRICEREN, UPDATEN EN BESTANDEN VERWIJDEREN

Inhoudstabel. Habils Kenny 2

9.19 Macro s: oefeningen

Inhoudsopgave Voorwoord 7 Nieuwsbrief 7 De website bij het boek 7 Introductie Visual Steps 8 Wat heeft u nodig? 8 Uw voorkennis 9 Bonushoofdstukken

Examen Datastructuren en Algoritmen II

Examen Discrete Wiskunde donderdag 12 april, 2018

Examen Software Ontwikkeling I 2e Bachelor Informatica Academiejaar Januari, **BELANGRIJK** : Schrijf je naam onderaan dit blad

International Olympiad in Informatics 2013

Containers stapelen. M.L. Koning april 2013

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

Examencursus. wiskunde A. Rekenregels voor vereenvoudigen. Voorbereidende opgaven VWO kan niet korter

Implementatie en toepassing van de trie

Transcriptie:

Achtergrond Rush Hour Concurrency Opgave 3, Herfst 24 Rush Hour is een schuifpuzzel waarbij je door middel van het schuiven van andere auto s op het terrein je eigen auto moet proberen vrij te spelen. Je kunt op de website van ThinkFun dit spel uitproberen. Als je het liever op je telefoon/tablet wilt uitproberen, kun je de app Unblock Me (ios/android, gratis) downloaden die een heel vergelijkbare gameplay heeft (maar niet van ThinkFun is). Er staan horizontaal en vertikaal auto s van verschillende lengtes op het spelbord. Je kunt een horizontale auto alleen horizontaal, en een vertikale auto alleen vertikaal verplaatsen. Het doel is, om een gegeven auto naar het doelvakje te verplaatsen. Dit is alleen knap lastig, omdat de andere auto s in de weg staan. Zoek een zo kort mogelijke oplossing (zo klein mogelijk aantal verschuivingen) om de auto naar zijn doel te brengen. Opdracht Voor deze opdracht moet je een parallelle Rush Hour solver maken. Je programma moet niet alleen de standaard 6x6-configuratie aan kunnen, maar ook rechthoeken van andere formaten. Bij het zoeken van een oplossing moet je bijhouden welke posities in de puzzel je al hebt bezocht, om herhaling van zetten te voorkomen. Uitvoer Er zijn twee uitvoermodi: Telmodus: Geef het aantal stappen dat minimaal nodig is om de puzzel op te lossen. Indien de puzzel niet oplosbaar is wordt - gegeven. Oplosmodus: Geef als antwoord een mogelijke kortste oplossing door middel van een stap voor stap beschrijving. Elke stap wordt in de uitvoer gescheiden door een komma en bestaat uit 3 karakters: () het karakter van de auto, (2) de richting van de stap: u, d, l of r voor respectievelijk up, down, left en right, (3) het aantal vakjes dat de auto verschuift in die richting. Als er geen oplossing voor de puzzel is wordt Geen oplossing gevonden als uitvoer gegeven. Een auto meer dan hokje verplaatsen wordt ook gerekend als stap. Let er op dat je tijdens de Telmodus geen tijd en geheugen besteedt aan het onnodig bijhouden van de bijbehorende oplossing. Versie: 8 december 25.

Het doel van het spel is om je eigen auto te bevrijden. Voor deze opdracht zal je eigen auto altijd aangeduid worden met de letter x. Omdat we met variabele borden werken wordt bij de invoer de targetspace gedefiniëerd (zie Invoer). Dit zijn de coordinaten van het vakje, geteld vanuit een -based grid, waar de linker bovenhoek van onze auto zich moet bevinden om de puzzel als opgelost te beschouwen. Het targetvak ligt altijd binnen het bord. Invoer De invoer begint met 3 regels met daarop: Een integer u, de uitvoermodus: voor Telmodus, voor Oplosmodus. Een integer w gevolgd door een spatie en een integer h, de breedte en hoogte van het bord. Hierbij geldt dat zowel w als h positief en kleiner dan 2 zijn. Een integer x gevolgd door een spatie en een integer y, de coordinaten van het targetvakje. Hierna volgen h regels van w karakters per stuk die de beginpositie van het bord voorstellen. Een. geeft een leeg vakje aan, de x geeft de te bevrijden auto aan. De overige auto s worden voorgesteld met andere lowercase karakters. Alle auto s zijn minstens 2 vakjes lang, zijn -dimensionaal (en staan dus altijd horizontaal of verticaal) en iedere auto heeft een uniek karakter (er zijn dus nooit meer dan 26 auto s). Nog wat extra tips: De karakters zijn alleen ter identificatie van de auto s en hebben (behalve x ) verder geen betekenis. Ook je eigen auto kan groter zijn dan 2 vakjes. Je eigen auto kan ook verticaal staan. Details Gebruik van Threads/Tasks/etc... Bij deze opdracht heb je iets meer vrijheid. Je mag alle 2 ingebouwde functionaliteit van C# gebruiken, dus ook alles uit bijvoorbeeld System.Collections.Concurrent en System.Threading.Parallel. Verras ons met hoe goed je de functionaliteit van C# in je voordeel kan gebruiken! In tegenstelling tot bij opdracht, is het aantal threads/tasks geen onderdeel van de invoer! Het is de bedoeling dat je programma zelf besluit wat een redelijk aantal 2 met uizondering van System.Solvers.Concurrent.RushHour. 2

is, bijvoorbeeld door te kijken naar Environment.ProcessorCount. Nog mooier 3 is om Parallel.For of Parallel.ForEach te gebruiken of een ThreadPool te gebruiken. Deze methoden verdelen vanzelf het werk over een aantal threads, en het aantal threads wordt door C# constant aangepast om zo goed mogelijke prestaties te behalen. Representatie Om je programma zo snel mogelijk te laten zoeken, moet je een goede representatie hebben van posities. De manier waarop het in de invoer wordt gegeven (met strings) is voor intern gebruik niet erg goed omdat het veel ruimte gebruikt en string-operaties erg langzaam zijn. Een goede representatie is om een array te maken met integers 4, voor iedere auto in het spelbord integer. De integer geeft dan aan hoeveel posities de auto is verschoven ten opzichte van de rand van het bord. Je hebt ook nog wat extra informatie nodig (zoals in welke rij/kolom een auto staat, hoe lang hij is en of hij horizontaal/vertikaal is) maar dit hoef je niet bij de representatie van de positie op te slaan (want het is altijd hetzelfde). Oplossing opslaan In de oplosmodus is het nodig om de oplossing op te slaan. Je kunt bij iedere positie een string bijhouden die de oplossing om bij die positie te komen op slaat, maar dit is niet erg efficiënt. Beter is het om een soort linked list te bouwen, waarbij iedere positie een pointer heeft naar de positie die voor hem zit. Zo kun je door vanaf de oplossingspositie deze pointers terug naar de beginpositie te volgen de oplossing reconstrueren. Algoritme Een algoritme dat je kunt gebruiken om Rush Hour op te lossen, heet Breadth-First Search. Het idee is, dat je begint met de beginpositie (diepte ) en dat je vanuit hier een lijst genereert van alle mogelijke volgende posities die je door het doen van zet kunt verkrijgen (diepte ). Vanuit deze lijst bouw je weer een lijst op van alle mogelijke posities die je in 2 zetten kunt bereiken (diepte 2). Herhaal dit procedé totdat je de oplossing hebt gevonden. Merk op dat het niet nodig is, om de lijsten met posities te behouden: je kunt op diepte (n + 2) de lijst van diepte n weggooien om geheugen te besparen. Taboo List Breadth-First Search heeft een groot nadeel, het kan rondjes lopen: de beginpositie levert een lijst op van posities op diepte, maar als je niet op let bevat de lijst van posities op diepte 2 ook weer de beginpositie - en de lijst van posities op diepte 3 bevat ook weer alle diepte -posities! Om dit te voorkomen moet je een Taboo List 5 bouwen: een lijst van 3 Dit levert dus ook meer punten op. 4 Tip: een integer kan 2 32 verschillende waarden opslaan, er zijn per auto maximaal 2 posities. Kies voor maximale efficiëntie dus een ander numeriek datatype! 5 NB: Dit heeft niks met Tabu Search te maken 3

posities die je al hebt gezien. Bij het ontdekken van een positie zet je deze in de taboo list, en posities die al in de taboo list staan bekijk je niet nog eens. Om dit snel genoeg te krijgen, kun je gebruik maken van de ConcurrentDictionaryklasse. Je moet dan wel een goede hashfunctie definiëren voor je posities. Je kunt extra punten verdienen door niet de ConcurrentDictionary te gebruiken, maar zelf een datastructuur te implementeren. Je kunt bijvoorbeeld met behulp van de CompareExchange-methode de wacht-vrije Trie bouwen. Een Trie (wikipedia) is een speciale datastructuur die vooral voor strings wordt gebruikt, maar ook zeer geschikt is om Rush Hour-posities op te slaan. Een TrieNode-object is een object met daarin een array van (nog meer) TrieNodes. Als de eerste auto op het bord (bijvoorbeeld) 6 mogelijke posities heeft, is de wortel van de Trie een TrieNode-object met een array van 6 TrieNodes. Het eerste element van deze array komt overeen met dat de eerste auto op positie staat, en de tweede met positie 2, etc... De TrieNode-objecten in de array van de wortel geven dan de positie van de tweede auto weer, etc... Als ik dus een bord heb met auto op positie 3, auto 2 op positie 4 en auto 3 op positie 2, dan bekijk ik Trie[3][4][2]. Omdat er heel veel mogelijke posities zijn (en lang niet alle posities zijn bereikbaar) is het niet haalbaar om de Trie in het begin helemaal op te bouwen. In het begin zijn alle TrieNode-objecten null, en die worden opgevuld als posities worden ontdekt. Als je op het pad in de Trie naar jouw positie een null tegenkomt, betekent dat dat die positie er nog niet in staat. Optioneel: A* met Heuristiek A* is een ander zoek-algoritme. Je kunt dit algoritme een heuristiek meegeven. De heuristiek maakt een schatting van hoe veel stappen een bepaalde positie van de oplossing af staat zodat je gerichter kunt zoeken. Hierdoor kun je veel ingewikkelder Rush Hour-puzzels oplossen. Als je A* implementeert moet het mogelijk zijn om de heuristiek uit te schakelen (zie Invoer). Zonder heuristiek gedraagt A* zich hetzelfde als BFS. Je hoeft daarom naast A* niet ook BFS te implementeren. Lees voor meer informatie het wikipedia-artikel over A*. Bedenk zelf een goede heuristiek. Zonder dit onderdeel kun je een halen, met het implementeren van A* kun je bonuspunten verdienen en eventuele fouten in andere onderdelen compenseren. Tip: om A* te implementeren heb je een priority queue nodig. Gebruik in geen geval SortedList, dit is veel te langzaam. Je kunt bijvoorbeeld een array A van lijsten maken, waarbij een positie met afstandschatting d in de lijst A[d] wordt opgeslagen. Verslag Schrijf een kort (5- regels) verslag over je programma. Noem hier in welke datastructuren je hebt gebruikt, en of de operaties hierop locking zijn. 4

In een ideale wereld zou een programma dat op n cores draait, n keer zo snel moeten werken. In de praktijk lukt dit nooit, omdat er door bijvoorbeeld locking en communicatie bottlenecks ontstaan waardoor dingen niet parallel kunnen. Noem in je verslag wat de bottlenecks in jouw programma zijn, en wat je hebt gedaan om bottlenecks te vermijden. Beoordeling Voor dit practicum is weer een testprogramma beschikbaar, TomJudge3.exe. Wij gebruiken dit programma ook bij de beoordeling, dus het is heel verstandig om zelf je programma door TomJudge te laten checken. Zet het bestand TomJudge3.exe in dezelfde map als de *.cs-bestanden van je project. TomJudge zoekt vervolgens automatisch in de./bin/debug-map naar de debug-versie van je executable. Het is belangrijk dat je voordat je test met TomJudge eerst zorgt dat de debug-versie van je project up-to-date is (gebruik F5 of F6 in Visual Studio). Je kunt eventueel ook de locatie van je executable doorgeven als argument, voer dan in de opdrachtprompt in: TomJudge3 "C:/Concurrency/Programma.exe". NB: TomJudge werkt alleen op Windows. Het daarom is niet verplicht om TomJudge te gebruiken maar voor het nakijken is het handig als je het bestand report.csv dat TomJudge aanmaakt ook inlevert. Let er ook op dat TomJudge op verschillende computers andere beoordeingen kan geven, het is voor ons immers niet te doen om het op al jullie computers uit te proberen. TomJudge geeft alleen een indicatie en is bedoeld om te helpen, maar we gaan bij het nakijken er van uit hoe je programma op onze computer wordt beoordeeld. Extra informatie Sommige van de testcases (met name hard-,2,3 en 4) zijn erg lastig. Hard-,2 en 3 kunnen met BFS opgelost worden. Hard-4 zal je alleen lukken als je A* met een goede heuristiek gebruikt. Het is niet erg als je hard-3 niet haalt. Het is mooi als dat wel lukt, maar het is geen verplichting. TomJudge test alleen of je programma correct werkt, maar kan niet zien hoe mooi het is geschreven en welke datastructuren je gebruikt. TomJudge kan ook je verslag niet lezen. Anders dan bij de eerste opdrachten zal de beoordeling iets meer naar de code kijken en minder naar de testresultaten (alhoewel je als alle tests correct zijn nog steeds een mooi cijfer kunt verwachten). Voorbeelden Hier volgen enkele voorbeelden van invoer en bijbehorende uitvoer. Je kunt ze vinden op de praktikumpagina, waarbij voorbeeld VVV bestaat uit bestanden VVV.in en VVV.uit. Voorbeeld st: 5

aaobcc..ob.. xxo... deeffp d..k.p hh.k.p Voorbeeld drie: Deze kan in drie stappen......a... xxa.b....b....... Voorbeeld vol: Oei die staat behoorlijk vol. aaabcd effbcd e.xxcd ggh....ih.jj.ikkll Voorbeeld fifty: Fifty shades of sweat. 6

..cddd a.ce.. axxe.. bbryyi.gruui.gtt.i Voorbeeld qwerty:..qwwe..qr.e xxqr.e tiii.. tuuop. yy.op. Voorbeeld rondje: Autodraaikolkje. 2 6 2..cddd...q.. a.ce...q.. axxe...q.. bbryyi....gruui....gtt.i...zz. Voorbeeld kannie: Deze kan echt niet. 2 2.xx...q.....q.. 7