Zesde college algoritmiek. 9/10 maart Backtracking. Verdeel en Heers

Vergelijkbare documenten
Zesde college algoritmiek. 22 maart Backtracking

Zesde college algoritmiek. 23 maart Backtracking. Verdeel en Heers

Zesde college algoritmiek. 18 maart Backtracking. Verdeel en Heers

Vijfde college algoritmiek. 17 maart Exhaustive search Graafwandelingen Backtracking

Vijfde college algoritmiek. 3 maart Brute Force, Exhaustive search en Backtracking

Zevende college algoritmiek. 24 maart Verdeel en Heers


Zevende college Algoritmiek. 6 april Verdeel en Heers

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Twaalfde college algoritmiek. 12 mei Branch & Bound

Vijfde college algoritmiek. 9 maart Brute Force. Exhaustive search

ALGORITMIEK: antwoorden werkcollege 5

Twaalfde college algoritmiek. 23 mei Branch & Bound, Heapsort

Elfde college algoritmiek. 29 april Algoritme van Dijkstra, Branch & Bound

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

Elfde college algoritmiek. 16 mei Dijkstra, Gretige algoritmen en Branch & Bound

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

Twaalfde college algoritmiek. 11/12 mei Branch & Bound

Twaalfde college algoritmiek. 17 mei Branch & Bound

Elfde college algoritmiek. 21 april Dijkstra en Branch & Bound

Zevende college complexiteit. 7 maart Mergesort, Ondergrens sorteren (Quicksort)

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Zevende college algoritmiek. 1 april Verdeel en Heers

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur

Zesde college complexiteit. 19 maart Mergesort, Ondergrens sorteren Quicksort, Shellsort

Tiende college algoritmiek. 4 mei Gretige Algoritmen Algoritme van Dijkstra

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

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Tweede college algoritmiek. 12 februari Grafen en bomen

Negende college algoritmiek. 15 april Dynamisch Programmeren

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

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

Elfde college algoritmiek. 28 april Gretige Algoritmen, Algoritme van Dijkstra, Branch & Bound

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

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

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

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Derde college algoritmiek. 22 februari Complexiteit Toestand-actie-ruimte

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Twaalfde college complexiteit. 11 mei Overzicht, MST

Zevende college complexiteit. 17 maart Ondergrens sorteren, Quicksort

Tiende college algoritmiek. 2 mei Gretige algoritmen, Dijkstra

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Algoritmiek. 15 februari Grafen en bomen

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

Derde college algoritmiek. 23 februari Complexiteit Toestand-actie-ruimte

Tiende college algoritmiek. 3 mei Dynamisch programmeren Gretige Algoritmen Algoritme van Dijkstra

Tiende college algoritmiek. 26 april Gretige algoritmen

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Datastructuren college 10

Vierde college algoritmiek. 23/24 februari Complexiteit en Brute Force

Uitgebreide uitwerking Tentamen Complexiteit, juni 2018

Vierde college complexiteit. 14 februari Beslissingsbomen

Tiende college algoritmiek. 14 april Gretige algoritmen

Negende college algoritmiek. 6/7 april Dynamisch Programmeren

Uitgebreide uitwerking Tentamen Complexiteit, juni 2016

Tiende college algoritmiek. 14 april Dynamisch Programmeren, Gretige Algoritmen, Kortste Pad met BFS

Derde college algoritmiek. 16/17 februari Toestand-actie-ruimte

Derde college algoritmiek. 18 februari Toestand-actie-ruimte

Vijfde college complexiteit. 21 februari Selectie Toernooimethode Adversary argument

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Algoritmiek 2013/ verwijderen. BZboom: verwijderen. Complexiteit (= tijdcomplexiteit) van een algoritme: Algoritmiek 2013/04

Elfde college complexiteit. 23 april NP-volledigheid III

Doorzoeken van grafen. Algoritmiek

Vierde college algoritmiek. 1 maart Toestand-actie-ruimte Brute Force

Negende college complexiteit. 9 april NP-volledigheid I: introductie

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Derde college algoritmiek. 23 februari Toestand-actie-ruimte

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 3 juni 2008, uur

Hoe een TomTom een sudoku oplost

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Algoritmiek. 2 februari Introductie

Eerste college algoritmiek. 5 februari Introductie

Achtste college complexiteit. 2 april Polynoomevaluatie Matrixvermenigvuldiging Euler- en Hamiltonkringen

