Logisch programmeren 2012

Vergelijkbare documenten
Modelleren en Programmeren

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search

Computationale Intelligentie Dirk Thierens

Doorzoeken van grafen. Algoritmiek

Kosten. Computationale Intelligentie. Een zoekprobleem met stapkosten. Een voorbeeld: het vinden van een route. Zoeken met kosten.

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Disclaimer Het bestand dat voor u ligt, is nog in ontwikkeling. Op verzoek is deze versie digitaal gedeeld. Wij willen de lezer er dan ook op wijzen

Computationele Intelligentie

Programmeermethoden NA. Week 5: Functies (vervolg)

Modelleren en Programmeren

Kortste Paden. Algoritmiek

Examen Datastructuren en Algoritmen II

Opgaven Kunstmatige Intelligentie 1 maart 2017

Programmeermethoden NA. Week 6: Lijsten

Greedy algoritmes. Algoritmiek

Programmeermethoden NA

Discrete Wiskunde, College 12. Han Hoogeveen, Utrecht University

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Inleiding Programmeren 2

Computationele Intelligentie

Bij elkaar behorende instructies die een probleem oplossen of een taak uitvoeren.

Examen Datastructuren en Algoritmen II

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011

Netwerkdiagram voor een project. AOA: Activities On Arrows - activiteiten op de pijlen.

Netwerkdiagram voor een project. AON: Activities On Nodes - activiteiten op knooppunten

Bij elkaar behorende instructies die een probleem oplossen of een taak uitvoeren.

Minimum Opspannende Bomen. Algoritmiek

TW2020 Optimalisering

Inleiding Programmeren 2

TW2020 Optimalisering

Examen Datastructuren en Algoritmen II

Vakgroep CW KAHO Sint-Lieven

Constraint satisfaction. Zoekalgoritmen ( ) College 11: Constraint Satisfaction. Voorbeelden. Een constraint satisfaction probleem

Examen Datastructuren en Algoritmen II

Sjaars Kampioenschap Programmeren Vrijdag 18 maart 2011

Programmeermethoden NA. Week 5: Functies (vervolg)

Modelleren en Programmeren

Derde college complexiteit. 7 februari Zoeken

Duration: 2 hrs; Total points: 100 No documents allowed. Use of electronic devices, such as calculators, smartphones, smartwatches is forbidden.

Modeluitwerking Tentamen Computationele Intelligentie Universiteit Leiden Informatica Vrijdag 11 Januari 2013

Derde college algoritmiek. 18 februari Toestand-actie-ruimte

Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Heuristieken en benaderingsalgoritmen. Algoritmiek

Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen

Datastructuren en Algoritmen

Examen Datastructuren en Algoritmen II

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

II. ZELFGEDEFINIEERDE FUNCTIES

Datastructuren: stapels, rijen en binaire bomen

Vierde college complexiteit. 14 februari Beslissingsbomen

Getallensystemen, verzamelingen en relaties

Benaderingsalgoritmen

Derde college algoritmiek. 23 februari Toestand-actie-ruimte

Examen Datastructuren en Algoritmen II

Examen Datastructuren en Algoritmen II

OPDRACHT Opdracht 2.1 Beschrijf in eigen woorden wat het bovenstaande PSD doet.

Bij elkaar behorende instructies die een probleem oplossen of een taak uitvoeren.

Syntax- (compile), runtime- en logische fouten Binaire operatoren

Automaten. Informatica, UvA. Yde Venema

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Tweede college algoritmiek. 12 februari Grafen en bomen

Score. Zelfevaluatie. Beoordeling door de leerkracht. Datum: Klas: Nr: Naam:

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.

1.1 Rekenen met letters [1]

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Examen Datastructuren en Algoritmen II

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Deeltentamen 1 sociale netwerk analyse

De volgende opgave gaat over de B-bomen van het college, waar sleutels zowel in de bladeren als ook in de interne knopen opgeslagen worden.

Opgaven Kunstmatige intelligentie 4 mei 2012

1 Complexiteit. of benadering en snel

Practicumopgave 3: SAT-solver

Grafen en netwerken I Datastructuren en doorzoeken. Algoritmiek

Tentamen Kunstmatige Intelligentie (INFOB2KI)

Een voorbeeld. Computationele Intelligentie Zoeken met een tegenstander. Een voorbeeld vervolg. Een zoekprobleem met een tegenstander

Tiende college algoritmiek. 13/21 april Gretige Algoritmen Algoritme van Dijkstra

Algoritmiek. 15 februari Grafen en bomen

Transcriptie:

Logisch programmeren 2012 Opdrachten Week 8 1 Fibonacci woorden Een Fibonacci woord is een eindig rijtje over het twee-letter alfabet {1, 2}. De rangorde van een Fibonacci woord w is de som van de samenstellende cijfers. Bijvoorbeeld: de rangorde van het woord 1121 is 1 + 1 + 2 + 1 = 5. We schrijven F n voor de verzameling Fibonacci woorden van rang n. De Fibonacci woorden ontlenen hun naam aan het feit dat het aantal woorden in F n correspondeert met de Fibonacci reeks (1,1,2,3,5,8,... ). Figuur 1 geeft de Fibonacci woorden voor rangorde 0 n 5. Het symbool ε staat voor het lege rijtje het enige rijtje van rangorde 0. De bron voor dit binaire systeem is de klassieke Indische metriek. Het symbool 1 staat voor een korte lettergreep, het symbool 2 voor een lange. Een korte lettergreep is één maatslag lang, een lange twee. F n geeft dus alle mogelijke ritmes voor n maatslagen. 1 1.1 Opgave In de opgaven die volgen schrijven we een Fibonacci woord als een rijtje van 1-en en 2-en. Definieer een predicaat f/2 waarmee je F n genereert: f(n,woord) slaagt als Woord een Fibonacci woord is van rang N. Bijvoorbeeld:?- f(3,l). L = [1, 1, 1] ; L = [1, 2] ; L = [2, 1] ; false. Giet je definitie voor f/2 in de vorm van een DCG voor een predicaat f/4. De eerste twee argumenten staan voor de rang, uitgedrukt als verschilgetal, de laatste twee voor het woord, uitgedrukt als verschillijst. Hieronder de wrapper; d2s/3 (een oude bekende) zet een decimaal getal om in een verschilgetal. 1 Rachel Wells Hall Math for poets and drummers is een aardig achtergrondartikel. 1

Figuur 1: Diagram van F n voor 0 n 5 f(n,f) :- d2s(n,p,0), f(p,0,f,[]). % wrapper % d2s/3: decimaal naar verschilgetal d2s(n,s(x),y) :- N>0, N1 is N-1, d2s(n1,x,y). d2s(0,x,x). Denk erom dat de DCG pijl --> de verschillijst argumenten automatisch aanvult. Zorg ervoor dat je DCG niet linksrecursief is! 1.2 Opgave Het hoofd van een Fibonacci woord is het langste prefix bestaande uit 2-en. In het volgende voorbeeld is het hoofd onderstreept: 2212. Gegeven een Fibonacci woord w bereken je de opvolgers van w in de tralie van Figuur 1 aan de hand van een van de volgende operaties: (i) voeg links een 1 toe aan w; (ii) vervang het eerste voorkomen van 1 in w door een 2; (iii) voeg een 1 in waar dat kan tussen twee 2 s in het hoofd van w of onmiddellijk na de laatste 2 van het hoofd. De voorgangers van w bereken je aan de hand van een van de volgende operaties: (i) verwijder het eerste voorkomen van 1 in w; (ii) vervang een voorkomen van 2 in het hoofd van w door een 1. 2

Definieer een predicaat f_desc/2 voor de voorganger-opvolger relatie. Gegeven een Fibonacci woord F slaagt f_desc(f,f1) als F1 een opvolger is van F; gegeven een Fibonacci woord F1 slaagt f_desc(f,f1) als F een voorganger is van F. Test je definitie aan de hand van Fig 1. 2 Zoeken: breadth first Hieronder het generieke breadth first zoekalgoritme, zoals besproken in het hoorcollege. De predicaten voor het manipuleren van een wachtrij (queue) vind je in de Week 8 startcode. bf(start, Final, Path) :- % wrapper empty_queue(empty), bf(start, Final, Empty, [], Path). bf(s, S, _, RevPath, Path) :- solution(s), reverse([s RevPath], Path). bf(s0, S, Queue0, Path0, Path) :- findall(n(s1,[s0 Path0]), s(s0,s1), Children),!, queue_append(queue0, Children, Queue1), % Children achteraan aansluiten queue_cons(n(s2, Path2), Queue, Queue1), % voorste is nu aan de beurt bf(s2, S, Queue, Path2, Path). 2.1 Opgave Vul de probleemspecifieke informatie in voor de Fibonacci woorden van de vorige opgaven. Definieer de algemene opvolgersrelatie s/2 in termen van f_desc/2. Bouw de conditie in dat in s(knoop,opvolger) de rang van Knoop kleiner is dan de rang van de gezochte oplossing. De gewenste oplossing declareer je met het dynamische solution/1. Hieronder een testwrapper. bf_test(sol) :- retractall(solution(_)), assert(solution(sol)), bf([],sol,path), write(path),nl, fail. bf_test(_). 3