Permutatie. Definitie: een permutatie is een bijectie waarvan het domein en het bereik dezelfde verzameling zijn. Voorbeeld:

Derde college complexiteit. 7 februari Zoeken

Datastructuren: stapels, rijen en binaire bomen

Elfde college algoritmiek. 10 mei Algoritme van Dijkstra, Gretige Algoritmen

Constraint satisfaction. Computationele Intelligentie. Voorbeelden. Een constraint satisfaction probleem. Constraint Satisfaction

Discrete Wiskunde, College 12. Han Hoogeveen, Utrecht University

Een eenvoudig algoritme om permutaties te genereren

Recapitulatie: Ongeïnformeerd zoeken. Zoekalgoritmen ( ) College 2: Ongeïnformeerd zoeken. Dynamische breadth-first search

Tijd is geen goede maatstaf, want is afhankelijk van computer waarop algoritme wordt gedraaid.

2 Recurrente betrekkingen

Algoritmen, Datastructuren en Complexiteit ( ) Uitwerkingen

Overzicht. Inleiding. Toepassingen. Verwante problemen. Modellering. Exacte oplosmethode: B&B. Insertie heuristieken. Local Search

Datastructuren: stapels, rijen en binaire bomen

Minimum Spanning Tree

Het minimale aantal sleutels op niveau h is derhalve

Computationale Intelligentie Dirk Thierens

n-queens Local Search met Conflict Minimalizatie

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Datastructuren Uitwerking jan

Greedy algoritmes. Algoritmiek

Minimum Opspannende Bomen. Algoritmiek

Transcriptie:

Zesde college algoritmiek 9/10 maart 2017 Backtracking Verdeel en Heers 1

Backtracking Bij veel problemen gaat het erom een element met een speciale eigenschap te vinden binnen een ruimte die exponentieel groeit als functie van de invoergrootte. Dan wordt meestal backtracking gebruikt als goed alternatief voor ES. Exhaustive search genereert alle kandidaatoplossingen en haalt daar het speciale element tussenuit. Backtracking - bouwt kandidaatoplossingen component voor component op, - kijkt al tijdens de constructie of de deeloplossing nog tot een oplossing kan leiden en - zo niet, breidt dan de deeloplossing niet verder uit Op deze manier spaar je soms veel werk uit en kun je dus grotere probleeminstanties oplossen. 2

Backtracking vs ES Backtracking versus exhaustive search Exhaustive search bekijkt alle volledige kandidaatoplossingen. Backtracking controleert telkens van deeloplossingen of ze nog aan de eisen/restricties voldoen; zo niet, dan weet je zeker dat alle uitbreidingen van deze oplossing ook niet voldoen, dus die hoef je dan niet meer expliciet te bekijken. 3

Backtracking Basisidee backtracking bouw een oplossing stap voor stap op en controleer steeds of de deeloplossing in conflict komt met de restricties (en nog wel tot een oplossing kan leiden) op elk moment kun je kiezen uit een aantal mogelijke vervolgstappen; maak een keuze en ga langs die weg verder met het opbouwen van de oplossing als een keuze op niets uitloopt, herzie je deze keuze en probeer je een andere mogelijkheid Vergelijk het vinden van de uitgang in een doolhof: loop steeds verder en als je bij het zoeken vastloopt, ga terug op je pad om het laatste open alternatief te proberen. Straks! 4

Dames op schaakbord Het acht koninginnenprobleem luidt als volgt: 1. Kun je 8 dames (koninginnen) op een 8 bij 8 schaakbord zetten zonder dat zij elkaar aanvallen ( = in één keer kunnen slaan)? 2. Zo ja, op hoeveel verschillende manieren kan dat? En nu algemeen: Op hoeveel manieren kun je n dames op een n bij n bord plaatsen zonder dat zij elkaar aanvallen? 5

Beweging van de dame Een dame kan in één zet een willekeurig aantal vakjes naar links, rechts, onder, boven of diagonaal schuiven. 6

Oplossing Een oplossing is onderstaande configuratie: dit correspondeert met de volgende permutatie: 1 5 8 6 3 7 2 4 7

Alle oplossingen Op het 8 8 schaakbord zijn er 92 oplossingen. In essentie zijn er 12 verschillende oplossingen, waaruit je door draaien en spiegelen (8 mogelijkheden) ze allemaal kunt maken. Er is één wat meer symmetrische oplossing. 8

Aantallen oplossingen n aantal echt aantal n! 1 1 1 1 2 0 0 2 3 0 0 6 4 2 1 24 5 10 2 120 6 4 1 720 7 40 6 5040 8 92 12 40.320 9 352 46 362.880 10 724 92 3.628.800 11 2680 341 39.916.800 12 14.200 1787 479.001.600 13 73.712 9233 14 365.596 9

W. Ahrens, 1910 W. Ahrens, 1910 10

Exhaustive search Een brute force (exhaustive search) aanpak: Genereer alle mogelijke configuraties van n dames op een n bij n bord, en controleer van elk daarvan of de dames elkaar al dan niet aanvallen. Het aantal te controleren kandidaatoplossingen is hier exponentieel: - n n onder de aanname: één dame per rij - n! onder de aanname: één dame per rij en één per kolom; dit zijn gewoon alle permutaties van 1 t/m n 11

Backtracking (nogmaals) Basisidee backtracking bouw een oplossing stap voor stap op en controleer steeds of de deeloplossing in conflict komt met de restricties (en nog wel tot een oplossing kan leiden) op elk moment kun je kiezen uit een aantal mogelijke vervolgstappen; maak een keuze en ga langs die weg verder met het opbouwen van de oplossing als een keuze op niets uitloopt, herzie je deze keuze en probeer je een andere mogelijkheid Vergelijk het vinden van de uitgang in een doolhof: loop steeds verder en als je bij het zoeken vastloopt, ga terug op je pad om het laatste open alternatief te proberen. Straks! 12

Backtracking dames Backtracking versus exhaustive search Exhaustive search bekijkt alle volledige kandidaatoplossingen. Dat zijn hier alle permutaties van 1 t/m n. Backtracking controleert telkens van deeloplossingen of ze nog aan de eisen/restricties voldoen; zo niet, dan weet je zeker dat alle uitbreidingen van deze deeloplossing ook niet voldoen, dus die hoef je dan niet meer expliciet te bekijken. Soms spaar je zo heel veel uit. Voorbeeld: Alle (n 2)! kandidaatoplossingen met de eerste twee dames op de aangegeven posities behoeven niet verder onderzocht te worden! 13

Dames n = 4 14

Oplossingen dames: n = 4 1 2 3 4 1 2 3 4 oplossing 1 oplossing 2 42

Backtracking: dames Alle oplossingen voor het n bij n bord kunnen we vinden met behulp van backtracking. plaats de dames een voor een probeer de dame in alle kolommen: - als ze geplaatst kan worden, ga dan op dezelfde manier verder met de volgende dame - zo niet: probeer haar in de volgende kolom (keuze herzien) als ze nergens geplaatst kan worden, verschuif dan de vorige dame: eerdere keuze herzien! Als de rij-de dame in alle n kolommen is geprobeerd, wordt de dame uit de vorige rij herzien, dus een plek naar rechts gezet, etc,... Bij de recursieve oplossing wordt automatisch een niveau teruggesprongen, bij de iteratieve oplossing moeten we dit zelf expliciet doen. 43