En een voorbeeldaanroep.?- f_test([2,2]). [[],[1],[1,1],[2,1],[2,2]] [[],[1],[2],[1,2],[2,2]] [[],[1],[2],[2,1],[2,2]] true. 2.2 Opgave Het bf/5 programma herberekent vaak de s/2 relatie voor knopen die al eerder zijn bezocht. Dat kan je verhelpen met de memo techniek. Het predicaat s_memo/2 hieronder berekent s/2 en slaat oplossingen op als feiten voor een dynamisch predicaat found/2. If->Then;Else is het ingebouwde if-then-else construct. s_memo(s,s1) :- s(s,s1), store_solution(s,s1). store_solution(s,s1) :- found(s,s1) % al gevonden -> true % doe niets ; assert(found(s,s1)). Pas je code aan om met s_memo/2 te werken. Noem de nieuwe predicaten bf_memo/3 en bf_memo/5. Bij het expanderen van een knoop S laat je findall de kinderen van S simpelweg opzoeken als er al feiten voor found(s,_) zijn. Als er nog geen feiten voor found(s,_) zijn, laat je findall de kinderen aanmaken met s_memo/2. Hieronder de testwrapper. bf_memotest(sol) :- retractall(found(_,_)), retractall(solution(_)), assert(solution(sol)), bf_memo([],sol,path), write(path),nl, fail. bf_memotest(_). 4

3 Zoeken: best first Hieronder het generieke A best first algoritme, zoals je het vindt in de startcode voor Week 8. bestf(start, Goal, Cost, Path) :- empty_heap(heap), bestf(start, Goal, Heap, 0, Cost, [], Path). bestf(s, S, _, Cost, Cost, RevPath, Path) :- solution(s), reverse([s RevPath], Path). bestf(s0, Goal, Heap0, G0, Cost, Path0, Path) :- findall(f-n(s1,g,[c,s0 Path0]), % F waarde is de prioriteit van S1 ( s_cost(s0,s1,c), % overgangen met een kostprijs C G is C+G0, h(s1,goal,h), F is G+H ), Children), list_to_heap(children,childrenheap), merge_heaps(childrenheap,heap0,heap1), get_from_heap(heap1,_,n(s2, G2, Path2), Heap), bestf(s2, Goal, Heap, G2, Cost, Path2, Path). Probleemspecifiek zijn s_cost/3 en h/3. 3.1 Opdracht In de graaf hieronder zie je twee paden (rood versus blauw) van Start naar Doel. Voor de Prolog codering van de graaf schrijven we knopen als coördinatenparen X/Y. Start is dan 0/0, Doel is 4/3. Verbindingen tussen knopen coderen we als feiten s(from,to), bijvoorbeeld s(0/0,0/3) voor de eerste overgang op het rode pad. Geef de volledige set van s/2 feiten (zes overgangen voor het rode pad; zeven voor het blauwe). 5

Doel Start Voor gebruik met het best first algoritme willen we de overgangen van een kostprijs voorzien. Definieer daartoe een predicaat manhattan/3 waarmee je de Manhattan distance tussen twee punten uitrekent: de kortste route volgens het Manhattan stratenplan. Bijvoorbeeld:?- manhattan(0/0,4/3,dist). Dist = 7. Je kan de ingebouwde functie abs/1 gebruiken om de absolute waarde van een getal te berekenen: X is abs(-3) slaagt met X=3. Definieer vervolgens s_cost/3 in termen van s/2 en manhattan/3. s_cost/3(s,s1,cost) slaagt als er een verbinding is tussen S en S1 met de Manhattan afstand als Cost. Rest nog de definitie voor de heuristische functie h/3, waarmee je de kortste afstand tussen een gegeven knoop en het doel inschat. Voor ons kortste pad zoekprobleem is een goede invulling voor h/3... de Manhattan distance. Schrijf de definitie voor h/3 op en test de werking van bestf/4 met de aanroep hieronder. Geef een korte commentaar waarin je de volgorde van de gevonden oplossingen toelicht.?- bestf(0/0,4/3,cost,path),write((cost,path)),nl,fail. Opdracht Het bf algoritme kan je zien als een gedegenereerde vorm van best first zoeken waarbij de heuristische functie h/3 triviaal is. Pas de code voor s_cost/3 en h/3 op zulke manier aan dat het best first algoritme hierboven het pad met het kleinste aanstal stappen als eerste oplossing verkiest: het rode pad, in de voorbeeldgraaf. 6