Zetdames recursief void zetdames (int n, int rij, int stand[], int & aantal) { // probeert de rij-de dame neer te zetten; de eerste rij-1 // dames staan al goed: backtracking met recursie int kolom; if (rij == n+1) { drukaf (n, stand); // druk goede stand af aantal++; // en tel het aantal goede standen } // if else for (kolom = 1; kolom <= n; kolom++) { stand[rij] = kolom; if (geenaanval (rij, stand)) zetdames (n, rij+1, stand, aantal); } // for } // zetdames 44

Het hele programma #include <iostream> using namespace std; const int MAX = 20; bool geenaanval (int rij, int stand[ ]) { bool veilig = true; int hulprij = 1; while ( veilig && ( hulprij < rij ) ) { veilig = ( ( stand[rij]!= stand[hulprij] ) && ( stand[rij] - stand[hulprij]!= rij - hulprij ) && ( stand[rij] - stand[hulprij]!= hulprij - rij) ); hulprij++; } //while return veilig; } //geenaanval void drukaf (int n, int stand[ ]) { for (int i = 1; i <= n; i++) cout << stand[i] << " "; cout << endl; } //drukaf void zetdames(int n, int rij, int stand[ ], int & aantal) int kolom; if ( rij == n + 1 ) { drukaf (n, stand); aantal++; } //if else for ( kolom = 1; kolom <= n; kolom++ ) { stand[rij] = kolom; if ( geenaanval (rij, stand) ) zetdames( n, rij+1, stand, aantal ); } //for } //zetdames int main ( ) { int stand[max]; int grootte; int teller = 0; do { cout << "Grootte schaakbord ( < " << MAX << " ).. "; cin >> grootte; } while ( grootte < 1 grootte >= MAX ); zetdames( grootte, 1, stand, teller ); cout << endl << "Aantal: " << teller << endl << endl; return 0; } //main 45

Zetdames iteratief Het kan natuurlijk ook niet-recursief: void zetdames (int n) { // niet recursief int stand[max]; int rij = 1; stand[1] = 0; // zet eerste dame klaar while ( rij > 0 ) { stand[rij]++; // volgende kolom while ( ( stand[rij] <= n ) && (! geenaanval( rij, stand ) ) ) stand[rij]++; // eerste de beste goede kolom if ( stand[rij] <= n ) if ( rij == n ) // n-de dame gezet drukaf (n, stand); else { // nog niet alle dames gezet rij++; stand[rij] = 0; } else // alle kolommen van een rij geprobeerd rij--; // vorige dame herzien } // while } // zetdames 46

State-space tree dames * 1 x 2 x 1 x 2 x 3 x * * * 1 x 2 x 3 x 4 x * * 1 x 3 x 4 x * * 1 x 2 x 3 x 4 x * * * 1 x 2 x * * * * * * * oplossing x: deeloplossing niet verder uitbreiden, keuze herzien 47

State-space Om de werking van backtracking te beschrijven kunnen we een statespace tree (toestand-actie-boom) gebruiken. - speciaal soort toestandsruimte - toestand (=knoop) deeloplossing; actie (=tak) keuze uitbreiding deeloplossing - blad (kandidaat)oplossing - pad van wortel naar blad stap-voor-stap-constructie van (kandidaat)oplossing Exhaustive search (met stap-voor-stap-constructie van kandidaatoplossingen) doorloopt de hele boom en evalueert alle bladeren. Backtracking stopt met het doorlopen van een subboom bij een knoop als de betreffende knoop nooit tot een oplossing kan leiden (en backtrackt dan naar de ouder van die knoop om van daaruit verder te zoeken). 48

State-space tree -1- veelbelovend wordt niets: snoeien! kandidaatoplossingen geen oplossing oplossing Exhaustive search: de hele boom wordt bekeken (tot een goede oplossing is gevonden) Backtracking: hele subbomen kunnen soms worden gesnoeid 49

State-space tree -2- Backtracking doorzoekt de state-space tree via depth first search. Als het meezit wordt er flink gesnoeid. 50

Volledige toestandsruimte De volledige toestandsruimte (state space) is exponentieel: - 1 begintoestand (leeg bord) - n! eindtoestanden (n dames geplaatst)(*) - n + n (n 1) + n (n 1) (n 2) +... + n (n 1)... 2 tussengelegen toestanden (de eerste zoveel dames geplaatst)(*) Backtracking zal voor grote probleeminstanties toch exponentieel zijn. (*) We bekijken alleen toestanden met hooguit één dame per rij en hooguit één per kolom. 51

Paardensprong Vraag: Hoeveel verschillende series van m n 1 sprongen van het paard zijn er op een m bij n bord, zodat elk veld precies één keer bezocht wordt? 1 14 17 20 11 8 5 16 19 12 3 6 21 10 13 2 15 18 9 4 7 beweging van het paard een oplossing op het 3 bij 7 bord 52

Backtracking vs ES Backtracking versus exhaustive search Exhaustive search bekijkt alle volledige kandidaatoplossingen. Backtracking controleert telkens van deeloplossingen of ze nog aan de eisen/restricties voldoen; zo niet, dan weet je zeker dat alle uitbreidingen van deze oplossing ook niet voldoen, dus die hoef je dan niet meer expliciet te bekijken. Voorbeeld Gegeven de rij A = 3, 1, 4, 1, 5, 9, 2, 6, 5, 7. Gevraagd: de/een langste stijgende deelrij (met volgorde der elementen als in A zelf). 53

Langste stijgende deelrij Exhaustive search. Genereer alle 2 10 deelrijtjes van A en controleer van elk daarvan of hij stijgend is en bepaal wat de langste deelrij is. Backtracking. Bouw de deelrijtjes stap voor stap op (hoe?) en controleer na elke stap of het deelrijtje nog wel stijgend is. Zo niet, dan hoeft het rijtje niet meer uitgebreid te worden (het kan toch niets worden). Houd de lengte van het deelrijtje bij en vergelijk die met de lengte van de tot dusver gevonden langste deelrij. Deze methode kan erg veel werk uitsparen. Bijvoorbeeld het deelrijtje 3, 1 is al niet stijgend, dus alle 2 8 deelrijtjes van A die met 3, 1 beginnen zeker ook niet. Deze hoeven bij backtracking dus niet allemaal te worden gegenereerd. 54

Backtracking Basisidee backtracking bouw een oplossing stap voor stap op en controleer steeds of de deeloplossing in conflict komt met de restricties (en nog wel tot een oplossing kan leiden) op elk moment kun je kiezen uit een aantal mogelijke vervolgstappen; maak een keuze en ga langs die weg verder met het opbouwen van de oplossing als een keuze op niets uitloopt, herzie je deze keuze en probeer je een andere mogelijkheid Vergelijk het vinden van de uitgang in een doolhof: loop steeds verder en als je bij het zoeken vastloopt, ga terug op je pad om het laatste open alternatief te proberen. Straks! 55

Permutaties Genereer alle permutaties van 1 t/m n met backtracking. void permutaties( int n, int perm[ ], int hierzo ) { int i; if ( hierzo == n + 1 ) drukaf( perm, n ); // permutatie gevonden else { for ( i = 1; i <= n; i++ ) { perm[hierzo] = i; if (! aanwezig( perm, i, hierzo ) ) // test of i // al in perm[1] t/m perm[hierzo-1] voorkomt permutaties( n, perm, hierzo + 1 ); } // for } // else } // permutaties Vraag: wat heeft dit met torens op een schaakbord te maken? 56

Hamiltonkring Definitie: Een Hamiltonkring in een (ongerichte) graaf is een kring die elke knoop precies één keer aandoet. Voorbeeld: a b f e c d a is een Hamiltonkring in nevenstaande graaf, echter a b c d e f a is geen Hamiltonkring. a d c b e f Probleem: vind een Hamiltonkring in een gegeven ongerichte graaf. 57

HC: backtracking Exhaustive search: genereer alle (n 1)! kandidaatoplossingen (permutaties van de knopen) en controleer daarna van elk of het een Hamiltonkring voorstelt. Backtracking: genereer de mogelijke Hamiltonkringen stap voor stap en controleer tijdens de constructie al of de deeloplossing wel aan de restricties voldoet. Kies in elke uitbreidingsstap steeds de eerstvolgende buurknoop (in een of andere volgorde) en controleer hiervan of deze nog niet geweest is in het reeds geconstrueerde deelpad. Blijkt die keuze toch (hier of verderop in de constructie) op niets uit te lopen, kies dan de volgende buurknoop. Als er geen buurknopen meer zijn kan het deelpad blijkbaar niet meer uitgebreid worden en moet je je vorige keuze herzien. hier: tak voor tak of knoop voor knoop alle knopen verschillend; tak tussen opeenvolgende knopen 58

State space tree HC Een beschrijving van de werking van het backtrackingalgoritme voor het vinden van een Hamiltonkring in de voorbeeldgraaf wordt gegeven door de volgende state space tree: a d c b e f a d c e b f c e d. breid het pad telkens met één knoop uit (hier: keuzes in alfabetische volgorde). uitbreidingen met knopen die al eerder voorkwamen in het pad zijn niet weergegeven e f d f c d d. in de knopen met een rood kruis backtrackt het algoritme zodra blijkt dat die niet tot een oplossing leiden a 59

Handelsreizigersprobleem Traveling Salesman Problem (handelsreizigersprobleem) Gegeven n steden waarvan alle onderlinge afstanden bekend zijn. Gevraagd: de/een kortste route die elke stad precies één keer aandoet, en weer terugkeert in het vertrekpunt. Ofwel: vind de/een kortste Hamiltonkring in een samenhangende gewogen (complete) graaf. Voorbeeld: a 2 b minimale route: a b d c (ofwel a b d c a) (of a c d b (ofwel a c d b a)) 5 c 8 7 1 d 3 60

TSP met backtracking Merk op: elke permutatie van de knopen is een Hamiltonkring, dus: - genereer alle permutaties van de knopen (beginnend bij knoop a) stap voor stap, door deelpermutaties (= beginstuk Hamiltonkring) verstandig uit te breiden: - houd de tot dusver gevonden minimale lengte min bij - controleer of de lengte van de deelpermutatie kleiner is dan min - zo ja, ga dan op dezelfde manier door met uitbreiden - zo nee, dan heeft het geen zin om door te gaan, dus herzie je meest recente keuze 61

Subset-Sum Probleem: Gegeven een verzameling S = {s 1,s 2,...s n } van positieve (> 0) gehele getallen en een geheel getal d. Laat S oplopend gesorteerd zijn. Vind een deelverzameling (of alle deelverzamelingen) van S waarvan de som der getallen gelijk is aan d. Voorbeelden: S = {1,2,5,6,8} en d = 9. Er zijn twee oplossingen, namelijk {1,2,6} en {1,8}. S = {3,5,6,7} en d = 15. Er is één oplossing: {3,5,7}. Exhaustive search: genereer alle 2 n deelverzamelingen van S en controleer of hun som gelijk is aan d. 62

Backtracking SsS De stap-voor-stap constructie van deeloplossingen doen we (bijvoorbeeld) zo: gegeven een deeloplossing (= een veelbelovende deelverzameling van {s 1,s 2,...,s i }), dan zijn er twee mogelijke vervolgstappen: óf s i+1 wordt toegevoegd, óf s i+1 wordt niet toegevoegd. Backtracking bekijkt zo ook alle deelverzamelingen, maar hoeft ze niet allemaal volledig te genereren. Een (veelbelovende) deelverzameling van {s 1,s 2,...,s i } met som s hoeft niet verder uitgebreid te worden als s + s i+1 > d (*), of als s +Σ n j=i+1 s j < d. Opmerking: Als (*) geldt levert elke uitbreiding, met welke s j (j i+1) dan ook een te grote totaalsom op. Dus herzie je vorige keuze. Hier is gebruikt dat S oplopend gesorteerd is. 63

State-space tree SsS Volledige state-space tree bij toepassing van backtracking op probleeminstantie S = {3,5,6,7} en d = 15 (waarbij alle oplossingen gezocht worden). De knopen stellen deeloplossingen voor. Het getal in een knoop is de som van de s j uit de corresponderende deelverzameling. De ongelijkheid onder een blad geeft aan waarom daar backtracking plaatsvindt. 64

Knapzakprobleem Knapzakprobleem Gegeven n objecten, met gewicht w 1,...,w n en waarde v 1,...,v n, en een knapzak met capaciteit W. Gevraagd: de meest waardevolle deelverzameling der objecten die in de knapzak past (dus met totaalgewicht W). Voorbeeld: object gewicht waarde 1 8 42 2 3 14 3 4 40 4 5 27 knapzakcapaciteit 12 65

KZP met backtracking - genereer de deelverzamelingen stap voor stap, bijvoorbeeld door steeds aan een goede deelverzameling van de objecten 1 t/m i achtereenvolgens object i+1 of i+2 of n toe te voegen (mogelijke keuzes) - controleer of het totaalgewicht van de aldus uitgebreide verzameling nog steeds W is - zo nee, herzie dan je keuze (en probeer het volgende object) - zo ja, ga dan op dezelfde manier verder - houd ook de totaalwaarde van de (deel)verzamelingen bij en de tot dusver gevonden maximale waarde 66

Doolhof Gegeven een rechthoekig doolhof. Gevraagd wordt een pad van Start naar Eind, waarbij alleen horizontaal en verticaal gelopen mag worden. XXXXXXXXXXXX X X X X XXX XX XXX X X X X XX XXXXXXX XX X XXXX X S XXX XX X X X X X X XXXXXXXXEXXX XXXXXXXXXXXX ***X X X X*X*XXX XX XXX*X*X***OX X***X***X*XX X*XXXXXXX*XX X******X**OX XXXXOX*X*XOX S**XXX*X*XOX XX*****X*XOX X X XOX*XOX XXXXXXXXEXXX 67

Backtracking en doolhof bool dwaal(int x, int y) { // is er een pad van (x,y) naar (x_eind,y_eind)? int richting, x_volgende, y_volgende; if ( ( x == x_eind ) && ( y == y_eind ) ) { // gevonden! doolhof[x][y] = * ; return true; } else if ( doolhof[x][y]!= ) // geen vrije plek return false; else { doolhof[x][y] =? ; // tijdelijk markeren; voorkomt oneindig loopen for ( richting = OOST; richting <= NOORD; richting++ ) { x_volgende = volgende_x(x,richting); y_volgende = volgende_y(y,richting); if ( dwaal(x_volgende,y_volgende) ) { doolhof[x][y] = * ; return true; } } doolhof[x][y] = O ; // afgehandeld: return false; // geen rechtstreeks pad via deze (x,y) } } 68

Algemeen Laten oplossingen van een bepaald probleem van de vorm (X[1],X[2],...,X[m]) zijn en zij S i de verzameling waarden die X[i] kan aannemen. De algemene vorm van een backtracking algoritme is dan: backtrack(x[1 i]):: // X[1 i] is een veelbelovende deeloplossing, consistent met // de restricties; we zoeken alle oplossingen if X[1 i] is een oplossing then print(x[1 i]); else for elke x S i+1 consistent met X[1 i] en de restricties do X[i+1] := x; backtrack(x[1 i+1]); od fi 69

Algoritmiek 2017/Verdeel en Heers Verdeel en Heers 70

Algoritmiek 2017/Verdeel en Heers Verdeel en heers 1 Divide and Conquer 1. Verdeel een instantie van het probleem in twee (of meer) kleinere instanties 2. Los de kleinere instanties op: meestal recursief 3. Combineer deze twee (of meer) oplossingen tot een oplossing van de oorspronkelijke (grotere) instantie Opmerking: meestal wordt een probleeminstantie in twee ongeveer gelijke delen verdeeld. 71

Algoritmiek 2017/Verdeel en Heers Schematisch (1) Verdeel en heers (vaak: verdeel in twee gelijke delen) 72

Algoritmiek 2017/Verdeel en Heers Sorteren Verdeel en heers en sorteren: Sorteer(rij):: if ( de rij heeft meer dan één element ) then Verdeel de rij in twee stukken: linkerrij en rechterrij; Sorteer(linkerrij); Sorteer(rechterrij); Combineer linkerrij en rechterrij; fi. 73

Algoritmiek 2017/Verdeel en Heers Merge, Quick, Insertion Divide and conquer Mergesort 0 n n 1 2 1 n 2 p p p 0 s n 1 Quicksort Decrease and conquer (decrease by one) 0 n 2 Insertion sort 74

Algoritmiek 2017/Verdeel en Heers Mergesort Mergesort(A[0 n 1]):: // sorteert het array A[0..n 1] recursief // uitvoer: A[0..n 1] oplopend gesorteerd if n > 1 copieer(a[0 n 2 1],B[0 n 2 1]); copieer(a[ n 2 n 1],C[0 n 2 1]); Mergesort(B[0 n 2 1]); Mergesort(C[0 n 2 1]); Merge(B, C, A); fi. 75

Algoritmiek 2017/Verdeel en Heers Merge Merge(B[0 p 1],C[0 q 1],A[0 p+q 1]) :: // voegt 2 gesorteerde arrays B en C samen tot 1 gesorteerd array A i,j,k := 0; // voeg samen totdat een van de twee op is: ritsen while i < p and j < q do if B[i] C[j] then A[k] := B[i];k := k +1;i := i+1; else A[k] := C[j];k := k +1;j := j +1; od // en de rest if i = p then copieer C[j q 1] naar A[k p+q 1]; else copieer B[i p 1] naar A[k p+q 1]; fi. 76

Algoritmiek 2017/Verdeel en Heers Complexiteit Mergesort: - worst case complexiteit: Θ(n log n) - extra geheugen: O(n) 77

Algoritmiek 2017/Verdeel en Heers (Werk)college Lezen/leren bij dit college: Paragraaf 12 inl., 12.1, 5 inl., 5.1 Werkcollege backtracking vanmiddag, 13.45 15.30, in deze zaal Opgaven: zie http://www.liacs.leidenuniv.nl/~vlietrvan1/algoritmiek/ Programmeeropdracht 2... Volgend college: 23/24 maart 2017 78

Algoritmiek 2017/Verdeel en Heers Reclame https://www.universiteitleiden.nl/en/news/2017/03/coding-contest-for-allhttps://contest.catalysts.cc/en/ https://contest.catalysts.cc/en/ccc/the-challenges-of-our-contests/ Wijnhaven, Den Haag, 13.00 19.00 79