Fundamenten voor de Informatica

Maat: px
Weergave met pagina beginnen:

Download "Fundamenten voor de Informatica"

Transcriptie

1 Fundamenten voor de Informatica Bachelor Informatica Aanvullende Opleiding Informatica Academiejaar K. Dekimpe K.U.Leuven Campus Kortrijk B. Demoen K.U.Leuven Dep. Computerwetenschappen

2 Inhoudsopgave Inleiding op complexiteit 3 Talen en eindige automaten Talen Reguliere expressies en talen Eindige automaten en reguliere talen Niet deterministische eindige automaten Turing machines Wat is een Turing machine Turing machines en functies Analyse van algoritmen Tijdscomplexiteit van algoritmen Het bepalen van de complexiteit in enkele concrete voorbeelden De klassen P en NP Turing machines, talen en de klasse P Niet deterministische Turing machines en de klasse NP De klasse NP Compleet Besluit Referenties Oefeningen Grafentheorie 58 Inleiding De drie munten De wolf, de geit en de kool De bruggen van Königsberg Het speelgoed van Hamilton Grafen Allerhande paden Voorstelling van grafen Isomorfisme van grafen Gewogen grafen Vlakke grafen Het kleuren van grafen Bomen Inleiding i

3 3.2 Eigenschappen van bomen Een meer compacte voorstelling voor bomen Opspannende bomen Minimale opspannende bomen Doorlopen van bomen Spelbomen Netwerkmodellen en Petri-netten Transportnetwerk Maximale stroming Matching Petrinetten Referenties Oefeningen Vastepuntstheorie 4 Inleiding Orderelaties Basisbegrippen Monotone en continue afbeeldingen De stellingen van Tarski en Kleene De stelling van Tarski De stelling van Kleene Voorbeeld: de transitieve sluiting van een relatie Referenties Oefeningen ii

4 Hoofdstuk Inleiding op complexiteit Talen en eindige automaten. Talen Bij het horen van het woord taal, denken we in eerste instantie aan talen zoals het Nederlands, het Engels,... Maar er zijn ook andere talen zoals programmeertalen, de propositielogicataal,... Alle talen hebben echter het gemeenschappelijk kenmerk dat ze zijn opgebouwd uit woorden en zinnen over een gegeven alfabet. Dit alfabet kan sterk variëren alnaargelang de taal (denk maar aan het Arabisch, het Chinees,...). In dit hoofdstuk werken we met een formele notie van taal. Vooraleer we het concept van een taal kunnen definiëren, hebben we nood aan een beschrijving van wat we bedoelen met een alfabet en een string. Definitie.. Strings over een alfabet Een alfabet is een niet-lege eindige verzameling Σ. De elementen van Σ worden symbolen genoemd. Een string over Σ is een eindige rij symbolen σ σ 2 σ n, waarbij elke σ i Σ. De lengte van een string is het aantal (al dan niet verschillende) symbolen dat gebruikt wordt om de string op te bouwen. Er is bovendien één string van lengte, de lege string, die we met λ zullen aanduiden. De verzameling van alle strings over een alfabet Σ duiden we aan met Σ Voorbeeld Neem als alfabet Σ = {a,b,c,...,z}. Dan zijn aaaabbz string ditisgeenstring λ voorbeelden van strings (respectievelijk van lengte 7, 6, 5 en ) over het alfabet Σ. Daarentegen zijn String ditisweleenstring! geen strings over Σ. 3

5 Voorbeeld Neem Σ = {,}. Dan bestaan er 8 strings van lengte 3 over Σ, namelijk We merken op dat voor een gegeven lengte n er steeds maar eindig veel strings van lengte n bestaan over een gegeven alfabet Σ (omdat we Σ eindig veronderstellen). Toch dit is de verzameling van alle strings Σ steeds oneindig. Net zoals het Nederlands bestaat uit welbepaalde strings over het alfabet Σ = {a,b,...,z}, die we woorden noemen, zal een formele taal bestaan uit een aantal gegeven strings. Definitie..2 Een taal Een taal over een alfabet Σ is een deelverzameling L Σ. Werkelijk elke deelverzameling van strings over een gegeven alfabet is een taal. Zo bestaat over elk alfabet Σ de lege taal L = Σ en de taal van alle mogelijke strings L = Σ. Voorbeeld Neem Σ = {,}. Dan kunnen we de volgende talen over Σ beschouwen:. L = 2. L 2 = Σ = {λ,,,,,,,,,,,,,,,...} 3. L 3 = {,,,,,...} 4. L 4 = {λ,,,,,,...} 5. L 5 = {,,} 6. L 6 is de taal die bestaat uit alle strings die beginnen met het symbool en die de binaire schrijfwijze voorstellen van een priemgetal. Dus L 6 = {,,,,,...} Alle voorbeelden van talen die we hierboven gegeven hebben zijn interessant omdat ze de eigenschap hebben dat we in elk van de gevallen door middel van een algoritme kunnen nagaan of een gegeven string uit Σ al dan niet tot de taal behoort. Met een algoritme bedoelen we een oplossingsmethode (berekeningsprocedure of berekeningsvoorschrift) bestaande uit een eindige opeenvolging van instructies, die elk op precies één wijze uit te voeren zijn, 4

6 en die steeds eindigt. Voor de talen L en L 2 is het algoritme heel eenvoudig (geen enkele string behoort tot L en elke string behoort tot L 2, in beide gevallen dient er niets gecontroleerd te worden). Ook voor taal L 5 is het eenvoudig te controleren of een string al dan niet tot de taal behoort. We hoeven enkel maar te controleren of een gegeven string al dan niet gelijk is aan één van de drie strings die tot onze taal behoren. Bij taal L 3 is het voor ons op het zicht duidelijk of een gegeven string al dan niet tot de taal behoort. Dit wordt echter reeds iets moeilijker bij taal L 4. Om bijvoorbeeld na te gaan of L 4? moeten we op een of andere manier het aantal nullen en het aantal enen werkelijk tellen of op zijn minst met elkaar vergelijken. Nog moeilijker, maar nog steeds mogelijk, wordt het om na te gaan of een gegeven string al dan niet behoort tot L 6. In hetgeen volgt zullen we proberen om aan dit intuïtieve verschil in moeilijkheidgraads iets meer preciese inhoud te geven. Vooraleer we echter daarop ingaan, zullen we eerst kennis maken met een bepaald mechanisme om sommige talen beter te omschrijven..2 Reguliere expressies en talen Indien we een alfabet Σ vast kiezen, dan kunnen we de volgende bewerkingen uitvoeren op de strings uit Σ : De concatenatie of samenstelling. Indien x = σ σ 2 σ n Σ en y = µ µ 2 µ m Σ dan is hun samenstelling xy = σ σ 2 σ n µ µ 2 µ m Σ Voorbeeld Neem Σ = {a,b,c,d}, x = abba en y = abcd dan is xy = abbaabcd. In het bijzonder hebben we ook voor elke x Σ dat Voor x Σ definiëren we x = λ n N : x n+ = xx n λx = xλ = x en λλ = λ. Voorbeeld Indien x = abb is x 3 = abbabbabb. Met x bedoelen we geen of meer kopieën van x. Met andere woorden, een element uit {x n n N}. 5

7 Met x + bedoelen we één of meer kopieën van x. Met andere woorden, een element uit {x n n N }. Voorbeeld De taal L 4 = {λ,,,,...} op het alfabet Σ kunnen we nu ook beschrijven als L 4 = { n n n N}. We kunnen nu dezelfde bewerkingen uitbreiden tot talen. Zij A,B Σ, dan is AB = {ab a A,b B} A = {λ} n N : A n+ = AA n A = A A A 2 A 3 = A n. n= A wordt de Kleenesluiting van A genoemd A + = A A 2 A 3 = A n n= Voorbeeld Neem Σ = {a,b,c,...,z} en A = {m,h,sp}, B = {eer,aar}, C = {p,pe} en D = {r,er}, dan is AB = {meer, maar, heer, haar, speer, spaar} CD = {pr, per, peer} en DC = {rp, erp, rpe, erpe} Definitie.2. Reguliere Taal Indien Σ een alfabet is, dan wordt de klasse van alle reguliere talen R over Σ inductief als volgt gedefinieerd:. R, {λ} R en σ Σ : {σ} R. 2. Indien A,B R dan ook (A) R, AB R, A B R en A R Elke taal uit R wordt een reguliere taal genoemd. Met andere woorden: een taal L Σ is een reguliere taal als en slecht als ze kan opgebouwd worden vanuit, {λ} en {σ} ( σ Σ) door een eindig aantal keer de bewerkingen concatenatie, en... te gebruiken. De term (A) met haakjes kan gebruikt worden om duidelijkheid te scheppen in de volgorde van de bewerkingen. Zo is bijvoorbeeld in het algemeen A (BC) (A B)C. We spreken de volgende bindingsregels af: 6

8 Eerst worden de expressies binnen haakjes geëvalueerd, daarna de Kleenesluitingen, gevolgd door de concatenaties en tenslotte de unies. Met deze regels weten we bijvoorbeeld dat A BC = A (B(C )). Voorbeeld De taal L 3 = {,,,,,...} op Σ = {,} is een reguliere taal, want. {} en {} zijn reguliere talen. 2. {} is een reguliere taal 3. {}{} is een reguliere taal 4. L 3 = {}{} {} is een reguliere taal. Volledig gelijklopend aan de constructie van reguliere talen, bestaat er ook zoiets als de constructie van reguliere expressies. Een reguliere expressie bestaat uit een abstract patroon dat een beschrijving van welbepaalde strings op een gegeven alfabet weergeeft. Dergelijke expressies (en uitbreidingen daarvan) worden vooral binnen UNIXomgevingen (bv. met behulp van een Perl-script of met behulp van grep en egrep,...) vaak gebruik om in grotere ASCII-bestanden te zoeken naar het voorkomen van bepaalde patronen en om bij het vinden van dergelijke patronen de nodige acties uit te voeren. Het meest eenvoudige voorbeeld van een reguliere expressie op een gegeven alfabet Σ is één specifieke string uit Σ. Voorbeeld Veronderstel dat Σ de verzameling van ASCII symbolen is, dan zijn de volgende strings reguliere expressies: 23 Hallo! Dag mevrouw. Deze eerste soort van reguliere expressies zijn natuurlijk enkel nuttig indien een heel specifieke uitdrukking gekend is en gezocht dient te worden. Een reguliere expressie wordt krachtiger en nuttiger indien we meer variabele strings kunnen aanduiden. Met behulp van het -symbool kunnen we aangegeven dat het onmiddellijk voorgaande symbool nul of meerdere keren mag voorkomen. Voorbeeld Met de reguliere expressie ab c duiden we alle strings aan bestaande uit een a, eventueel gevolgd door een aantal keer het symbool b en tenslotte een c, zoals Bij implementaties van dergelijke reguliere expressies zijn er vaak meer mogelijkheden voorzien dan die expressies die wij hier behandelen. 7

9 ac abbbbbbbbbbbc Maar niet abbbbbbbbb We kunnen ook gebruik maken van haakjes om bepaalde deelexpressies nul of meerdere keren te laten voorkomen. Zo komt met de reguliere expressie b(ab) c elke string overeen bestaande uit een b, dan een aantal keer ab en tenslotte gevolgd door een c, zoals bc bababababababc maar niet bac Tot slot is er ook nog een mechanisme dat alternatieven weergeeft. We kunnen namelijk in een reguliere expressie de notatie a b gebruiken om aan te geven dat op die plaats een a of een b moet voorkomen. Voorbeeld Met de reguliere expressie d(i a)t komen precies de strings dit en dat overeen. Ook bij mogen we gebruik maken van haakjes, zo staat w((ie) (at)) voor de strings wie of wat. Tenslotte kunnen we en combineren. Zo komen met de reguliere expressie d(a i) t alle strings overeen bestaande uit een d gevolgd door nul of meerdere keren de letters a of i en ten slotte een t, zoals de string daiiiat. Net als bij reguliere talen is het belangrijk om de bindingsvolgorde van de geziene operaties af te spreken: Deelexpressies tussen haakjes worden het eerst geëvalueerd, dan heeft de -operator de grootste voorrang, gevolgd door concatenatie en tenslotte het alternatief. Zo kunnen we w((ie) (at)) evengoed schrijven als w(ie at). Voorbeeld reguliere expressie Verzameling van overeenkomstige strings ab c a(b c) (ab) c {ab n n N} {c} = {a, ab, abb, abbb, abbbb,..., c} {ab n n N} {ac} = {a, ab, abb, abbb, abbbb,..., ac} {(ab) n n N} {c} = {λ, ab, abab, abab, ababab, abababab,..., c} 8

10 Na deze voorbeelden is het de hoogste tijd om een formele beschrijving van een reguliere expressie te geven. Definitie.2.2 Reguliere expressie Indien Σ een alfabet is, dan wordt een reguliere expressie over Σ op inductieve wijze als volgt gedefinieerd:. is een reguliere expressie 2. λ is een reguliere expressie 3. Voor elke σ Σ is σ een reguliere espressie 4. Indien A en B reguliere expressies zijn, dan zijn ook (A), A, A B en AB reguliere expressies. Zoals hierboven aangegeven bepaalt elke reguliere expressie ω een verzameling van strings uit Σ. Deze taal wordt de reguliere verzameling bepaald door ω genoemd. Door de analogie met de opbouw van de reguliere talen komt de volgende eigenschap (waarvan we het formele bewijs achterwege laten) wellicht niet als een verrassing. Stelling.2.3 Voor een gegeven alfabet Σ geldt dat de klasse van de reguliere talen op Σ precies samenvalt met de klasse van de reguliere verzamelingen. Voor elke reguliere taal L bestaat er bijgevolg een reguliere expressie ω, waarvan de bijhorende reguliere verzameling precies L is. Voorbeeld De reguliere taal L 3 = {}{} {} is precies de reguliere verzameling horende bij de reguliere expressie. Vooraleer we verder gaan, merken we hier op dat niet alle talen reguliere talen zullen zijn. We zullen bv. zien dat de taal L 4 = { n n n N} geen reguliere taal is..3 Eindige automaten en reguliere talen In de voorbij sectie hebben we kennis gemaakt met reguliere talen. Het blijkt dat er voor deze talen relatief eenvoudige algoritmes bestaan die nagaan of een welbepaalde string al dan niet tot de taal behoort of niet. Wat we precies bedoelen met relatief eenvoudig zal duidelijker worden naarmate dit hoofdstuk vordert. Vooreerst zullen we een heel eenvoudig computermodel, 9

11 dat van een eindige automaat, opstellen dat in staat zal blijken om deze algoritmes uit te voeren. Vooraleer een echte definitie te geven, starten we met een voorbeeld. Voorbeeld Beschouw het volgende diagramma: Start Indien we nu een willekeurige string uit {,} beshouwen, kunnen we het bovenstaande schema doorlopen gebruik makend van de gegeven string en de labels die bij de pijlen genoteerd staan. We illustreren hoe dit werkt op twee voorbeelden. Neem als eerste voorbeeld de string. We starten het schema bij de meest linkse cirkel. Omwille van de eerste van de string verplaatsen we ons naar de bovenste cirkel. De tweede uit de string zegt ons naar de rechter cirkel te gaan. Daarna doet de eerste nul ons naar de onderste cirkel gaan en de volgende nul en de laatste doen ons telkens terugkeren naar de onderste cirkel. Op het einde bevinden we ons dus in de onderste cirkel. Beschouw nu eens de string. We starten opnieuw zoals aangegeven in de meest linkse cirkel. Daar we als eerste symbool een zien, verplaatsen we ons naar de cirkel bovenaan. Het volgende symbool, een, laat ons ter plaatse blijven, evenals de volgende nul. Het laatste symbool daarentegen is een en volgens het label bij de pijl moeten we nu naar de meest rechtse cirkel gaan. We kunnen ditzelfde systeem nu herhalen voor alle mogelijke strings uit Σ (met Σ = {,}). Voor elke string zijn er nu twee mogelijkheden: ofwel eindigen we in de meest rechtse cirkel (met dubbele rand) ofwel eindigen we in een van de andere cirkels (met enkele rand). In het eerste geval zeggen we dat de string aanvaard werd, in het tweede geval zeggen we dat de string verworpen werd. Zodoende bepaalt dit schema een taal L, waarbij een string x Σ tot de taal behoort enkel en alleen als die string aanvaard wordt. Wanneer we het schema goed analyseren zien we dat in dit voorbeeld de taal L samenvalt met de reguliere taal L 3 uit de vorige voorbeelden. Een eindige automaat zal nu precies een computermodel zijn dat door een dergelijk schema kan worden voorgesteld. De basisingrediënten van een eindige automaat zijn een eindig aantal toestanden (in het schema voorgesteld door cirkels) waarin de machine zich kan bevinden en vanuit elke toestand overgangen afhankelijk van de invoer op dat moment.

12 Definitie.3. Eindige automaat Een eindige automaat is een 5-tal A = (Q,Σ,δ,q,F) waarbij Q een eindige verzameling is. We noemen de elementen van Q de toestanden van de automaat A. F Q is de verzameling van de aanvaardbare eindtoestanden. (De letter F is de eerste letter van het engelse Final). q Q, deze toestand wordt de begintoestand genoemd. Σ is een eindige verzameling, het alfabet van de automaat. δ is een afbeelding, de transitieafbeelding genoemd, δ : Q Σ Q. Een eindige automaat (in het Engels a finite automaton of meer precies a finite state automaton afgekort FSA) werkt als volgt: Bij de start bevindt de machine zich in de begintoestand q. Op het moment dat we zullen starten zal er ook steeds een invoerstring x = σ σ 2...σ n gegeven zijn (Het is mogelijk dat x de lege string λ is). Per tijdseenheid voert de machine één instructie uit. Om de eerste instructie uit te voeren berekent de automaat de waarde van δ(q,σ ). Deze waarde is opnieuw een toestand, zeg q i. Als tweede stap bepaalt de automaat dan q i2 = δ(q i,σ 2 ).... Als n-de en laatste stap berekent de machine tenslotte q in = δ(q in,σ n ) Na deze n-de en laatste stap zijn er nu twee mogelijkheden: ofwel behoort q in tot de aanvaardbare eindtoestanden F, ofwel niet. In het eerste geval zeggen we dat de automaat de string x aanvaardt, in het andere geval wordt de string verworpen. Voorbeeld We beschouwen een eindige automaat A = (Q,Σ,δ,q,F), met. Q = {E,O}, met begintoestand q = E. 2. F = {E} 3. Σ = {,}. 4. De afbeelding δ wordt gegeven door volgende tabel δ O O E E E O

13 De werking van de automaat op de string is als volgt:. Stap : de automaat berekent q i = δ(q,) = δ(e,) = O. 2. Stap 2: de automaat berekent q i2 = δ(q i,) = δ(o,) = E. 3. Stap 3: de automaat berekent q i3 = δ(q i2,) = δ(e,) = E. 4. Stap 4: de automaat berekent q i4 = δ(q i3,) = δ(e,) = O F. De invoerstring wordt verworpen. We kunnen voor elke eindige automaat, de transitieafbeelding δ voorstellen aan de hand van een tabel zoals hierboven. We kunnen echter net als in de inleiding een eindige automaat tezamen met zijn transitieafbeelding, ook schematisch voorstellen. We gebruiken daarvoor de volgende afspraken. Voor elke toestand uit Q tekenen we een cirkel. De toestanden die tot F behoren voorzien we van een dubbele rand. Eventueel schrijven we in de cirkel de naam van de toestand. De begintoestand q o wordt gekenmerkt door een inkomende pijl die niet benoemd is (of waar we start bijschrijven). om de transitieafbeelding weer te geven tekenen we pijlen. Indien δ(q, σ) = q zullen we een pijl tekenen van de cirkel die toestand q voorstelt, naar de cirkel die toestand q voorstelt en we geven het label σ aan deze pijl. Indien bovendien eveneens δ(q,µ) = q, dan tekenen we geen 2 pijlen, maar we geven die ene pijl twee (of meer indien nodig) labels. De automaat van daarnet kan voorgesteld wordt als volgt: E O Bij een automaat kan men de transitieafbeelding δ uitbreiden tot een afbeelding δ : Q Σ Q. Met andere woorden, het tweede argument kan nu niet enkel een symbool (dit is een string van lengte ) uit Σ zijn, maar een willekeurig string. De definitie van δ gebeurt inductief als volgt:. σ Σ, q Q : δ (q,σ) = δ(q,σ). (Op symbolen uit Σ valt δ samen met δ). 2. Indien x = σ σ 2... σ n Σ een string is van lengte n 2, definiëren we δ (q,x) = δ (q,σ σ 2... σ n ) = δ (δ(q,σ ),σ 2...σ n ). 2

14 3. Voor de volledigheid nemen we δ (q,λ) = q. De definitie van δ is zodanig gekozen dat indien we de automaat laten inwerken op de string x, de machine eindigt in toestand δ (q,x). Een string x wordt bijgevolg aanvaard door een eindige automaat A, als en slechts als δ (q,x) F. Definitie.3.2 Taal bepaald door een eindige automaat Indien A = (Q,Σ,δ,q,F) een eindige automaat is, noemen we L(A) = {x Σ δ (q,x) F } de taal bepaald door de eindige automaat A. Indien voor een gegeven taal L Σ geldt dat L = L(A) zeggen we dat A de taal L herkent. Voorbeeld Zij A de automaat van daarnet. Dan is de taal bepaald door A gelijk aan L(A) = {x {,} x bevat een even aantal -en} Inderdaad, telkens een gelezen wordt uit de invoerstring, verandert de machine haar toestand van O in E of omgekeerd, bij het lezen van een, verandert de toestand niet. Toestand O (resp. E) betekent dan ook tot nu toe een oneven (resp. even) aantal -en gelezen. Een string wordt dan aanvaard als de machine op het einde stopt in toestand E. Voorbeeld Neem de taal L op het alfabet Σ = {a, b} die bestaat uit alle strings waar achteraan minstens 2 keer het symbool b staat. We construeren een eindige automaat die deze taal L herkent. Een dergelijke automaat kan als volgt werken: We moeten de invoerstring doorlopen van links naar rechts. Op elk moment proberen we te onthouden of we, tot op de plaats waar we op dat moment zitten, met een staart van, of minstens 2 b s zitten. Bij het doorlopen van de invoerstring abbbabb moeten we bijvoorbeeld het volgende onthouden: a b b b a b b onthouden Nu is het zo dat een eindige automaat niet echt over een geheugen beschikt. De enige manier waarop een eindige automaat iets kan onthouden is door gebruik te maken van zijn eindig aantal toestanden. We voorzien dan ook in onze automaat toestanden q, q en q 2 om respectievelijk, en 2 te onthouden. Een automaat A = (Q,Σ,δ,q,F) die de taal L herkent wordt schematisch weergegeven als 3

15 a b b q q q2 a a b Merk op dat de taal L = {a,b} {bb} een reguliere taal is. Dit is geen toeval. Het namelijk zo dat een taal die beslist wordt door een eindige automaat steeds een reguliere taal is en omgekeerd, voor elke reguliere taal bestaat er een eindige automaat die deze taal herkent. We hebben dus de volgende eigenschap die we hier formuleren zonder bewijs. Stelling.3.3 De klasse van talen die herkend worden door een eindige automaat valt precies samen met de klasse van de reguliere talen. Tot slot van deze sectie geven we nog een voorbeeld van een niet reguliere taal. Bewering: De taal L = { n n n N} is geen reguliere taal. We kunnen dit verklaren door aan te geven dat er geen eindige automaat bestaat die deze taal herkent. We maken hiervoor een redenering vanuit het ongerijmde. Stel dat er een eindige automaat A = (Q,Σ,δ,q,F) bestaat die de taal herkent, en onderstel dat het aantal toestanden in Q gelijk is aan n +. We kunnen zonder verlies van algemeenheid aannemen dat de toestanden gegeven worden als Q = {q,q,...,q n }. Neem nu de string x = n+2 n+2 L. Aangezien deze string tot L behoort zal de machine na het verwerken van deze string stoppen in een aanvaardbare eindtoestand. We kunnen het verloop van de verwerking van deze machine weergeven in een tabel: gelezen symbool nieuwe toestand q q i q i2... q ip... q ir... q in+ q in+2 q in+3... q in+3 }{{} F Deze tabel geeft onder andere weer dat δ(q ij,) = q ij+, voor j n. Aangezien er slechts n + toestanden zijn, moeten er p en r bestaan, met p < r n +, zodat q ip = q ir. Beschouw nu de string y die we bekomen door het schrappen in x van r p nullen. We weten dat y L. Wanneer we echter de werking van de automaat bekijken op y zien we het volgende: gelezen symbool nieuwe toestand q q i... q ip q ip q ir+... q in+ q in+2 q in+3... q in+3 }{{}}{{} =q ir F 4

16 Dit betekent dat de automaat ook de string y L aanvaard. Bijgevolg is L(A) L en herkent de automaat de taal L niet. Dit voorbeeld toont aan dat alhoewel eindige automaten in staat zijn om alle reguliere talen te herkennen, ze toch beperkte machines zijn en bijgevolg niet geschikt zijn als echt computermodel. In een volgend onderdeel zullen we kennismaken met een sterker computermodel de Turingmachine. Tot slot merken we hier nog op dat er uitbreidingen bestaan van het begrip van een eindige automaat, waarbij ook de mogelijkheid voorzien wordt om uitvoer te genereren. Wij gaan hier echter niet verder op in. Een andere uitbreiding waar we wel even op inpikken in het volgende onderdeel is dat van een nietdeterministische eindige automaat..4 Niet deterministische eindige automaten De eindige automaten we tot nu toe gezien hebben zijn zogenaamde deterministische machines. Dit betekent dat de machine op elk moment slechts één (ondubbelzinninge) instructie te verwerken krijgt en deze instructie slechts op één manier kan uitvoeren. In een algoritme (of programma) laat men nooit de instructie of toe (Doe A of Doe B). Indien we echter aannemen dat we over twee onafhankelijke processoren zouden beschikken, dan zou een opdracht als Doe A of Doe B parallel kunnen uitgevoerd worden. De ene processor zou A kunnen uitvoeren, terwijl de andere B zou kunnen uitvoeren. Indien we maar over één processor beschikken, en we willen toch opdrachten met of-statements uitvoeren, dan moet de machine dus op bepaalde momenten een keuze maken welke van de twee (of meer) mogelijke opdrachten hij zal uitvoeren. Dergelijke machines noemt men niet deterministische machines. Een eerste voorbeeld van een dergelijke niet deterministische machine vinden we bij de eindige automaten. Definitie.4. Een niet-deterministische eindige automaat Een niet deterministische eindige automaat is een 5-tal A = (Q,Σ,δ,q,F) waarbij Q een eindige verzameling is (de toestanden van de automaat A). F Q is de verzameling van de aanvaardbare eindtoestanden. q Q, de begintoestand van de automaat. Σ is een eindige verzameling, het alfabet van de automaat. δ is een afbeelding δ : Q (Σ {λ}) P(Q). P(Q) = {X X Q} duidt de verzameling van alle deelverzamelingen van Q aan. 5

17 Het verschil tussen een gewone (deterministische) eindige automaat en een niet determinisitische ligt dus in het feit dat de transitieafbeelding δ geen toestanden als beelden heeft, maar verzamelingen van toestanden. Deze verzamelingen kunnen leeg zijn! Merk eveneens op dat we δ nu ook kunnen toepassen op paren (q i,λ) waarbij λ de lege string is. Ook niet deterministische eindige automaten kunnen we schematisch voorstellen met cirkels en pijlen. We laten bij een niet deterministische machine echter toe dat er vanuit een cirkel meerdere pijlen met hetzelfde label vertrekken. Het label λ mag eveneens gebruikt worden. Daarenboven is het mogelijk dat een bepaald symbool niet als label bij een pijl uit een gegeven cirkel voorkomt. Voorbeeld Beschouw de niet deterministische eindige automaat die schematisch wordt weergegeven als a, b b b q q q2 Hoe werkt deze automaat nu op de string abb? We kunnen verschillende mogelijkheden onderscheiden afhankelijk van de keuzes die de automaat maakt: Mogelijkheid : Na het lezen van symbool a, blijft de machine in toestand q. Daarna kan de machine bij het lezen van de eerste b kiezen om in q te blijven. Bij het lezen van de volgende b kan de machine opnieuw beslissen om in toestand q te blijven en daar dus te eindigen. Mogelijkheid 2: Na het lezen van symbool a, blijft de machine in toestand q. Daarna kan de machine bij het lezen van de eerste b kiezen om over te gaan naar toestand q en dan moet de machine bij het lezen van de laatste b overgaan naar toestand q 2, die een aanvaardbare eindtoestand is. Mogelijkheid 3: Na het lezen van symbool a, blijft de machine in toestand q. Daarna kan de machine bij het lezen van de eerste b kiezen om in in toestand q te blijven. Tenslotte kan de machine bij het lezen van de laatste b kiezen om over te gaan naar en te eindigen in toestand q. We zullen zeggen dat een string aanvaard wordt door een niet deterministische eindige automaat indien er minstens één opeenvolging van keuzes gemaakt kan worden, zodat de automaat eindigt in een aanvaardbare toestand na het verwerken van de string. We zullen nu de functie δ opnieuw uitbreiden tot een functie δ zodat voor elke string x Σ, δ (q,x) de verzameling is van alle mogelijke eindtoestanden, indien we de machine laten werken op x. (Een formele definitie van δ is niet zo eenvoudig en laten we hier dan ook achterwege). Voorbeeld Voor de niet deterministische eindige automaat van daarnet is. δ (q,abb) = {q,q,q 2 } 6

18 2. δ (q,abba) = {q,q } 3. δ (q,aaaaaaa) = {q } Met andere woorden: een toestand q i δ (q,σ σ 2...σ n ) als en slechts als er een pad 2 bestaat in het schema dat de niet deterministische eindige automaat voorstelt, zodanig dat dit pad begint in q en eindigt in q i en waarbij de pijlen opeenvolgend de labels σ, σ 2,..., σ n hebben, maar waarbij we tussendoor ook een willekeurig aantal pijlen met een label λ mogen gebruiken. Net zoals bij de gewone eindige automaten kunnen we in de niet deterministische situatie spreken over de taal aanvaard door een automaat. Definitie.4.2 Taal aanvaard door een niet deterministische automaat. Indien A = (Q,Σ,δ,q,F) een niet deterministische eindige automaat is, noemen we L(A) = {x Σ δ (q,x) F } de taal bepaald door de eindige automaat A. Indien voor een gegeven taal L Σ geldt dat L = L(A) zeggen we dat A de taal L herkent. Voorbeeld De niet deterministische automaat van daarnet herkent de taal L = {a,b} {bb}. We merken op dat deze taal ook herkend wordt door een deterministische eindige automaat. We hebben dit besproken in het voorbeeld op pagina 3. Dit is geen toeval, zoals blijkt uit de volgende eigenschap (zonder bewijs). Stelling.4.3 Elke taal die herkend wordt door een niet deterministische eindige automaat wordt eveneens herkend door een deterministische eindige automaat. Het omgekeerde geldt natuurlijk ook daar elke deterministische eindige automaat kan aanzien worden als een niet-deterministische automaat. Met het gebruik van niet deterministische eindige automaten raken we dus niet buiten de klasse van de reguliere talen. Het gemak van een niet deterministische eindige automaat ligt in het feit dat het veel eenvoudiger is om een niet deterministische eindige automaat te ontwikkelen die een gegeven taal herkent, dan om een deterministische te vinden. 2 Dit begrip zal formeel gemaakt worden in het hoofdstuk over grafentheorie 7

19 Voorbeeld We zoeken een niet deterministische eindige automaat die de taal L = {a} {b} {c} op het alfabet Σ = {a,b,c} herkent. Een voorbeeld van een dergelijke niet deterministische automaat wordt gegeven door a b c q λ λ a q b q c λ q Bovenstaande machine lijkt op het eerste zicht misschien geen niet deterministische machine, want er is geen enkele cirkel waar er meer dan pijl uit vertrekt met eenzelfde label. Nochtans is deze eindige automaat geen deterministische automaat, omdat er ten eerste pijlen zijn met het label λ (dit zorgt er steeds voor dat de automaat een keuze heeft om naar een andere toestand over te gaan!) en ten tweede zijn er cirkels waarbij niet alle labels gebruikt worden, bijvoorbeeld δ(q a,b) = We tonen tot slot van dit onderdeel aan dat het voor reguliere talen L eenvoudig is om een niet deterministische machine te maken die deze taal herkent:. We construeren eerst niet deterministische eindige automaten die de bouwstenen van de klasse der reguliere talen herkennen. (a) De reguliere taal L = wordt herkend door q q (b) De reguliere taal L = {λ} wordt herkend door λ q q (c) Zij σ Σ, de taal L = {σ} wordt herkend door σ q q 2. We bekijken nu achtereenvolgens al de bewerkingen die toegestaan zijn op reguliere talen. Voor een reguliere taal A Σ duiden we met M(A) een niet deterministische eindige automaat aan die A herkent. (We mogen zonder verlies van algemeenheid aannemen dat M(A) slechts één aanvaardbare eindtoestand heeft) 8

20 (a) De taal AB wordt herkend door M(A) M(B) λ λ (b) De taal A B wordt herkend door M(A) λ λ M(B) λ λ (c) De taal A wordt herkend door λ λ M(A) λ λ 2 Turing machines 2. Wat is een Turing machine In het vorige onderdeel hebben we kennis gemaakt met eindige automaten. Dit zijn heel eenvoudige computermodellen. Deze modellen hebben echter geen geheugencapaciteit (behalve dan een zeer beperkte mogelijkheid dankzij het eindig aantal toestanden). Een Turing machine zal opnieuw een wiskundig model zijn van een eenvoudige computer, maar nu met een grote geheugencapaciteit. Het model is niet te ingewikkeld zodat het mogelijk is om bepaalde eigenschappen van dergelijke machines aan te tonen en te behandelen. Van de andere kant is een Turing machine ook ingewikkeld genoeg om alle (reken)taken die we van een computer verwachten te kunnen uitvoeren. Men kan een Turing machine voorstellen als een machine die voorzien is van een magneetband die in twee richtingen kan bewegen. In verschillende fazen van de berekening bevat de band (= het geheugen van dit computermodel!) de invoer voor de berekening, de tussenresultaten en de uitvoer. De magneetband is een oneindig lange rij van symbolen die bestaat uit een eindige string voorafgegaan en gevolgd door oneindig veel blanco karakters (zie figuur.). 9

21 Start Figuur.: Een Turing machine De machine heeft een lees/schrijfkop en het symbool op de magneetband juist onder de kop noemen we het huidig symbool: de operatie van lezen is daarmee impliciet. De kop kan het huidig symbool overschrijven. Een Turing machine heeft een eindig aantal mogelijke toestanden: de machine bevindt zich steeds in één van haar toestanden. Een instructie voor de machine is een voorschrift voor de machine om in één operatie van toestand te veranderen, het huidig symbool te overschrijven met een nieuw symbool en de kop (of de magneetband) één positie naar links of naar rechts te bewegen. Welke instructie uitgevoerd wordt, hangt enkel af van de huidige toestand van de machine en het huidige symbool, niet van de voorgeschiedenis van de machine, noch van andere dan het huidige symbool. Eens gestart, blijft de machine instructies uitvoeren tot zij in een toestand komt waarbij er voor het huidig gelezen symbool geen instructie meer voorhanden is. Op dat moment kan men controleren of de machine al dan niet in een aanvaardbare toestand gestopt is. We schrijven nu het bovenstaande neer in een formele definitie. 2

22 Definitie 2.. Turing machine Een Turing machine bestaat uit een 6-tal M = (Q,Σ,T,P,q,F) waarbij Q een eindige verzameling is. We noemen de elementen van Q toestanden F Q is de verzameling van aanvaardbare eindtoestanden q Q, deze toestand wordt de begintoestand genoemd. Σ is een eindige verzameling, het alfabet van de Turing machine genoemd, waarvan we de elementen symbolen noemen. Eén symbool heeft een speciale betekenis, het blanco symbool of lege symbool en wordt voorgesteld door #. T Σ\{#} is de verzameling van invoersymbolen. De elementen van Σ\(T {#}) worden hulpsymbolen genoemd. P is een functie (niet noodzakelijk een afbeelding) P : (Q\F) Σ Q Σ {L,R,} P wordt het programma of de instructieset van de Turing machine genoemd. (In de verzameling {L,R,} staat L voor Links, R voor Rechts en voor Blijf staan, waarmee de beweging van de schrijfkop aangegeven wordt.) Wanneer we de machine starten bevindt deze zich in de begintoestand q en staat de leeskop boven het meest linkse, niet blanco symbool van de magneetband. De machine voert dan het programma P uit en dit moet als volgt geïnterpreteerd worden: Noem q de toestand waarin de Turing machine zich op een bepaald moment bevindt en zij σ Σ het symbool dat op datzelfde moment door de kop gelezen wordt. Nu zijn er twee mogelijkheden. Het koppel (q,σ) behoort tot het definitiegebied van de functie P. Dit betekent dat P(q,σ) bestaat en gelijk is aan een drietal (q,σ,x) Q Σ {L,R,}. Het effect van de uitvoering van deze instructie is dat de Turing machine haar toestand (eventueel) zal veranderen in toestand q, dat het huidig gescande symbool σ (eventueel) vervangen wordt door σ en dat de kop zich beweegt zoals X aangeeft, d.w.z. indien X = L, beweegt de kop zich naar links (of de band naar rechts), indien X = R beweegt de kop naar rechts en indien tenslotte X = blijft de kop ter plaatse. 2. Indien het koppel (q,σ) niet behoort tot het definitiegebied van P stopt het programma. De toestand q wordt de eindtoestand van de Turing machine (voor die bepaalde invoer) genoemd. Indien de Turing machine gestopt is en de eindtoestand q behoort tot F, dan zegt men dat de invoerstring aanvaard werd, in het andere geval zeggen we dat de invoerstring verworpen werd. Indien een string aanvaard werd dan beschouwen 2

23 we de eindige string symbolen op de magneetband (dus zonder de twee oneindig lange uiteinden van blanco symbolen) als de uitvoer van de Turing machine. We illustreren deze begrippen aan de hand van een Turing machine die als invoer een string van en en en neemt en daarvan het meest rechtse symbool uitveegt (d.w.z. vervangt door een blanco symbool.) De werking van een dergelijke Turing machine zou er als volgt kunnen uitzien: Bij het begin staat de leeskop op het meest linkse symbool van de string (toestand q ) Daarna zoekt de machine het meest rechtse symbool van de string door de leeskop telkens een positie naar rechts te verschuiven (toestand q ). Op het moment dat de leeskop het blanco symbool # leest, bevindt de kop zich één positie rechts van de string (toestand q 2 ) en moet de kop weer een positie naar links bewegen. Nu moet het ingescande symbool vervangen worden door het blanco symbool # en mag de machine stoppen (toestand h). Formeel bestaat deze Turing machine M dus uit de volgende onderdelen: Toestanden(M) = Q = {q,q,q 2,h}, met q de begintoestand. Aanvaardbare eindtoestand van M is h. Symbolen voor M = Σ = {#,,}. De invoersymbolen zijn T = Σ\{#} = {,}. Het programma P van M wordt gegeven door P(q,) = (q,,r) P(q,) = (q,,r) P(q,) = (q,,r) P(q,) = (q,,r) P(q,#) = (q 2,#,L) P(q 2,) = (h,#,) P(q 2,) = (h,#,) (Indien het meest linkse symbool een of een is, verander de toestand in q en zoek het rechteruiteinde van de string) (Zolang het einde niet gevonden is, beweeg de kop naar rechts) (Indien het einde gevonden is, verander van toestand en beweeg weer één positie naar links) (Wis het laatste symbool en stop in de aanvaardbare eindtoestand h) Voor andere koppels (q,σ) uit Q Σ is P niet gedefinieerd. In figuur.2 bekijken we even het verloop van het programma P, wanneer de Turing machine M als invoer de string krijgt. 2.2 Turing machines en functies Computers worden vaak gebruikt om berekeningen uit te voeren. In dit opzicht is het belangrijk om te weten wat er allemaal mogelijk is met behulp van een computer. Op het eerste gezicht kan men denken dat de functie kwadraat, die 22

24 ... # # #... q... # # #... q... # # #... q... # # #... q... # # #... q 2... # # # #... h Figuur.2: De verschillende stappen die de Turing machine M doorloopt van een natuurlijk getal zijn kwadraat bepaalt, berekenbaar is door middel van een computer. Nu is het echter zo dat elke computer begrensd is in opslagcapaciteit en dus onmogelijk de waarde kwadraat(n) (of zelfs het getal n zelf) voor elk natuurlijk getal kan opslaan in zijn geheugen. Toch zien we deze beperking niet als een echte beperking, want door desnoods het geheugen van onze computer uit te breiden kunnen we (in theorie althans) kwadraat(n) voor willekeurig grote n berekenen. Daarom wordt dikwijls gezegd dat de functie effectief berekenbaar is. Algemeen noemen we elke functie die berekenbaar is op een machine met onbegrensde opslagcapaciteit effectief berekenbaar. In het vorig onderdeel hebben we kennis gemaakt met een dergelijke machine met een onbegrensde opslagcapaciteit, namelijk de Turing machine (TM in het vervolg). In dit onderdeel bekijken we hoe we een TM kunnen gebruiken om functies van N naar N te berekenen, maar eerst omschrijven we nauwkeuriger wat we bedoelen met een functie die door een TM berekend wordt. Veronderstel dat een TM M = (Q,Σ,T,P,q,F) een invoer x T krijgt. Indien M bij die invoer stopt in een aanvaardbare eindtoestand dan noteren we de geproduceerde output door f M (x). Indien M niet stopt of stopt in een niet aanvaardbare eindtoestand, dan zeggen we dat f M (x) onbepaald is. Op die manier definieert de TM M een functie f M : T Σ. We noemen f M de functie berekend door M. Daarom wordt een functie f : T Σ Turing berekenbaar genoemd als en slechts als er een TM M bestaat zodanig dat f = f M. Hier willen we even de aandacht vestigen op de onbewezen (en onbewijsbare) 23

25 Stelling 2.2. These van Church Een functie is effectief berekenbaar als en slechts als die functie Turing berekenbaar is. Het is duidelijk dat elke Turing berekenbare functie effectief berekenbaar is, aangezien een TM een voorbeeld is van een machine met onbegrensde opslagcapaciteit. Het omgekeerde is in feite niet aantoonbaar omdat het begrip machine met onbegrensde opslagcapaciteit veel te vaag is en niet precies genoeg gedefinieerd kan worden. Vanaf nu zullen we ons concentreren op functies (met één of meerdere veranderlijken) gedefinieerd op de natuurlijke getallen. De eerste stap in het ontwikkelen van een TM die een bepaalde functie berekent is het kiezen van een voorstellingswijze voor de natuurlijke getallen. We kunnen het natuurlijk houden bij de decimale voorstellingswijze, maar dan hebben we minstens symbolen (,,...,#) nodig in onze TM. Om de TM echter eenvoudig te houden is het verstandig om zo weinig mogelijk symbolen te gebruiken. Daarvoor is het handig om gebruik te maken van de binaire of zelfs de unaire notatie. In de unaire notatie stellen we getal voor door, het getal door, het getal 2 door,..., het getal n door } {{ }. Bij deze laatste voorstellingswijze hebben we dus slechts symbool n+ enen nodig om de getallen zelf voor te stellen. Laten we nu enkele voorbeelden bekijken van Turing berekenbare functies. Voorbeeld De constante nulfunctie f : N N : n is Turing berekenbaar. We kiezen voor de unaire representatie van de natuurlijke getallen. Een TM kan de constante nulfunctie als volgt berekenen: Bij om het even wat voor een invoerstring verplaatsen we de leeskop steeds een positie naar rechts waarbij we telkens het ingescande symbool wissen, tot we deze string voorbij zijn. Daarna schrijven we als uitvoer het symbool, de unaire representatie voor op de magneetband. Een formele beschrijving van deze TM M = (Q,Σ,T,P,q,F) wordt als volgt gegeven: Q = {q,q,h}, F = {h} Σ = {,#}, T = {} P wordt gegeven door: P(q,) = (q,#,r) P(q,) = (q,#,r) P(q,#) = (h,,) 24

26 Opmerking We merken hier op dat de bovenstaande TM niet minimaal is (in het aantal toestanden). Je hoeft namelijk niet meteen van toestand q over te gaan naar een nieuwe toestand. (We illustreren dit in het voorbeeld hieronder.) De bovenstaande functie is natuurlijk niet de meest interessante functie. Een iets beter voorbeeld wordt gegeven door de volgende TM die de som van twee natuurlijke getallen berekent. Voorbeeld De functie + : N N N : (x,y) x + y is Turing berekenbaar. Voor de constructie van een TM voor deze functie spreken we af dat de invoer als volgt gebeurt: We stellen de twee natuurlijke getallen voor door middel van hun unaire representatie en scheiden ze van elkaar op de tape door middel van een plusteken +. De TM die de som van deze twee getallen berekent kan dit doen door het plusteken dat de twee getallen van elkaar scheidt te vervangen door een en nadien twee keer een te wissen aan het einde van de op deze manier bekomen string van (x + ) + + (y + ) -en. De TM M met de volgende gegevens doet wat we verlangen: Q = {q,q,q 2,h}, F = {h} Σ = {,+,#}, T = {,+} P is gegeven door: P(q,) = (q,,r) P(q,+) = (q,,r) P(q,#) = (q,#,l) P(q,) = (q 2,#,L) P(q 2,) = (h,#,) Voorbeeld De functie N N : x 2x is Turing berekenbaar. De TM die we zullen gebruiken om deze functie te berekenen is interessant omdat ze. het gebruik van hulpsymbolen illustreert. 2. toont hoe een lus geprogrammeerd kan worden (Opmerking: een alternatieve werkwijze wordt geïllustreerd in oefening 8) We veronderstellen terug dat de invoer gebeurt in unaire notatie. M.a.w. de invoerstring voor het getal x N bestaat uit x + enen. De TM die 2x berekent kan bijvoorbeeld als volgt te werk gaan: Stap : Vervang de laatste door een ( is dus een hulpsymbool) (Situatie: }... {{ } ) x keer Stap 2: Kopieer de string van enen voor het teken, onmiddellijk na dit teken. (Situatie: }... {{ }... }{{ } ) x keer x keer 25

27 Stap 3: Vervang terug door en we verkrijgen een string van 2x + enen, wat verwacht wordt. Om Stap 2 uit te voeren zullen we een lus gebruiken, die als volgt werkt: Zolang er een staat voor het teken doe: Vervang de die het dichtst bij staat door het symbool A (A is een tweede hulpsymbool) Schrijf een op de eerste vrije plaats na. Na het uitvoeren van deze lus, vervangen we alle A s terug door een. We beschrijven nu de formele data voor deze TM. Q = {q,q,q 2,q 3,q 4,q 5,h}, F = {h} Σ = {,#,,A}, T = {} P is gegeven door: P(q,) = (q,,r) P(q,#) = (q,#,l) P(q,) = (q 2,,L) P(q 2,) = (q 3,A,R) P(q 2,A) = (q 2,A,L) Vervang de laatste door een. Toestand q 2 is de begintoestand voor het uitvoeren van de lus. De leeskop bevindt zich op dat moment links van. In deze toestand zoekt de TM naar de eerstvolgende voor. Indien we een vinden, vervang deze door A en begin naar rechts op te schuiven om na nog een te kunnen schrijven. Indien nog niet gevonden, kijk verder naar links. 26

28 P(q 2,#) = (q 5,#,R) P(q 3,A) = (q 3,A,R) P(q 3, ) = (q 3,,R) P(q 3,) = (q 3,,R) P(q 3,#) = (q 4,,L) P(q 4,) = (q 4,,L) P(q 4, ) = (q 2,,L) P(q 5,A) = (q 5,,R) P(q 5, ) = (h,,) Alle -en zijn vervangen door een A, verlaat de lus. In toestand q 3 schuift de kop volledig naar rechts en schrijft op de eerste beschikbare positie een. In toestand q 4 schuiven we de leeskop weer tot voorbij het teken en de machine komt weer in toestand q 2 te staan. In toestand q 5 (na het volledig uitvoeren van de lus) vervangen we alle A s terug in een en tenslotte ook het -teken in een. Op dat moment mag de TM stoppen. In de onderstaande tabel bekijken we even al de verschillende stappen die door deze TM uitgevoerd worden bij een invoerstring...##..., d.w.z. x = 2. Toestand Magneetband q # # # # q # # # # q # # # # q # # # # q # # # # q 2 # # # # q 3 # A # # # q 3 # A # # # q 4 # A # # q 2 # A # # q 2 # A # # q 3 # A A # # q 3 # A A # # q 3 # A A # # q 3 # A A # # q 4 # A A # q 4 # A A # q 2 # A A # q 2 # A A # q 2 # A A # q 5 # A A # q 5 # A # q 5 # # h # # Hetzelfde principe voor het benutten van lussen en hulpsymbolen kan gebruikt worden om aan te tonen dat er een TM M bestaat die het product van twee 27

29 natuurlijke getallen berekent. Door herhaaldelijk gebruik van deze technieken kan men voor elke veeltermfunctie f : N N : x a + a x + a 2 x + + a n x n (met a i N) een TM construeren die deze functie berekent. Het zou ons echter te ver leiden om deze TM s daadwerkelijk op te bouwen. Tot nu toe hebben we enkel de unaire notatie gebruikt voor de natuurlijke getallen. Hoe zit het nu als we een andere notatie gebruiken, bvb. de binaire notatie. Het blijkt dat de gekozen voorstellingswijze geen enkel belang heeft op de berekenbaarheid van een functie. Inderdaad, het is niet zo moeilijk om een TM te construeren die als input een getal in unaire voorstellingswijze en als output dat getal in binaire schrijfwijze heeft (zie de opdrachten bij de oefeningen). Laat ons zo een TM fixeren en noem deze CODEER. Ook voor de omgekeerde bewerking kan men een TM construeren, die we DECODEER noemen. Indien T f nu een TM is die een bepaalde functie in unaire notatie berekent, dan kunnen we een TM T f bouwen die f berekent in binaire notatie door eerst DECODEER toe te passen op de inputstring, waardoor we het getal in unaire notatie krijgen, op deze string T f toe te passen en dan ten slotte op het resultaat van deze berekening CODEER toe te passen om het antwoord terug van unaire naar binaire notatie om te vormen. Hetzelfde kan gezegd worden voor decimale of om het even wat voor andere representatie van de natuurlijke getallen. We kunnen dus besluiten dat de klasse van berekenbare functies f : N N onafhankelijk is van de gekozen voorstellingswijze van de natuurlijke getallen. De bovenstaande voorbeelden zouden kunnen de indruk wekken dat elke functie f : N N berekenbaar is. De volgende stelling toont echter aan dat dit niet het geval is. Stelling Er bestaat een niet Turing berekenbare functie f : N N. Bewijs: Zij f : N N een Turing berekenbare functie. We kunnen zonder verlies van algemeenheid aannemen dat er een Turing machine T f = (Q,Σ, {},P,q,F) bestaat die f in unaire notatie berekent. Daarenboven mogen we veronderstellen dat de toestanden in Q geschreven worden als q,q,q 2,...,q n, voor een zekere n N. Ook mogen we aannemen dat de symbolen uit de eindige verzameling Σ geschreven worden als σ = #, σ =, σ 2, σ 3,..., σ m, voor een m N. Een instructie uit het programma P van de TM T f is dus van de vorm P(q i,σ j ) = (q k,σ l,x), met i,j,k,l N en X {L,R,}. We kunnen deze instructie ook noteren door een 5 tal t = (q i,σ j,q k,σ l,x). De volledige instructieset P bestaat dus uit een eindige rij van 5 tallen t. We gebruiken nu de Gödel aftellingstechniek om dergelijke vijftallen te coderen. We koppelen aan elk 5 tal t een getal g(t) uit N als volgt: g(t) = 2 i 3 j 5 k 7 l m, met 28 m = X = L m = X = R m = 2 X =

30 Het is duidelijk dat uit g(t ) = g(t 2 ) volgt dat t = t 2 (waarom?). Een eindige rij van 5 tallen (P dus) t = (t,t 2,...,t r ) kan nu worden gecodeerd als het natuurlijk getal waarbij p r het r de priemgetal is. g( t) = 2 g(t ) 3 g(t 2) p g(tr) r, Onderstel nu dat de TM T f als aanvaardbare eindtoestanden, de toestanden q λ,q λ2,...,q λs heeft. Dan kunnen we de volledige TM T f coderen als ( t = P) g(t f ) = 2 g( t) 3 λ 5 λ2 p λs s+ We hebben dus aangetoond dat er met elke Turing berekenbare functie f een natuurlijk getal g(t f ) overeenkomt dat als code voor de TM T f dient. Op die manier hebben we aangetoond dat de verzameling van alle T f s die we op die manier beschouwd hebben aftelbaar oneindig is. Dit wil zeggen dat we de Turing machines T f kunnen nummeren met behulp van de natuurlijke getallen. (We geven het nummer aan de machine met de kleinste Gödel codering g(t f ), het nummer aan de TM met de op één na kleinste Gödel codering,...). We verkrijgen dat we alle dergelijke TM s kunnen beschouwen als een rij T f,t f,t f2,t f3,..., waarbij T fi de functie f i berekent. Elke Turing berekenbare functie f valt dus samen met minstens één f i. Definieer nu de functie g : N N : n { fn (n) + als f n (n) gedefinieerd is als f n (n) niet gedefinieerd is Veronderstel nu dat g een Turing berekenbare functie is. Dit zou betekenen dat g door één of andere TM T fk berekend wordt. Maar T fk berekent f k, dus moet g = f k. Daar g overal gedefinieerd is, moet dus ook f k overal gedefinieerd zijn. Dit leidt echter tot een contradictie want we hebben dan dat f k (k) g(k) = f k (k)+. 29

31 3 Analyse van algoritmen 3. Tijdscomplexiteit van algoritmen Bij het ontwerpen en implementeren van een oplossingsmethode voor een bepaald probleem stellen we ons de vraag: is deze oplossingsmethode de beste? Onder de beste methode verstaan we dan de methode die minimale rekentijd vraagt, of eventueel minimale geheugenruimte. Beide noties worden gedekt door het begrip van efficiëntie. Ervaring leert dat voor gemakkelijke problemen een betere oplossing kan gevonden worden dan voor moeilijke problemen: bijvoorbeeld is het bepalen of een element tot een verzameling behoort gemakkelijker dan de verzameling te ordenen (of sorteren, van het engelse to sort). Het kan natuurlijk ook gebeuren dat een probleem alleen maar moeilijk lijkt, omdat we een verkeerde oplossingsmethode gekozen hebben. We moeten dus heel goed oppassen wanneer we een probleem als moeilijk willen classificeren. We kunnen moeilijk redeneren over de efficiëntie van een oplossingsmethode die niet altijd eindigt; daarom bestaat de notie van algoritme: met algoritme wordt bedoeld een oplossingsmethode (berekeningsprocedure of berekeningsvoorschrift) die altijd eindigt. In de complexiteitstheorie probeert men een formele beschrijving te geven van wat een moeilijk probleem is en probeert men antwoorden te formuleren op vragen als: Wanneer is het ene algoritme beter dan het andere? Is er voor de oplossing van een bepaald probleem veel geheugenruimte nodig? Het spreekt voor zich dat wij in deze cursus slechts een korte inleiding op de complexiteitstheorie kunnen geven. We concentreren ons dan ook vooral op de vraag hoeveel tijd heeft een bepaald algoritme nodig om een bepaald probleem op te lossen? De tijd nodig om een probleem op te lossen hangt bijna altijd af van de grootte van het specifieke probleemgeval dat moet worden opgelost. Deze grootte wordt meestal gemeten aan de hand van de grootte van de invoer van het specifieke geval. Ter illustratie bekijken we even het vermenigvuldigen van twee vierkante matrices. Met het specifieke geval bedoelen we het vermenigvuldigen van twee n n matrices voor welbepaalde n. Voor de grootte van dit specifieke probleem kunnen we n als maat nemen. We zouden echter natuurlijk evengoed n 2 of 2n 2 kunnen voorstellen als maat voor de omvangsgrootte. Veronderstel dat we een algoritme beschouwen dat de standaardmethode voor het vermenigvuldigen van matrices gebruikt. Zo n algoritme berekent voor alle i,j n de (i,j) de term uit het product door de i de rij met de j-de kolom te vermenigvuldigen. Voor de berekening van deze (i, j) de term moet de computer 2n leesoperaties, n vermenigvuldigingen en n optellingen en tenslotte nog een schrijfoperatie uitvoeren. In het totaal hebben we voor de berekening van deze term 4n bewerkingen nodig. Aangezien er n 2 termen te berekenen zijn, voert het algoritme dus 4n 3 bewerkingen uit. Bij de analyse van algoritmen (vaak in een of andere hogere programmeertaal geschreven) worden inderdaad de benodigde elementaire bewerkingen (rekenkundige en logische operaties, bestandstoegangen, lezen/toekennen van waarden 3

32 van/aan variabelen) geteld. Van deze elementaire bewerkingen wordt aangenomen dat hun tijdsduur onafhankelijk is van de grootte van het probleem; hun tijdsduur wordt dan ook als genomen. We moeten er ons echter van bewust zijn dat dit voor bewerkingen zoals optelling en vermenigvuldiging, slechts een benadering is, of beter gezegd slechts geldig binnen een begrensd bereik van getallen (bijvoorbeeld wat in een computer voorgesteld wordt met 32 bits). In een meer gevorderde cursus over complexiteitsleer wordt hierop dieper ingegaan. Bij de analyse van Turing machines, wordt elke instructie als elementaire bewerking beschouwd en daar is het duidelijk dat de duur van een optelling afhangt van de grootte van de getallen (en van de voorstellingswijze). Definitie 3.. Tijdscomplexiteit De tijdscomplexiteit van een bepaald algoritme A is een functie tijd A (n) : N N die voor een gegeven invoeromvang n het maximum aantal elementaire bewerkingen aangeeft, die door het algoritme A bij een invoeromvang van grootte n zullen worden uitgevoerd. Uit de definitie volgt onmiddellijk dat tijd A (n) een slechtste geval maat is. Het kan goed zijn dat het algoritme bij een invoer van grootte n in de meeste gevallen veel minder dan tijd A (n) elementaire bewerkingen moet uitvoeren om tot een resultaat te komen en dat het slechts in enkele uitzonderlijke gevallen gebeurt dat er daadwerkelijk tijd A (n) stappen nodig zijn. Het is dan ook zo dat men vaak analyses van algoritmen doet met betrekking tot de gemiddelde complexiteit. Dit is echter in de meeste gevallen heel wat moeilijker en we zullen ons hier dan ook beperken tot de complexiteit in het slechtste geval. We merken ook op dat bepaalde elementaire bewerkingen meer tijd in beslag nemen dan andere en dat de werkelijk benodigde tijd voor de uitvoering van een algoritme heel sterk machineafhankelijk is. Uit deze en andere praktische overwegingen volgt dat onze definitie van tijdscomplexiteit vrij ruw is. Vandaar dat men bij dergelijke analyses niet zozeer geïnteresseerd is in de werkelijke (kwantitatieve) uitdrukking voor tijd A (n), maar veeleer een kwalitatieve uitdrukking voor deze functies wenst te beschouwen. Daarom wordt vaak gebruik gemaakt van de O-notatie. 3

33 Definitie 3..2 De O-notatie (In het Engels: big oh ) Indien f,g beide functies zijn van N naar R +, dan zeggen we dat f(n) is O(g(n)) (of f is O(g), of f(n) = O(g(n))) of f wordt asymptotisch gedomineerd door g indien c R +, N N, n N : n N f(n) cg(n) Men zegt: f is van orde g. Merk op dat het kan gebeuren dat zowel f is O(g) en g is O(f). Voorbeeld De functie die n afbeeldt op 3n 2 + 4n + 3 is O(n 2 ), omdat 3n 2 + 4n + 3 4n 2, n 5 (c = 4, N = 5). Omgekeerd is n 2 ook O(3n 2 + 4n + 3) omdat n 2 3n 2 + 4n + 3, n (c =, N = ). We kunnen dit voorbeeld nog veralgemenen en zeggen dat elke veelterm (die positieve waarden aanneemt in de natuurlijke getallen) van graad 2 een O(n 2 )- functie is. Sterker nog, een willekeurige veelterm van graad k is een O(n k )-functie. Definitie 3..3 Asymptotische equivalentie van functies. Twee functies f,g : N R + worden asymptotisch equivalent genoemd indien f is O(g) en g is O(f) We noteren deze situatie door f is θ(g) (en dus ook g is θ(f)). Hierboven hebben we reeds min of meer aangetoond dat twee veeltermen van dezelfde graad asymptotisch equivalent zijn. Het is echter niet zo dat n 2 een O(n) functie is (de functie n is vanzelfsprekend O(n 2 )). Inderdaad, veronderstel dat c R + een constante is zodat voor waarden van n die groot genoeg zijn geldt dat n 2 cn. Het is echter duidelijk dat deze ongelijkheid niet kan opgaan indien n > c, wat een tegenstrijdigheid oplevert. Het is met behulp van deze O-notatie dat wij algoritmen met elkaar gaan vergelijken. Veronderstel dat we twee algoritmen A en B kennen die een bepaald probleem oplossen. We noteren de respectievelijke complexiteitsfuncties met tijd A (n) en tijd B (n). Het algoritme A wordt beter genoemd dan het algoritme B indien 32

34 5 4 n! 2 n n 2 3 n log 2 n 2 n log 2 n Figuur.3: De grafieken van enkele veel beschouwde functies.. tijd A (n) is O(tijd B (n)), maar 2. tijd B (n) is niet O(tijd A (n)) Indien we dus een algoritme A hebben met een lineaire tijdscomplexiteit (t.t.z. tijd A (n) is O(n)) en een algoritme B hebben met een kwadratische complexiteitsfunctie (tijd B (n) is O(n 2 )), dan beschouwen we A als een beter algoritme. Nochtans mag men daarom niet besluiten dat algoritme A altijd moet verkozen worden boven B: de constante factor c uit de definitie van big oh, kan immers heel groot zijn voor A en klein voor B en indien geweten is dat n klein blijft, kan B efficiënter zijn. Om goed te kunnen werken met dit begrip van complexiteit is het handig om enkele functies en hun asymptotisch gedrag te kennen. In de rij hieronder wordt van enkele belangrijke functies hun asymptotisch gedrag gegeven: een functie f(n) staat links van g(n) indien f(n) is O(g(n)) (en niet omgekeerd). log 2 n n (n log 2 n) n 2 n k 2 n n! Het is ook interessant om even de grafieken van deze functies in figuur.3 te bekijken. Definitie 3..4 Een algoritme van polynomiale tijd We noemen een algoritme van polynomiale tijd als en slechts als zijn tijdscomplexiteit O(n k ) is voor een k N. 33

35 In de praktijk besteedt men veel tijd aan het zoeken naar efficiënte algoritmen voor specifieke problemen. Concreet betekent dit dat men algoritmen wil van polynomiale tijd, waarbij de complexiteit O(n k ) is voor vrij kleine k. Er bestaan echter heel wat problemen, waarvoor men tot nu toe niet in geslaagd is om een algoritme te vinden dat het probleem oplost in een polynomiale tijd, maar waarbij de tijdscomplexiteit asymptotisch equivalent is met een functie van de vorm c n voor een reëel getal c >. Definitie 3..5 Een algoritme van exponentiële tijd Een algoritme wordt van exponentiële tijd genoemd indien zijn complexiteitsfunctie asymptotisch equivalent is met een functie c n voor een reëel getal c >. Een kleine vergelijking toont aan dat algoritmen van exponentiële tijd heel wat minder efficiënt zijn dan algoritmen van polynomiale tijd. Veronderstel even dat een probleem kan opgelost worden door middel van twee algoritmen A en B, waarbij A een tijdscomplexiteit tijd A (n) = n 5 heeft en waarbij tijd B (n) = 2 n. Indien we deze algoritmen laten lopen op een machine die miljoen instructies per seconde kan uitvoeren, dan lost het algoritme A het probleem bij een probleemgrootte van n = 6 in minder dan,5 minuten op, terwijl het algoritme B meer dan 35 jaar nodig heeft! Indien er voor een bepaald probleem enkel een algoritme voorhanden is dat niet van polynomiale tijd is, dan kunnen we proberen om een algoritme van polynomiale tijd te vinden. Maar het kan gebeuren dat dit niet lukt. Dit kan aan ons liggen, maar het kan ook aan het probleem zelf liggen. Misschien bestaat er wel geen polynomiaal algoritme. Dergelijke problemen (die wel algoritmisch oplosbaar zijn, maar niet in polynomiale tijd) noemt men in het Engels intractable. In sectie 4 zullen we kennismaken met een theorie waaruit blijkt dat er inderdaad intractable problemen lijken te bestaan. We beperken ons hier tot het geven van een beroemd voorbeeld van een probleem, waarvan men vermoedt dat het intractable is. Het probleem heet het Handelreizigersprobleem en wordt als volgt geformuleerd: Gegeven: n steden c,c 2,...,c n. Tussen elk paar steden c i en c j kent men ook de afstand d i,j. Probleem: De handelsreiziger vertrekt in één welbepaalde stad (zeg c ) en wil een rondreis maken zodat hij elk van de steden c 2,c 3,...,c n precies één keer bezoekt en vervolgens naar zijn beginpunt c terugkeert (zonder nog andere steden te bezoeken). De vraag is nu: welke weg moet de handelsreiziger volgen om een zo klein mogelijke afstand af te leggen. Het is niet zo moeilijk om een algoritme te vinden dat dit probleem oplost. In- 34

36 derdaad, aangezien een rondreis van de handelsreiziger gegeven wordt door de opeenvolging waarin de steden c 2,c 3,...,c n doorlopen worden, kunnen we alle (n )! mogelijke permutaties van deze steden c 2,c 3,...,c n beschouwen en de bijhorende afgelegde weg berekenen om tenslotte de kortste rondreis uit alle mogelijke te selecteren. Dit is echter geen efficiënt algoritme aangezien we zeker meer dan een veelvoud van (n )! stappen in dit algoritme zullen moeten uitvoeren. Nauw verbonden met bovenstaand probleem is het volgende beslissingsprobleem (antwoord is ja/nee): TSP (Traveling Salesman Problem) Gegeven: een verzameling C = {c,c 2,...,c n } van n steden en bij ieder paar c i,c j C een afstand d i,j N en een grens b N. Gevraagd: Kan een handelsreiziger vanuit stad c elk van de steden c 2,c 3,...,c n precies één keer bezoeken en vervolgens terug huiswaarts keren, waarbij de totale afgelegde afstand b is? 3.2 Het bepalen van de complexiteit in enkele concrete voorbeelden In dit onderdeel beschouwen we een aantal voorbeelden van algoritmen, waarvan we de tijdscomplexiteit berekenen. Aangezien we enkel geïnteresseerd zijn in het asymptotisch gedrag van deze tijdscomplexiteit, werken we vooral met de O notatie. De algoritmen worden beschreven als (onderdelen van) een Javaprogramma. Voorbeeld Wat is de tijdscomplexiteit van volgend algoritme, dat de som berekent van alle elementen van een n n matrix a (in functie van n = a.length)? som=; for (int i=; i < a.length; i++) { for (int j=; j < a.length; j++) som += a[i][j]; } ( keer) (n keer) (n 2 keer) (n 2 keer) Tijdens de uitvoering van dit programma wordt eenmaal de bewerking som=, uitgevoerd. Aan de variable i wordt n (met n = a.length) keer een waarde toegekend, aan de variable j wordt n 2 keer een waarde toegekend (voor elke keer dat aanieen waarde wordt toegekend, wordt aanjna elkaar de waarden,2,...,n toegekend. Het is ook duidelijk dat de bewerking som+=a[i][j], n 2 keer zal uitgevoerd worden. Hieruit kunnen we besluiten dat de tijdscomplexiteit van dit algoritme O(n 2 ) is (op voorwaarde dat de tijdscomplexiteit van de bewerking in de lus constant is). Het voorbeeld toont ook aan dat bij het bepalen van de tijdscomplexiteit van een geneste lus, het nodig en voldoende is om na te gaan hoe vaak de meest inwendige opdracht (of opdrachten) wordt (worden) uitgevoerd. Voorbeeld Wat is de complexiteit van volgend programma onderdeel (in functie van n)? 35

37 for (int i=; i<=n; i++) { for (int j=; j<=i*i; j++) som++; } Het volstaat ook hier te berekenen hoeveel keer de bewerking som++ moet uitgevoerd worden. Noem dit aantal T(n). In de praktijk blijkt het vaak handig om een verband op te stellen tussen T(n) en T(n+) om zodoende meer informatie te bekomen over de functie T(n) zelf. Indien we n vervangen door n + en het algoritme terug uitvoeren, dan doen we een hele tijd precies hetzelfde totdat i de waarde n + aanneemt. Bij i = n + wordt de bewerking som++, nog (n + ) 2 keer uitgevoerd (eenmaal voor elke waarde van j tussen en (n + ) 2 ). We vinden dus dat T(n + ) = T(n) + (n + ) 2 (bovendien geldt T() = ). Een dergelijk verband van de vorm T(n + ) = T(n) + f(n) (met f(n) een willekeurige functie) wordt een recursiebetrekking of een differentievergelijking genoemd. Er bestaan heel wat technieken om dergelijke vergelijkingen precies op te lossen. Wij zijn echter enkel geïnteresseerd in een kwalitatieve uitdrukking voor de oplossing. Vandaar de volgende eigenschap. Eigenschap 3.2. Indien een afbeelding T : N R voldoet aan de recursiebetrekking n N : T(n + ) = T(n) + f(n) voor een veelterm f(n) van graad k, dan is T(n) zelf een veelterm van graad k +. Bewijs:. We tonen eerst aan dat voor een willekeurige veelterm f van graad k er veeltermen van graad k+ bestaan die aan de recursiebetrekking T(n+) = T(n)+f(n) voldoen. In punt 2 tonen we aan dat enkel dergelijke veeltermen voldoen. We werken per volledige inductie op de graad k van f(n). Basis: k =. Onderstel dat f(n) een constante veelterm f(n) = c R is. Dan is het duidelijk dat elke eerstegraads veelterm T(n) = cn + d (met constante term d willekeurig!) voldoet aan de recursiebetrekking. Inductiehypothese: We veronderstellen dat k > en dat de bewering geldt voor recursiebetrekkingen met veeltermen f(n) van lagere graad, Indien er een veelterm T(n) bestaat die aan de gevraagde recursiebetrekking voldoet, dan moet voor de afgeleiden T en f gelden dat T (n + ) = T (n) + f (n) 36

38 Per inductie bestaat er een veelterm S(n) van graad k die voldoet aan S(n+) = S(n)+f (n). Beschouw nu een willekeurige primitieve R(n) van S(n). Dan is R(n) een veelterm van (precies) graad k +. Enerzijds hebben we nu dat R(n+) een primitieve is van S(n+) en anderzijds is R(n)+f(n) een primitieve van S(n) + f (n). Daar nu echter S(n + ) = S(n) + f (n) zijn R(n + ) en R(n) + f(n) primitieven van eenzelfde functie en is hun verschil dus een constante c R: R(n + ) = R(n) + f(n) + c Door nu T(n) = R(n) cn te nemen, vinden we dat T(n) een veelterm is van graad k + die voldoet aan T(n + ) = T(n) + f(n) zoals gevraagd. 2. Onderstel nu dat T(n) een afbeelding is die aan de recursiebetrekking voldoet. Wegens het voorgaande bestaat er ook een veelterm S(n) van graad k + die aan de recursiebetrekking voldoet. Maar dan voldoen ook alle veeltermen van de vorm S(n) + c, met c R aan de gevraagde recursiebetrekking. Door nu c goed te kiezen mogen we veronderstellen dat S(n) voldoet aan de recursiebetrekking en dat eveneens S() = T(). We bewijzen nu per inductie dat T(n) = S(n) voor alle n (en dus dat T een veelterm is van graad k + ). Basis: n =. Dit is reeds voldaan. Inductiehypothese: Onderstel dat de bewering reeds klopt voor n, dan geldt: T(n + ) = T(n) + f(n) = S(n) + f(n) = S(n + ) wat te bewijzen was. We kunnen nu terugkeren naar ons voorbeeld en besluiten dat T(n) die voldoet aan T(n + ) = T(n) + (n + ) 2 een veelterm van graad 3 moet zijn. (Je kan nagaan dat de exacte oplossing gegeven wordt door T(n) = 6n(n + )(2n + )) en zodoende weten we dat de tijdscomplexiteit van deze instructies O(n 3 ) is. Voorbeeld Bepaal de tijdscomplexiteit van het volgende algoritme for (int i=; i<=n; i++) { for (int j=; j<= i*i; j++) { for (int k=; k<=j; k++) som++; } } We zullen opnieuw nagaan hoe vaak de bewerking som++ door het programma zal uitgevoerd worden, in functie van n. Noem dit aantal T(n). We proberen terug om een recursiebetrekking op te stellen. Nu is T(n) = T(n )+ het aantal keer dat de bewerking som++, wordt uitgevoerd in 37

39 for (int j=; j<= n*n; j++) { for (int k=; k<=j; k++) som++; } m Dit aantal is gelijk aan n 2 = n2 (n 2 +) m(m + ) 2 (gebruik p =, 2 p= bewijs desnoods deze gelijkheid per inductie op m). De recursiebetrekking wordt dus T(n) = T(n ) + n2 (n 2 + ) (met T() = ) 2 Met behulp van eigenschap 3.2., kunnen we reeds besluiten dat de functie T(n) een veelterm van graad 5 is. M.a.w. T(n) = O(n 5 ). Voorbeeld Bepaal de complexiteit van de volgende geneste lus opdrachten. for (int a=; a<=n, a++) { for (int b=a; b<=n; b++) { for (int i=a; i<=b; i++) "een elementaire opdracht"; } } We zullen terug T(n) gebruiken om aan te duiden hoeveel maal de meest inwendige bewerking van de lus moet uitgevoerd worden. Het lijkt in dit voorbeeld niet meer zo eenvoudig om T(n) rechtstreeks te berekenen. Daarom bekijken we eerst slechts de twee middelste lussen en noemen S a (n) het aantal keer dat de lus for (int b=a; b<=n; b++) { for (int i=a; i<=b; i++) "een elementaire opdracht"; } wordt uitgevoerd. Met deze notatie hebben we dat T(n) = S (n) + S 2 (n) + + S n (n). Het is duidelijk dat S a (n) voldoet aan S a (n) S a (n ) = n a + (n a + is het aantal waarden dat i aanneemt als b = n). Bijgevolg hebben we dat T(n) T(n ) = S (n) + S 2 (n) + + S n (n) (S (n ) + S 2 (n ) + + S n (n )) = S (n) S (n ) + S 2 (n) S 2 (n ) + + S n (n) S n (n ) + S n (n) = n + (n ) n(n + ) = 2 Opnieuw gebruik makend van eigenschap 3.2., kunnen we besluiten dat de tijdscomplexiteit T(n) = O(n 3 ). 38

40 Voorbeeld De volgende Java methode, zoekt in een gesorteerde (van klein naar groot) rij a met n elementen (hier gehele getallen) of een gegeven waarde x in deze rij voorkomt. static boolean zoek (int [] a, int x ) { int eerste, laatste, midden; eerste = ; laatste = a.length -; while (eerste!= laatste) { midden = (eerste + laatste)/2; if (a[midden] < x) eerste = midden+; else laatste = midden; } return (x==a[eerste] ); } Wanneer we zoeken volgens dit algoritme, verdelen we dus telkens de te onderzoeken rij in twee (ongeveer) even grote delen en beschouwen we vanaf dan enkel die rij die het element nog kan bevatten. Indien we starten met een rij van bv. elementen, zeg, 2, 4, 6, 6, 7, 8, 2, 2, en we laten het programma zoeken of het element 7 in de rij voorkomt, dan worden achtereenvolgens de rijen midden = midden = midden =6 7 8 midden =5 7 midden =5 beschouwd. Om de tijdscomplexiteit van dit algoritme te berekenen, kijken we hoeveel maal de while-lus (waarvan de onderdelen allemaal elementaire bewerkingen zijn) uitgevoerd wordt. We noteren dit aantal terug door middel van T(n). Voor een rij van lengte wordt de while lus niet doorlopen, dus T() =. Voor een rij van grotere lengte wordt de while-lus wel doorlopen, en na iedere cyclus moeten we een rij beschouwen waarvan de lengte ongeveer de helft is van de lengte van de vorige rij. Om precies te zijn, indien we beginnen met een rij van even lengte, zeg n = 2m, dan zullen we na de eerste keer de while-lus te hebben doorlopen een rij van lengte m moeten beschouwen. Indien we vertrokken van een rij van oneven lengte, zeg n = 2m +, dan zullen we, afhankelijk van de situatie een rij van lengte m of van lengte m + moeten beschouwen. Aangezien wij bij onze complexiteitsanalyse altijd kijken naar het slechtste geval, zullen we aannemen dat we in het oneven geval een rij van lengte m+ zullen moeten onderzoeken. Of samenvattend, beginnen we met een rij van lengte n, dan moeten we na eenmaal de while-lus te hebben doorlopen, in het slechtste geval, een rij van lengte n 2 (dit 39

41 is het kleinste geheel getal dat groter of gelijk is aan n 2 ) aan hetzelfde onderzoek moeten onderwerpen. We verkrijgen dus de volgende recursiebetrekking: T(n) = + T( n ) met T() =. 2 Dit is een totaal ander soort van recursiebetrekking dan de voorgaande en eigenschap 3.2. helpt ons hier helemaal niet verder. Daarom, zullen we proberen een oplossing voor de recursiebetrekking te raden. Indien we eerst kijken naar de eenvoudige n, namelijk de machten van 2, dan zien we dat T(2 k ) = + T(2 k /2) = + T(2 k ) = + + T(2 k 2 ) = T(2 }{{} ) k en = k = log 2 (2 k ). Uit deze berekening valt te gokken dat de oplossing voor T(n) iets met log 2 (n) zal te maken hebben. In de tabel hieronder beschouwen we enkele expliciete waarden voor n, T(n) en log 2 (n): n T(n) log 2 (n) 2 3 +T(2)= Deze tabel laat ons toe om te gokken dat T(n) = log 2 (n). We bewijzen dit nu in de volgende eigenschap. Eigenschap De oplossing van de recursievergelijking met T() = is T(n) = log 2 (n). T(n) = + T( n 2 ), n 2 Bewijs: We bewijzen deze eigenschap per inductie op n. Voor n = is T() = = = log 2 (). Veronderstel nu dat de eigenschap geldig is voor alle waarden kleiner dan n met 4

42 n >. Neem k = log 2 (n) N. Dit betekent dat 2 k < n 2 k. Bijgevolg is 2 k 2 < n 2 2k en dus ook 2 k 2 < n 2 2k ( k 2 < log 2 ( n 2 ) k ). Bijgevolg vinden we door de inductiehypothese dat T(n) = + T( n 2 ) = + log 2( n 2 ) = + k = k = log 2(n) We besluiten dat het voorgestelde zoekalgoritme een complexiteit O(log 2 (n)) heeft, wat dus kwalitatief beter is dan een lineair (dit is O(n)) algoritme. 4

43 4 De klassen P en NP 4. Turing machines, talen en de klasse P Beschouw een willekeurige Turing machine M met invoersymbolen T. Analoog aan de situatie bij eindige automaten, zullen we de verzameling van alle invoerstrings in T die aanvaard worden door de TM M (dus waarvoor M stopt in een aanvaardbare eindtoestand) de taal die opgesomd wordt door M noemen en noteren we als L(M). Elke Turing machine M bepaalt op deze manier dus een taal. Er zijn twee manieren waarop M de taal L(M) kan bepalen. Het kan zijn dat de Turing machine M stopt voor elke invoerstring in T (dus ook voor de strings die niet tot L(M) behoren), in dit geval beslist M binnen een eindige tijd of een string al dan niet tot L(M) behoort. Het kan echter ook zijn dat voor sommige strings, de TM nooit stopt (in een oneindige lus terecht komt). In het eerste geval zeggen we dat de taal L(M) beslist wordt door M. Definitie 4.. Recursieve en recursief opsombare talen Een taal L is recursief opsombaar dan en slechts dan wanneer er een Turing machine M bestaat zodat L = L(M). Daarenboven noemt men L recursief als er een M bestaat die de taal L beslist. Voorbeeld We beschrijven een TM M, waarbij L(M) bestaat uit alle strings van gebalanceerde haakjes. De invoersymbolen zijn dus ( en ). Een string van ronde haakjes is gebalanceerd, indien er evenveel openhaakjes ( als gesloten haakjes ) in de string staan. Daarenboven moeten we in elke (aaneengesloten) deelstring die begint bij het meeste linkse haakje van de string minstens evenveel open haakjes als gesloten haakjes staan. Zo is ((()())) L(M) maar (()))(() L(M). De TM M die we voor deze taal voorstellen wordt als volgt opgebouwd Symbolen voor M: Σ = {#,A,(,)}, T = {(,)} (A is een hulpsymbool) Toestanden Q = {q,q,q 2,h}, F = {h} P wordt gegeven door 42

44 P(q,() = (q,(,r) Indien het ingescande symbool een ( is, blijf een ) zoeken naar rechts. P(q,)) = (q,a,l) Indien een ) haakje gevonden werd, veeg het uit en zoek links naar een passende (. P(q,A) = (q,a,r) Blijf verder zoeken. P(q,#) = (q 2,#,L) Er zijn geen ) -en meer over, controleer of alle ( reeds gepaard zijn. P(q,A) = (q,a,l) Zoek verder naar een (. P(q,() = (q,a,r) Een passend ( haakje is gevonden, veeg het uit en zoek het volgende ) haakje. P(q 2,A) = (q 2,A,L) Er is nog altijd geen overtollig ( je gevonden. Blijf controleren naar links. P(q 2,#) = (h,#,) Nergens stond een overbodig ( -je, de machine mag stoppen in een aanvaardbare eindtoestand. Ga zelf eens na, wat de werking is van deze TM op verschillende invoerstrings. We kunnen nu de begrippen in verband met tijdscomplexiteit van een algoritme toepassen op TM s en talen: Definitie 4..2 De klasse P Een recursieve taal L wordt beslist in polynomiale tijd door een TM M, indien M de taal L beslist en de tijdscomplexiteit O(n k ) voor een k N is. (Hierbij staat n voor het aantal symbolen van de invoerstring). Men duidt met P de klasse aan van alle talen die in polynomiale tijd door een TM beslist worden. Opmerking Alle reguliere talen worden door een eindige automaat beslist in een lineaire tijd. Er worden steeds evenveel stappen uitgevoerd als de invoer lang is. Het is een kleine moeite om een eindige automaat A om te vormen tot een TM M, zodat L(M) = L(A) en zodat de T(M) ook een lineaire tijdscomplexiteit heeft. Alle reguliere talen behoren bijgevolg tot P. (Dit toont nogmaals aan dat eindige automaten eenvoudige machines zijn). De taal L = { n n n N} is een voorbeeld van een niet reguliere taal, die eveneens tot P behoort (zie oefening 9). Het kan op het eerste gezicht een beetje vreemd lijken dat wij een theorie willen opbouwen rond Turing machines en talen. Maar het blijkt dat deze theorie heel goed toepasbaar is op een heel gamma van problemen. Dit volgt uit het feit dat alhoewel P formeel gedefinieerd is als een klasse talen, we P ook kunnen beschouwen als een klasse van beslissingsproblemen, problemen waar bij een gegeven invoer een antwoord ja of neen komt. Inderdaad, indien je een beslissingsprobleem hebt (zoals TSP) dat oplosbaar is door middel van een TM (lees algoritme) M, dan kunnen we onze TM altijd aanpassen tot een TM M zodat 43

45 deze stopt in een aanvaardbare toestand bij een ja antwoord en bij een niet aanvaardbare toestand bij een nee antwoord. De invoerstrings die een ja antwoord opleveren bij M zijn dus precies die strings die behoren tot L(M ). Aangezien de aanpassing van de TM M naar de TM M slechts een kleine aanpassing is, is het duidelijk dat de TM M een polynomiale complexiteit heeft als en slechts als M een polynomiale complexiteit heeft. We kunnen dus de klasse P zien als die klasse van problemen die oplosbaar zijn door middel van een Turing machine met een polynomiale tijdscomplexiteit. 4.2 Niet deterministische Turing machines en de klasse NP De Turing machines die we tot nu toe gezien hebben waren allemaal deterministische machines. Net als bij de eindige automaten kunnen we echter ook hier niet deterministische versies beschouwen Ter herinnering: bij een niet deterministische machine is het mogelijk om een opdracht als Doe A of Doe B te beschouwen en bijvoorbeeld te veronderstellen dat die parallel uitgevoerd worden op onafhankelijke processoren. Wanneer we nu theoretisch veronderstellen dat we oneindig veel onafhankelijke processoren zouden hebben, dan zouden we programma s met willekeurig veel van dergelijke of opdrachten kunnen beschouwen. Met zo n machine is het mogelijk om het TSP probleem in een polynomiale tijd (in het aantal steden) op te lossen. Inderdaad, bij een gegeven invoer van n steden met hun onderlinge afstanden, laten we elk van de processoren één van de (n )! mogelijke permutaties van de steden (en dus alle mogelijke trajecten) onderzoeken. Het berekenen van de afgelegde weg voor één mogelijke reisweg bestaat uit een optelling van n afstanden en kan dus wel degelijk gebeuren in een polynomiale tijd. Het is dan ook duidelijk dat wanneer we beschikken over een machine die alle (n )! takken tegelijkertijd kan onderzoeken, we TSP in een polynomiale tijd kunnen oplossen. We kunnen nu een formele definitie van een niet deterministische Turing machine geven (in het vervolg NDTM). Definitie 4.2. Niet deterministische Turing machine Een niet deterministische Turing machine M bestaat uit een zestal M = (Q,Σ,T,P,q,F) dat aan net dezelfde voorwaarden voldoet als in definitie 2.., behalve dat P nu geen functie meer hoeft te zijn, maar slechts een relatie van (Q\F) Σ naar Q Σ {L,R,}. Herinner je dat een relatie van een verzameling A naar een verzameling B niets anders is dan een verzameling van koppels (a,b) met a A en b B. Dit betekent dat er in tegenstelling tot een functie meer dan één koppel kan bestaan met eenzelfde beginpunt a. Concreet betekent dit voor een NDTM M dat wanneer deze machine zich in een bepaalde toestand q bevindt en de leeskop boven een bepaald symbool σ staat, er meerdere koppels ((q,σ),(q,σ,x)) tot P kunnen 44

46 behoren. Dit wil zeggen dat de NDTM M meerdere acties kan ondernemen. We maken dit duidelijker aan de hand van een concreet voorbeeld. Voorbeeld Een NDTM die voor een invoerstring bestaande uit a s en b s nagaat of die string een even aantal a s of b s bevat. Toestanden van M: Q = {q,p,p,r,r,h}, F = {h} Symbolen van M: Σ = {#,a,b}, T = {a,b} De instructieset P bestaat uit de koppels: ((q,a),(p,a,)) ((q,a),(r,a,)) ((q,b),(p,b,)) ((q,b),(r,b,)) ((p,a),(p,#,r)) ((p,b),(p,#,r)) ((p,a),(p,#,r)) ((p,b),(p,#,r)) ((r,a),(r,#,r)) ((r,b),(r,#,r)) ((r,a),(r,#,r)) ((r,b),(r,#,r)) ((r,#),(h,#,)) ((p,#),(h,#,)) In de instructieset hierboven worden de p toestanden gebruikt om het even of oneven zijn van het aantal a s bij te houden, de r toestanden doen hetzelfde voor het aantal b s. Toestand p (resp. r ) duidt een even aantal a s (resp. b s) aan, toestand p (resp. r ) een oneven aantal. De werking van deze NDTM wordt duidelijk, wanneer we het resultaat ervan bekijken op de string ababb. Er zijn twee mogelijke wegen die de NDTM M kan volgen en deze zijn samen geschetst in figuur.4. Zoals je ziet op de figuur heeft de NDTM bij de eerste stap de keuze tussen twee opdrachten (namelijk ((q,a),(p,a,)) of ((q,a),(r,a,))). We nemen aan dat een NDTM telkens wanneer er meerdere opdrachten mogelijk zijn, elk van deze mogelijkheden apart maar tegelijkertijd (parallel) behandelt. We zeggen dat een NDTM M met succes stopt bij een bepaalde invoer of ook nog dat de NDTM M een bepaalde string accepteert, indien één van de gevolgde wegen (en mogelijks meer) in een aanvaardbare eindtoestand stopt. Net zoals bij deterministische Turing machines kunnen we ook hier spreken van een taal opgesomd door de NDTM M. Deze noteren we nog altijd door L(M) en bestaat ook nu uit die strings van invoersymbolen van M die door M aanvaard worden. Aangezien een NDTM via meerdere berekeningsrijen een bepaalde inputstring kan aanvaarden, moeten we iets voorzichtiger zijn bij de definitie van de tijdscomplexiteit van een dergelijke niet deterministische machine. Men zegt dat de tijd die een NDTM nodig heeft om een bepaalde invoerstring x te accepteren gelijk is aan de kortste lengte van één van de mogelijke berekeningsrijen die x accepteert. Als geen enkele invoerstring van lengte n aanvaard wordt zegt men per definitie dat die berekeningstijd gelijk is aan nul. 45

47 ababb (q ) ababb (p ) ababb (r ) babb (p ) babb (r ) abb (p ) abb (r ) bb (p ) bb (r ) b (p ) b (r ) # (p ) # (r ) # (h) Figuur.4: De twee mogelijkheden voor de NDTM Definitie Tijdscomplexiteit van een NDTM De tijdscomplexiteit tijd M : N R + voor een NDTM M wordt gedefinieerd als tijd M (n) = Indien er geen enkele string van lengte n aanvaard wordt. max{ m er bestaat een string x T, van lengte n die in m stappen door M aanvaard wordt. } Nog steeds analoog aan het geval van de deterministische TM s, definiëren we nu Definitie NDTM van polynomiale tijd Een niet deterministische Turing machine M heet van polynomiale tijd als en slechts als tijd M (n) O(n k ) is, voor een k N. We kunnen nu zeggen wat bedoeld wordt met de klasse NP. 46

48 Definitie De klasse NP. Een recursief opsombare L wordt beslist in polynomiale tijd door een NDTM M, indien L(M) = L en M van polynomiale tijd is. Men duidt met NP de klasse aan van alle talen die in polynomiale tijd door een NDTM beslist worden. Aangezien elke deterministische TM ook kan aanzien worden als een niet deterministische TM, hebben we onmiddellijk dat P NP. Net zoals met P, komt ook met NP een hele klasse van beslissingsproblemen overeen. Men kan dus in feite NP beschouwen als die klasse van problemen die door een niet deterministisch programma in polynomiale tijd worden opgelost. We hebben reeds kort geschetst hoe het mogelijk is om aan te tonen dat het beslissingsprobleem TSP in de klasse NP zit. De meesten zijn er ook van overtuigd dat TSP P, maar dat heeft nog nooit iemand kunnen aantonen. Straffer nog, er bestaat geen enkel strikt wiskundig bewijs dat P NP. 4.3 De klasse NP Compleet In het begin van deze sectie zullen we ons vooral bezighouden met talen, hoewel we evengoed beslissingsproblemen kunnen beschouwen. Meer in het bijzonder bekijken we nu hoe we twee verschillende talen met elkaar kunnen vergelijken. Heel vaag kunnen we zeggen dat we de ene taal als eenvoudiger zullen beschouwen dan een andere taal indien er een algoritme bestaat om elk woord uit de ene taal te vertalen in een woord uit de andere taal. Daarenboven zullen we eisen dat deze vertaling kan gebeuren in een polynomiale tijd. We schrijven dit nu heel formeel op in de volgende definitie. Definitie 4.3. Polynomiale transformatie van een taal Gegeven twee talen L T (op een alfabet T ) en L 2 T2 (op een alfabet T 2 ). We zeggen dat L polynomiaal transformeert in L 2 indien er een afbeelding f : T T 2 bestaat waarvoor de volgende twee zaken gelden:. x T : x L f(x) L 2 2. Er bestaat een (deterministische) TM die f in polynomiale tijd berekent. We noteren deze situatie door L L 2. 47

49 Eigenschap Veronderstel dat de taal L T polynomiaal transformeert in de taal L 2 T2 door een functie f die berekend wordt door een TM M met een tijdscomplexiteit die O(n k ) (k N ) is. Dan bestaat er een positieve constante c R + zodat lengte(f(x)) c(lengte(x)) k voor alle (niet lege) x T. Met de lengte van een string bedoelen we het aantal symbolen waaruit deze string is opgebouwd. Bewijs: Uit de gegevens volgt dat er een constante c R + bestaat zodat voor voldoende lange x, zeg lengte(x) > N, het aantal stappen die de TM M f nodig heeft om f(x) te berekenen kleiner of gelijk is aan c (lengte(x)) k. Er kunnen dus ook hoogstens c (lengte(x)) k schrijfoperaties door de TM M gebeuren, waardoor de totale string op de magneetband niet meer dan lengte(x) + c (lengte(x)) k (c + )(lengte(x)) k symbolen kan bevatten. Noem c 2 = c +. Aangezien er slechts eindig veel strings zijn die een lengte hebben die kleiner is of gelijk aan N, bestaat ook het maximum c 3 = Max{lengte(f(x)) x T en lengte(x) N}. Het bewijs eindigt nu door c = Max{c 2,c 3 } te nemen. Stelling De relatie is transitief. Met andere woorden, indien we drie talen L,L 2 en L 3 gegeven hebben met L L 2 en L 2 L 3 dan is ook L L 3. Bewijs: Veronderstel dat L T, L 2 T2 en L 3 T3. Daar L L 2, bestaat er een afbeelding f : T T 2 die behoort bij die polynomiale transformatie L L 2. Noem de TM die f in polynomiale tijd berekent M f. Analoog is er een afbeelding g : T2 T 3 die in polynomiale tijd door een TM M g berekend wordt. We construeren nu een TM M die eerst de acties van M f uitvoert en daarna M g imiteert. Deze TM M berekent dus de afbeelding g f. We weten dat de tijdscomplexiteit van M f (resp. M g ) O(n k ) (resp. O(n l )) voor een natuurlijk getal k (resp. l) is. De tijd om g f te berekenen via M kunnen we nu als volgt bepalen. Beschouw een invoer van grootte n (voldoende groot), dan berekent M eerst f(n), dit gebeurt in minder dan c n k stappen voor een positief geheel getal c. De machine gedraagt zich vanaf dan als de machine M g die nu een invoer van maximale grootte cn k, voor een c R +, heeft (door eigenschap 4.3.2). We weten dat M g een invoer van voldoende grote lengte, zeg groter dan N, verwerkt in minder dan c 2 n l stappen, voor een c 2 R +. Er bestaat eveneens een getal m N, zodat de machine M g een invoer van lengte N verwerkt in minder dan m stappen. Elke string f(x) wordt dus door de machine M g verwerkt in minder 48

50 dan c 2 (cn k) l + m stappen. We kunnen besluiten dat de totale verwerkingstijd van een invoerstring van lengte n O(n kl ), en dus polynomiaal, is. Bijgevolg is g f een functie die Turing berekenbaar is in polynomiale tijd. Bovendien geldt nu voor alle x T dat x L f(x) L 2 g(f(x)) L 3. Stelling Gegeven twee talen L en L 2. Indien L L 2 en L 2 P dan is ook L P. Bewijs: Veronderstel dat L T en L 2 T 2 en dat L L 2 via een afbeelding f : T T 2 die in polynomiale tijd berekenbaar is door een TM M f. Omdat L 2 P bestaat er een TM M g die L 2 beslist in polynomiale tijd. Construeer nu terug de TM M die de TM M g na M f schakelt. We kunnen dan net zoals in het bewijs van de vorige stelling aantonen dat M een TM is met een polynomiale tijdscomplexiteit. Daarenboven is M een TM die de taal L beslist, dus geldt L P. We zullen twee talen als equivalent beschouwen indien de ene in de andere polynomiaal getransformeerd kan worden en omgekeerd. Definitie Polynomiale equivalentie van talen Twee talen L en L 2 worden polynomiaal equivalent genoemd, notatie L L 2, indien L L 2 en L 2 L De volgende eigenschap rechtvaardigt deze definitie. Eigenschap De relatie is een equivalentierelatie. Bewijs: We moeten aantonen dat de relatie reflexief, symmetrisch en transitief is. De reflexiviteit volgt onmiddellijk uit de definitie van een polynomiale transformatie van een taal, waarin we voor f de identieke functie kunnen nemen. Symmetrie volgt onmiddellijk uit de definitie van en de transitiviteit werd reeds aangetoond in stelling Zoals bij elke equivalentierelatie kunnen we ook hier de equivalentieklassen beschouwen. De klasse P is opgebouwd uit drie van deze equivalentieklassen (zie 49

51 oefening 9). De klasse P is de klasse van de eenvoudige talen binnen de grotere (?) klasse NP. De moeilijkste klasse van talen binnen NP noemt men de NP complete talen (en analoog problemen ). Definitie De klasse NP compleet Een taal L is NP compleet als en slechts als. L NP en 2. voor elke andere taal L NP geldt dat L L. De klasse van alle NP complete talen duiden we aan door NPC. Informeel kan je zeggen dat een NP complete taal een taal is die zo complex is dat elke andere taal in NP er in polynomiale tijd naar kan vertaald worden. Of in termen van problemen geformuleerd: een probleem is NP compleet als het een oplossing heeft (in de vorm van een algoritme) zodanig dat elk ander NP probleem een oplossing heeft die door een polynomiale transformatie van de NP complete af te leiden is. Het is helemaal niet voor de hand liggend dat er NP complete talen bestaan, noch of NPC niet samenvalt met NP of P. We illustreren echter eerst hun belang aan de hand van de volgende stelling. Stelling NPC is een equivalentieklasse voor de relatie (polynomiale equivalentie). 2. Indien NPC P dan is NP = P. Bewijs. Veronderstel dat L,L 2 NPC. Dan geldt per definitie van NP compleetheid dat zowel L L 2 als L 2 L. Bijgevolg zijn L en L 2 polynomiaal equivalent. De klasse NPC behoort dus tot één enkele equivalentieklasse. Bovendien bestaan er geen elementen buiten NPC in deze equivalentieklasse, want indien L NP een taal is die equivalent is met een NP complete taal L, dan weten we dat voor elke andere taal L NP geldt dat L L. Samen met L L, weten we dan dat (stelling 4.3.3) L L, wat aantoont dat L een NP complete taal is. 2. Stel dat L P NPC. Beschouw een willekeurige andere taal L NP. Omdat L NPC geldt dat L L. Hieruit en door het feit dat L P volgt (door stelling 4.3.4) dat ook L P. We hebben aangetoond, onder de voorwaarde dat de doorsnede P NPC niet leeg is, dat NP = P. 5

52 De vorige stelling toont dus aan dat indien er één NP compleet probleem is dat behoort tot de klasse van de problemen die oplosbaar zijn in polynomiale tijd, alle problemen binnen de klasse NP in polynomiale tijd oplosbaar zijn. Alles wijst er echter op dat de klasse NP niet samenvalt met de klasse P (zie figuur.5) NP NPC P Figuur.5: De (mogelijke) onderlinge ligging van de klassen P, NP en NPC Het eerste probleem waarvan men kon aantonen dat het tot NPC behoort was het vervulbaarheidsprobleem (In het Engels: Satisfiability Problem). Dit probleem wordt vaak afgekort met de drie letters SAT en wordt als volgt geformuleerd: Gegeven is een eindige verzameling van Boolse veranderlijken U ={u,u 2,...,u n } (met andere woorden, een veranderlijke u i kan de waarden waar of onwaar aannemen). Met een atoom uit U bedoelen we ofwel één van deze veranderlijken u i ofwel de ontkenning van één van deze veranderlijken die we noteren met ū i (niet u i ). Een formule over U is een deelverzameling van atomen uit U. Zo is bijvoorbeeld {u 2,ū 4,u 7 } een formule die bestaat uit drie atomen. We zullen zeggen dat aan een formule voldaan is na toekenning van waarden (onwaar of waar) aan de variabelen, indien één of meerdere van de atomen uit die formule de waarde waar heeft. Zo is aan de formule {u 2,ū 4,u 7 } voldaan indien u 2 is waar of u 4 is niet waar of u 7 is waar. Beschouwen we nu een eindige verzameling C van formules over U, bijvoorbeeld C = {{u,u 2 }, {u 2,ū 4,u 7 }, {ū 2,u 3 }}. We zeggen dat aan C voldaan kan worden, indien er een waardetoekenning aan de Boolse variabelen u,u 2,...,u n kan gebeuren, zodanig dat aan elk van de formules in C is voldaan. Zo kan aan het voorbeeld worden voldaan, door aan alle variabelen de waarde waar toe te kennen (er bestaan echter nog vele ander mogelijke waardetoekenningen zodat aan C voldaan is). Het is duidelijk dat aan de verzameling formules {{u }, {ū }} niet kan voldaan zijn. Een minder triviaal voorbeeld van een verzameling formules waar niet aan voldaan kan zijn is de volgende verzameling: {{u,u 2 }, {u,ū 2,ū 3 }, {ū }, {u,u 3 }}. Met deze begrippen kunnen we nu het vervulbaarheidsprobleem SAT formuleren: Vervulbaarheidsprobleem SAT Gegeven: een eindige verzameling U van Boolse variabelen en een 5

53 eindige verzameling C van formules over U. Gevraagd: Kan aan C voldaan worden? In 97 kon Cook de volgende stelling aantonen Stelling Stelling van Cook. SAT is NP compleet. Het bewijs van deze stelling is vrij lang en we laten het dan ook achterwege. Dat SAT behoort tot de klasse NP is intuïtief vrij snel in te zien. Als je in een concrete situatie n Boolse veranderlijken hebt en je moet controleren of aan een verzameling formules kan voldaan worden, kun je een niet deterministische Turing machine gebruiken die voor de n veranderlijken een waarde raadt en dan controleert of deze waardetoekenning maakt dat aan alle formules voldaan is. Deze toekenning van willekeurige waarden aan de variabelen en deze controle kan duidelijk gebeuren in een polynomiale tijd, waaruit volgt dat SAT behoort tot NP. Eenmaal dit eerste NP compleet probleem bekend was, heeft men van vele andere problemen ook kunnen aantonen dat ze NP compleet zijn, zoals het geval is voor het eerder vermelde TSP. 52

54 5 Besluit Aan de basis van de studie 3 van de complexiteit van algoritmen, ligt de wens om binnen een bepaald formeel kader snelle algoritmen te karakteriseren en de problemen die een snel algoritme toelaten. Daarbij heeft men al vlug ingezien dat de grootte van de input voor het algoritme een belangrijke rol moet spelen in die karakterisatie. Pas in 965 werd door Jack Edmonds voorgesteld snel te definiëren als polynomiaal in de lengte van de input, daarmee inspelend op het algemeen gevoel dat een polynomiaal algoritme snel genoeg is en een exponentieel te traag. De problemen met een snelle oplossing vormen P. Problemen die niet in P zitten, worden beschouwd als intractable of onbehandelbaar voor praktische doeleinden. Tegen het einde van de jaren 6 werd het duidelijk dat voor sommige ogenschijnlijk eenvoudige problemen (bijvoorbeeld SAT) niemand een polynomiale oplossing vond. Steve Cook bedacht dan de notie van verifieerbaar in polynomiale tijd, t.t.z. de problemen waarvoor in polynomiale tijd kan geverifieerd worden of iets een oplossing is voor het probleem: deze notie is equivalent met NP, immers indien je de oplossing hebt, kan je die oplossing gebruiken om bij elke niet-deterministische keuze, de TM de juiste keuze te laten maken. In 97 bewees Cook dan dat er binnen NP een klasse problemen bestaat die het moeilijkst zijn, nl. de klasse NP-compleet en dat die klasse niet leeg is. Leonid Levin (USSR) bewees hetzelfde resultaat onafhankelijk en praktisch gelijktijdig, maar publiceerde natuurlijk in het Russisch en is daarom minder bekend. Het sluitstuk is de realisatie dat indien één probleem uit NP-compleet ook in P zit, de twee klassen P en NP samenvallen. De (on)gelijkheid van P en NP is echter nog steeds een open probleem, al lijkt wedden op gelijkheid een slechte zaak: er zijn immers te veel problemen waarvoor heel wat onderzoekers gezocht hebben naar een polynomiaal algoritme zonder het te vinden. Voorlopig is het onderscheid tussen NP-compleet en P dus belangrijk omdat men niet mag hopen op een efficiënte oplossingmethode voor intractable problemen (voor steeds grotere invoer). In dat licht moeten we het belang van heuristieken zien: een algoritme implementeert een heuristiek voor een probleem, indien het algoritme een goede benaderende oplossing vindt voor het probleem en misschien optimaal is (en zelfs polynomiaal) voor een deelklasse van het algemene probleem. De notie van goed hangt dan af van de context; als voorbeeld kan het schaakspel dienen: er bestaat geen algoritme om het schaakspel (altijd) te winnen, maar een heuristiek die elke schaakmeester verslaat is natuurlijk goud waard. Zo bestaan er ook zeer goede heuristieken die op efficiënte wijze goede oplossingen vinden voor TSP, maar niet altijd de optimale. 3 aanvang te situeren minstens 5 jaar geleden! 53

55 6 Referenties V.J. Rayward Smith, Inleiding in de berekenbaarheidstheorie, Academic service, 987 S.A. Wiitala, Discrete Mathematics, a unified approach, McGraw Hill Book Company, 987 A.K. Dewdney, The Turing Omnibus, 6 Excursions in computer science, Computer Science Press, 989 J.K. Truss, Discrete Mathematics for Computer Scientists, 2nd edition, Addison Wesley,

56 7 Oefeningen. Vind reguliere expressies die de de volgende talen op Σ = {a,b} bepalen (a) L a, die bestaat uit alle strings die bab bevatten als een deelstring. (b) L b, die bestaat uit alle strings waar geen twee a s na elkaar voorkomen. (c) L c, die bestaat uit alle strings die minstens één a bevatten en hoogstens één b. 2. Construeer voor elk van de talen uit de vorige oefening, een eindige automaat die deze taal herkent. 3. Welke taal wordt door de volgende automaat herkend? Kan je ook in dit geval een reguliere expressie vinden die deze taal bepaalt? 4. Construeer (in detail) een TM M die de functie f : N {,} : n n mod 2 (rest bij deling door 2) berekent. (invoer in unaire notatie, uitvoer is of ) 5. Construeer (in detail) een TM M die de functie f : N N : n n div 2 (Euclidisch quotiënt bij deling van n door 2) berekent. Alles in unaire notatie. 6. Gebruik oefening 4 en 5 om een TM te beschrijven (enkel in woorden, niet in detail) die de functie CODEER, voor het omzetten van de unaire naar de binaire notatie, berekent. 7. Beschrijf een TM die de functie DECODEER (van binair naar unair) berekent. 8. Construeer een TM M die de functie f : N N : x 2x berekent als volgt (de invoer gebeurt zoals steeds in unaire notatie): Plaats na de laatste uit de invoerstring het symbool +. Dupliceer de string van enen voor het +-teken onmiddellijk na dit +-teken. Gebruik nu de TM uit het voorbeeld op pagina 25 om x + x te berekenen. 55

57 9. Construeer een TM M die de taal L = { n n } beslist en een polynomiale tijdscomplexiteit heeft.. Bereken de Gödelcodering van de TM op pagina 24 die de constante nulfunctie berekent.. Geef een voorbeeld van twee afbeeldingen f,g : N R + zodat noch f is O(g), noch g is O(f). 2. Toon aan dat n 3 + 7n 2 log 2 n asymptotisch equivalent is met 3n Beschouw twee afbeeldingen f,g : N R +. Toon aan dat f(n) lim n + g(n) = f is O(g) maar niet g is O(f) A R + f is O(g) en g is O(f) + g is O(f) en f is niet O(g) 4. Bewijs dat de relatie is asymptotisch equivalent met wel degelijk een equivalentierelatie is. 5. Toon aan dat in de rij functies log 2 n n n log 2 n n 2 n k 2 n n! een functie f die links van een functie g staat O(g) is en dat g niet O(f) is. 6. Veronderstel dat f een functie is die asymptotisch equivalent is met n 4. Is f dan zelf een veeltermfunctie? 7. Bereken de complexiteit van het volgende algoritme. (x is een rij van gehele getallen en de functie max bepaalt het maximum van twee gehele getallen) static int maxsom (int [] x ) { int maximum, som; maximum = ; for (int a= ; a < x.length; a++) { som = ; for (int b=a; b< x.length; b++) { som += x[b]; maximum = max (maximum, som); } } return maximum; } 8. Bespreek de werking van de Turing machine M (op pagina 42) die test op het gebalanceerd zijn van de haakjes, bij de invoerstring ((()())) en bij (()))((). 56

58 9. Toon aan dat de klasse P de unie is van drie equivalentieklassen voor de relatie (polynomiale equivalentie), namelijk van de klassen (a) P: tot deze klasse behoren alle talen L op een alfabet T, die voldoen aan L = T. (Dus alle strings met symbolen uit T behoren tot L) (b) P2: tot deze klasse behoren alle lege talen op een willekeurig alfabet T. Dit wil zeggen L =. (c) P3: Dit is de enige interessante klasse, bestaande uit talen L op een alfabet T zodat L T. 57

59 Hoofdstuk 2 Grafentheorie Inleiding. De drie munten In de inleiding zullen we door middel van een aantal voorbeelden laten zien wat een graaf is en welk soort problemen opgelost kunnen worden m.b.v. grafen. Dit moet inzicht geven in welke grafenproblemen interessant zijn. Informeel is een graaf een tekening van punten (die we knopen noemen) die verbonden kunnen zijn door lijnen (bogen). Later definiëren we alles meer formeel. Drie munten liggen op tafel, alle met kop (K) omhoog. Je mag verschillende keren de volgende handeling uitvoeren: neem twee munten, draai ze om en leg ze terug. Gevraagd wordt: is het mogelijk dat na een aantal van zulke handelingen alle munten met de muntkant (M) boven liggen? Eén van de manieren om dit (type van) probleem op te lossen, is een graaf te tekenen met de mogelijke configuraties van de 3 munten als knopen; tussen twee configuraties wordt enkel een verbinding getekend als het mogelijk is om van de ene configuratie naar de andere te gaan door de spelregels te volgen: twee munten tegelijk omkeren. We bekomen de graaf in figuur 2.. K K K K K M K M K M K K K M M M K M M M K M M M Figuur 2.: De graaf met de 3 munten Uit de graaf is vlug duidelijk dat het niet mogelijk is om van de KKK configuratie tot MMM te komen terwijl de spelregels gerespecteerd worden, omdat je niet van KKK naar MMM kan gaan door verbindingen te volgen. 58

60 .2 De wolf, de geit en de kool. Een boer bezit een wolf, een geit en een kool; hij leeft aan de linkeroever van een rivier en wil al zijn bezittingen naar de overkant brengen. Hij heeft een bootje, maar dat is niet groot genoeg om meer dan één van zijn bezittingen tegelijk naar de overkant te varen. Hij zou natuurlijk drie keer over kunnen varen met telkens één van zijn bezittingen, maar zogauw hij de geit en de kool alleen laat, eet de geit de kool op; en hetzelfde geldt voor de wolf en de geit: dat wil de boer natuurlijk vermijden. Bestaat er een manier om alles naar de overkant te brengen? Om dit op te lossen, kan je natuurlijk alle mogelijkheden proberen en dan zit je met het probleem van boekhouding. Hier is een systematische manier om het te doen: schrijf eerst alle mogelijke situaties neer; vermits een situatie volledig vastligt als je weet wat op welke oever is, kan je dat doen door de voorstelling BGK te gebruiken voor de situatie: de boer, de geit en de kool zijn op de linkeroever. Sommige situaties zijn a priori verboden: GK zou willen zeggen dat de geit en de kool op de linkeroever zitten (en de boer en de wolf op de rechteroever of onderweg in het bootje) en dat is verboden, want de geit zou de kool opeten. Alle situaties zijn dus neer te schrijven als in figuur 2.2(a), waarbij gebruikt wordt om aan te duiden dat niets zich op de linkeroever bevindt. BWGK WK BWGK WK BWK K BWK K BGK W BGK W BWG BG G (a) De mogelijke situaties voor de boer, de wolf, de geit en de kool * BWG BG G (b) De graaf voor de wolf, de geit en de kool * Figuur 2.2: De boer, de wolf, de geit en de kool Vervolgens verbinden we elke twee situaties α en β als de boer door overvaren - en eventueel één van zijn bezittingen mee te nemen - de situatie α in β kan wijzigen. We verkrijgen dan de graaf in figuur 2.2(b). Het probleem is nu herleid tot de vraag: bestaat er een pad langs de lijnen van de graaf in figuur 2.2(b) van punt BWGK naar? In het probleem van de munten en dat van de boer, wolf, geit en kool hebben we telkens een probleem herleid tot de vraag naar het bestaan van een pad tussen twee knopen in een graaf: dit is één van de problemen in grafen die we zullen bestuderen. Dikwijls zijn we geïnteresseerd in het kortste pad..3 De bruggen van Königsberg 8de eeuw, Königsberg (nu Kaliningrad in Rusland): door de stad stroomt de Pregel (figuur 2.3), een rivier met daarin twee eilanden, onderling en met de oever verbonden door 7 bruggen. In het weekend wandelen de inwoners van Königsberg over de bruggen en vragen zich af: is het mogelijk om een wandeling 59

61 te maken die alle bruggen één keer aandoet en zodat de wandeling begint en eindigt op dezelfde plaats? In 736 lost de Zwitser Leonhard Euler (77-783) dit probleem op in het eerste artikel dat ooit over grafentheorie verscheen. A B D C Figuur 2.3: De bruggen aan de Pregelrivier Wat heeft het probleem met grafen te maken? Een voorstelling van de bruggen en hoe ze oevers en eilanden verbinden m.h.v. een graaf vind je in figuur 2.4. Het probleem is nu teruggebracht tot zijn essentie: bestaat in die graaf een kring, t.t.z. een gesloten pad, dat alle bogen juist één maal aandoet? Zulk een kring noemt men een Euleriaanse kring. Het zal blijken dat het karakteriseren van grafen die een Euleriaanse kring hebben eenvoudig is, alsook het vinden van een Euleriaanse kring. A B D C Figuur 2.4: De graaf die overeenkomt met de bruggen aan de Pregel Het zoeken van een Euleriaanse kring (of pad) ken je waarschijnlijk ook van het volgende: gegeven een figuur waarin punten met lijnen zijn verbonden, teken de figuur door je pen in een punt te zetten, alle lijnen te volgen zonder een lijn twee keer te doorlopen en zonder je pen ooit op te heffen. In het echte leven is het vinden van een Euleriaanse kring ook van belang, bijvoorbeeld als je de staat van de middenbermen van de snelwegen in België wil controleren: je moet dan alle snelwegen doorlopen maar je wil daarvoor liefst elke snelweg slechts één keer afgaan..4 Het speelgoed van Hamilton Sir William Rowan Hamilton probeerde rond 85 een 3-dimensionale puzzel op de markt te brengen in de vorm van een dodecahedron (2 5-hoeken): figuur 2.5 geeft een vlakke weergave van die ruimtelijke figuur. Elke hoek had de naam van een stad en het probleem is van een weg te vinden die begint bij een stad, elke stad juist één keer aandoet en terug bij de beginstad eindigt. Zulk een weg wordt 6

62 een Hamiltoniaanse kring genoemd: het zal heel wat moeilijker blijken om het bestaan van een Hamiltoniaanse kring te bewijzen of er één te construeren dan voor een Euleriaanse kring. a b e n o f t m s g p r l q k h i j c d Figuur 2.5: De puzzel van Hamilton De puzzel was een commerciële flop, maar het is de voorloper van het reizende verkopers-probleem (TSP) uit het vorige hoofdstuk Er is een probleem dat lijkt op het reizende verkopers-probleem : het postmanprobleem; de postman wil op zijn ronde elke straat juist twee maal doorlopen (eens langs elke kant van de straat) en de vraag is of dat mogelijk is... Figuur 2.6 toont een Hamiltoniaanse kring voor de puzzel van Hamilton. a b e n o f t m s g p r l q k h i j c d Figuur 2.6: Een oplossing voor de puzzel van Hamilton 6

63 2 Grafen 2. Allerhande paden Definitie 2.. Graaf Een (niet-gerichte) graaf G is een koppel (V,E) waarbij V een verzameling van knopen (knoop = vertex) is en E een (multi-)verzameling van bogen (boog = edge) waarbij elke boog e E een niet-geordend paar (v,w) uit V V is; we schrijven e = (v, w) of e = (w, v). (In het Engels: (undirected) graph). We staan ons soms wat vrijheid van notatie toe: we schrijven G(V,E) als afkorting voor: de graaf G met knopen V en bogen E we schrijven e G voor: e E waarbij E de bogen van G zijn (als we al weten dat e een boog is) we schrijven v G voor: v V waarbij V de knopen van G zijn (als we al weten dat v een knoop is) als e een boog is met eindknopen x,y en G de graaf (V,E), dan bedoelen we met G {e} de graaf (V {x,y},e {e}): we zeggen voeg e toe aan G als b een knoop is en G de graaf (V,E), dan bedoelen we met G {b} de graaf (V {b},e) en we zeggen voeg b toe aan G Soms veronderstellen we impliciet dat de knopen genummerd zijn van tot n met n het aantal knopen. We zullen ook enkel met eindige grafen te maken hebben. Een boog wordt ook soms een ribbe genoemd en een knoop een top: dit naar analogie met veelvlakken die mee aan de oorsprong liggen van de grafentheorie. Merk op dat in E twee bogen (v,w) kunnen voorkomen: we noemen zulke bogen parallel. We zeggen dat de boog (v,w) invalt ( is incident on ) in de knoop v (en w) en dat de knopen v en w grenzen ( are adjacent to ) aan de boog (v,w). Het begrip multiverzameling is analoog aan dat van een verzameling, met die uitzondering dat een element meer dan eens mag voorkomen, bv. {,,, 2, 2, 3, 4, 5, 5} is een multiverzameling. 62

64 Definitie 2..2 Gerichte graaf Een gerichte graaf G is een paar (V,E) waarbij V een verzameling van knopen is en E een (multi-)verzameling van bogen waarbij elke boog e E een geordend paar (v,w) uit V V is; we schrijven e = (v,w). (in het Engels: directed graph of digraph) Definitie 2..3 Lus Een lus in een graaf is een boog (v,v). Definitie 2..4 Enkelvoudige graaf Een graaf is enkelvoudig als de graaf geen parallelle bogen noch lussen heeft. Definitie 2..5 Graad van een knoop De graad δ(v) van een knoop v van de graaf (V,E) is het aantal bogen (v,w) E. Opmerking Een lus in een knoop v draagt een factor 2 bij tot de graad δ(v). Definitie 2..6 Geïsoleerde knoop Een knoop v in een graaf (V,E) noemt men geïsoleerd indien δ(v) =. 63

65 Stelling 2..7 Som van de graden van de knopen De som van de graden van de knopen van een graaf is even. Bewijs Vermits elke boog (v, w) één bijdraagt tot de graad van zowel v als w, is de bijdrage van elke boog tot de som van de graden gelijk aan twee en bijgevolg is de som van de graden van de knopen van een graaf even. Stelling 2..8 Aantal knopen met oneven graad In elke graaf is er een even aantal knopen met oneven graad. Bewijs Als de graaf knopen a i (i =,...,n) heeft met even graad en b i (i =,...,m) met oneven graad, dan is door stelling 2..7 en bijgevolg is de stelling waar. ( n ) m = δ(a i ) + δ(b i ) mod 2 = m mod 2 i= i= Definitie 2..9 Pad Een pad (van lengte n) in een graaf (V,E) is een rij bogen (e = (v,v 2 ), e 2 = (v 2,v 3 ),...,e n = (v n,v n+ )). Impliciet wordt hier verondersteld dat bij het geven van een pad, het duidelijk is welke van de (eventueel) parallelle bogen in het pad gebruikt worden. Anderzijds is in een enkelvoudige graaf, een pad ook gekarakteriseerd door de rij knopen (v,...,v n+ ), maar in een graaf die niet enkelvoudig is, kan zulk een rij knopen staan voor meerdere paden. Definitie 2.. Enkelvoudig pad Een enkelvoudig pad (v,...,v n+ ) is een pad waarvan voor alle i j geldt dat v i v j 64

66 Definitie 2.. Kring Een kring is een pad ((v,v 2 ),...,(v n,v n+ )), waarbij alle gebruikte bogen onderling verschillend zijn en waarbij v = v n+. Een kring wordt ook een circuit genoemd. Definitie 2..2 Euleriaanse kring (pad) Een Euleriaanse kring (pad) is een kring (pad) die alle bogen van een graaf juist één maal aandoet en ook alle knopen doorloopt. Definitie 2..3 Hamiltoniaanse kring Een Hamiltoniaanse kring is een kring die alle knopen van een graaf juist één keer aandoet. Definitie 2..4 Samenhangende graaf Een graaf is samenhangend als er voor elke twee verschillende knopen v en w een pad is van v naar w. Stelling 2..5 Het bestaan van een Euleriaanse kring. Een graaf G(V,E) heeft een Euleriaanse kring als en slechts als G samenhangend is en de graad van elke knoop even is. De intuïtie achter het bewijs is dat wanneer je in een knoop toekomt, je er nog altijd weg kan geraken, vermits de graad even is: daardoor maakt het niet zo veel uit welk pad je volgt als je maar niet te vlug terugkeert naar je startpunt. Deed je dat wel, dan kan het pad nog aangepast worden. 65

67 Bewijs Indien de graaf een Euleriaanse kring heeft dan is de graaf samenhangend, want de kring verbindt alle knopen en er is dus een pad van elke knoop naar elke andere knoop. Vermits bij het doorlopen van een kring, we telkens ook vertrekken uit een knoop waar we toekwamen, en vermits alle bogen doorlopen worden door een Euleriaanse kring, moet de graad van elke knoop even zijn. Construeer een kring P in de graaf als volgt: start bij een willekeurige knoop s, volg een willekeurige boog die invalt in s; vanaf dan, breid het partieel pad uit met een willekeurige boog vanaf de laatst toegevoegde knoop, maar gebruik geen boog meer dan eens. Herhaal totdat er geen boog meer voorhanden is. Vermits elke knoop een even graad heeft, is P een kring die in s vertrekt en aankomt. Indien P alle bogen van G gebruikt, is de stelling bewezen. In het andere geval is er een knoop s op het pad P, waaruit er eveneens een boog vertrekt die niet tot P behoort (waarom?). Construeer nu in s een kring P die geen bogen van P gebruikt (waarom kan dit?). We kunnen P toevoegen aan P om een kring te bekomen, die meer bogen gebruikt dan P. We kunnen deze procedure herhalen totdat er geen ongebruikte bogen meer zijn: de Euleriaanse kring is geconstrueerd. Figuur 2.7 illustreert de constructie. s P P s Figuur 2.7: P en de uitbreiding P Stelling 2..6 Bestaan van een Euleriaans pad Een samenhangende graaf G heeft een Euleriaans pad van knoop v naar w (v w) indien v en w de enige knopen zijn met oneven graad. Bewijs Beschouw de graaf G die je verkrijgt door aan G de boog (w,v) toe te voegen. G is samenhangend en elke knoop heeft nu een even graad, bijgevolg 66

68 bestaat een Euleriaanse kring (w,v,...,w); laat uit die kring de eerste boog weg en je verkrijgt een pad (v,...,w) in G. Als je nu terugkijkt naar figuur 2.4 (de graaf voor de bruggen in Königsberg), dan zie je dat alle vier de knopen een oneven graad hebben en dus niet voldoen aan de voorwaarden van de stellingen van Euler; bijgevolg is er geen Euleriaanse kring (noch Euleriaans pad) in die graaf en dus heeft het probleem van de bruggen aan de Pregel een negatieve oplossing. Definitie 2..7 Deelgraaf Een graaf (V,E ) is een deelgraaf van (V,E) indien V V en E E. Definitie 2..8 Component van een graaf Een component C van een graaf G is een maximaal samenhangende deelgraaf van G, t.t.z. C G : C C C is niet samenhangend. Stelling 2..9 Partitie van een graaf De componenten (V i,e i ) (i =,...,n) van een graaf (V,E) vormen een partitie, t.t.z. (V,E) = ( n i= V i, n i= E i) en voor i j, V i V j = en E i E j = Bewijs Het is duidelijk dat elke knoop tot minstens één component moet behoren en ook elke boog. Stel dat een knoop tot twee componenten α en β behoort, dan is de unie van α en β een samenhangende deelgraaf van (V, E) en bijgevolg moet α = β en daaruit volgt dat V i V j = voor i j. Vermits een boog behoort tot de component van zijn eindknopen, is het bewijs gemakkelijk te vervolledigen. De stelling 2..9 is belangrijk omdat het dikwijls eenvoudiger is eigenschappen te bewijzen voor samenhangende grafen en stelling 2..9 geeft ons een manier om op eenduidige wijze een niet-samenhangende graaf in samenhangende delen te verdelen. 2.2 Voorstelling van grafen Tot nog toe hebben we grafen gewoon getekend. Dikwijls hebben we ook een meer formele voorstelling van grafen nodig, bijvoorbeeld als we programma s 67

69 schrijven die grafen behandelen. Sommige voorstellingen lenen zich beter tot manipulatie dan andere en we zullen dan ook meerdere voorstellingsmanieren bekijken. We bekijken eerst niet-gerichte grafen en daarna gebruiken we een variante om gerichte grafen voor te stellen. Voor een graaf G(V,E) met n knopen kunnen we de knopen nummeren van tot n en een n n matrix opstellen met op de (i,j)-de plaats een als (i,j) E en anders een ; die matrix noemen we de buurmatrix van G. a d b c e Figuur 2.8: Voorbeeld De buurmatrix A van de graaf van figuur 2.8 is a b c d e a b c d e Een buurmatrix van een enkelvoudige graaf heeft op de diagonaal alleen maar nullen. Aan de buurmatrix van een graaf kan je niet zien of de graaf parallelle bogen heeft of niet. Een buurmatrix is steeds symmetrisch en daarom niet erg efficiënt als voorstelling. Toch heeft de buurmatrix interessante eigenschappen. Laat ons A 2 berekenen; we verkrijgen: A 2 = We verkregen het (a,c)-de element van A 2 door: ( ) = = 2 68

70 en de positieve bijdragen aan het resultaat komt van paden (a,b) (b,c) en (a,d) (d,c). Dat wijst erop dat A 2 [i,j] = het aantal paden van knoop i naar knoop j met lengte 2. Maar we moeten toch oppassen met die uitspraak: de buurmatrix laat geen parallelle bogen zien en parallelle bogen vergroten het aantal paden tussen twee knopen. Daarom beperkt de volgende stelling zich tot enkelvoudige grafen: Stelling 2.2. Indien A de buurmatrix is van een enkelvoudige graaf G(V,E), dan is A n [i,j] = het aantal paden met lengte n van knoop i naar knoop j. Bewijs We gebruiken inductie op n. Voor n = is de stelling waar door de definitie van buurmatrix. Stel dat de stelling waar is voor n, we bewijzen dat de stelling waar is voor (n+): we weten dat A n+ = A n A en dus A n+ [i,j] = n k= A n [i,k] A[k,j]; door de inductiehypothese is A n [i,k] het aantal paden van i naar k en als er een boog van k naar j is (t.t.z. als A[k,j] = ) dan zijn er ook A n [i,k] aantal paden van i naar j die langs k passeren juist voor ze in j toekomen. Vermits geen twee paden dezelfde zijn (waarom niet?) verkrijgen we het resultaat voor (n + ). Voor de graaf van 2.8 is A 4 = Gebruik makend van voorgaand resultaat kunnen we inzien dat ( n k= A k )[i,j] gelijk is aan het aantal paden korter dan n bogen van i naar j. Een ander gebruik van de buurmatrix vinden we door de buurmatrix niet te vullen met of, maar met met de boolse waarden true of false; matrixvermenigvuldiging wordt dan gedefinieerd als: (A B)[i,j] = (A[i,] B[,j]) (A[i,2] B[2,j])... (A[i,n] B[n,j]) Als B de boolse buurmatrix van de graaf G voorstelt, dan is B n [i,j] gelijk aan de waarheidswaarde van er is een pad met lengte n van i naar j. En analoog is ( n k= B k )[i,j] (de som is hier ook nu de boolse som, t.t.z.!) de waarheidswaarde van er is een pad van lengte kleiner dan of gelijk aan n van i naar j. Terwijl de waarden in de machten van de gewone buurmatrix onbeperkt stijgen, zijn die voor de boolse buurmatrix f alse of true en monotoon stijgend en dus bestaat de limiet. Het is een manier om de transitieve sluiting van de relatie gedefinieerd door de bogen te berekenen en de limiet wordt gevonden na hoogstens n vermenigvuldigingen, als n het aantal knopen in de graaf is. We zien hiervan een toepassing bij gerichte grafen. 69

71 De transitieve sluiting van een relatie R is de kleinste transitieve relatie R zodanig dat R R : als toepassing van het hoofdstuk over vaste-puntstheorie, zullen we bewijzen dat elke relatie een transitieve sluiting heeft. Een andere voorstelling van een graaf is gegeven door de incidentiematrix I: die heeft voor elke knoop een rij en voor elke boog een kolom. I[i,j] = indien de j-de boog i als eindpunt heeft en anders. De incidentiematrix van de graaf in figuur 2.8 a b c d e ab ad cd bc ce be In de incidentiematrix vind je lussen en ook parallelle bogen terug. De voorstelling van een gerichte graaf kan gebeuren zoals bij niet-gerichte grafen: een buurmatrix die een heeft op de (i,j)-de plaats indien er een gerichte boog van i naar j bestaat, en anders een. De matrix is nu niet meer symmetrisch, maar we hebben daar eigenlijk nooit gebruik van gemaakt en de veralgemening van stelling 2.2. ligt voor de hand, evenals de definitie van de boolse buurmatrix. Een belangrijke toepassing van de boolse buurmatrix ligt in het opsporen van de functies die opgeroepen worden (rechtsreeks of onrechtsreeks) door een andere functie in het programma; de directe-oproep relatie kan men voorstellen door een gerichte graaf of door zijn boolse buurmatrix B. De matrix verkregen als de boolse som B i stelt de transitieve sluiting van de boog-relatie voor en bevat rechtstreeks de informatie of een functie een andere oproept of niet. Het is bovendien gemakkelijk te zien welke functies nooit opgeroepen worden: dat zijn de functies die niet verbonden zijn met de hoofdfunctie (main); zulke functies zijn in het compiler jargon dode code. 2.3 Isomorfisme van grafen We voeren het volgende experiment uit: een groep studenten wordt gevraagd een blad en een pen te nemen en zonder spieken de opdracht uit te voeren teken 5 punten en zet er een naam bij verbind het eerste punt dat je tekende met het tweede verbind het tweede met het derde punt verbind het derde met het vierde verbind het vierde met het vijfde verbind het vijfde met het eerste 7

72 e d a A b B C 4 D c E G G2 G Figuur 2.9: Drie verschillende of drie dezelfde grafen? Er is een goede kans dat sommige studenten één van de grafen uit figuur 2.9 hebben getekend. Al zien die grafen er verschillend uit, ze zijn getekend aan de hand van dezelfde instructies en we zouden ze dus graag als gelijk beschouwen, daarom de volgende Definitie 2.3. Isomorfisme van grafen De grafen G i (V i,e i ) (i =,2) worden isomorf genoemd, indien er een bijectie f : V V 2 bestaat zodanig dat g : E E 2 gedefinieerd door g((v,w)) = (f(v),f(w)) voor alle v,w E goed gedefinieerd (d.w.z. dat g((v,w)) E 2 ) is en een bijectie. Dergelijke f noemen we een isomorfisme tussen de twee grafen. Tussen graaf G en G 2 van figuur 2.9 kan een isomorfisme f gedefinieerd worden door: f(a) = B f(b) = C f(c) = D f(d) = E f(e) = A en je kan nagaan dat G en G 2 inderdaad isomorf zijn. Er is een andere karakterisatie van isomorfe grafen m.b.v. de volgende Stelling Karakterisatie van isomorfe grafen m.b.v. de incidentiematrix De grafen G en G 2 zijn isomorf als en slechts als er een ordening van de knopen en bogen bestaat waarvoor de incidentiematrices van G en G 2 gelijk zijn. Bewijs Veronderstel dat G en G 2 isomorf zijn, via een isomorfisme f. Kies een 7

73 willekeurige orde op de knopen van G, dan volgt de orde op de knopen van G 2 door: f(v) < f(w) v < w; de orde op de bogen van G 2 wordt analoog geïnduceerd door de orde op de bogen van G en de bijectie tussen de bogen. De incidentiematrices zullen gelijk zijn. Als de incidentiematrices gelijk zijn, is het isomorfisme f triviaal te construeren en het isomorf zijn volgt direct. We weten al dat de buurmatrix niet volledig een graaf bepaalt: immers parallelle bogen zijn niet zichtbaar in de buurmatrix. Daarom de meer beperkte stelling: Stelling Karakterisatie van isomorfe enkelvoudige grafen m.b.v. de buurmatrix De enkelvoudige grafen G en G 2 zijn isomorf als en slechts als er een ordening van de knopen bestaat waarvoor de buurmatrices van G en G 2 gelijk zijn. 2.4 Gewogen grafen Bewijs Het bewijs mag je zelf geven. De stellingen over isomorfisme van grafen, geven een manier om isomorfisme te testen bij een meer concrete voorstelling van de graaf (m.b.v. de buur- of incidentiematrix): dat is nuttig bij het programmeren. Elk bekend algoritme om te testen of twee grafen isomorf zijn, is minstens exponentieel. Er bestaan echter heel efficiënte testen die kunnen aantonen dat twee grafen niet isomorf zijn: daarbij gaat men na of een eigenschap die invariant is onder isomorfisme, geldig is voor beide grafen. De eenvoudigste voorbeelden van invariante eigenschappen (onder isomorfisme van grafen) is het aantal knopen en het aantal bogen : dat volgt direct uit definitie Wanneer we meer over grafen hebben geleerd, zullen we nog meer eenvoudig te testen eigenschappen kennen die al dan niet invariant zijn onder isomorfisme. Definitie 2.4. Gewogen graaf Een gewogen graaf (V,E) is een graaf waarbij elke boog e E een gewicht w(e) R + heeft. Het gewicht w(g) van een gewogen graaf G, is de som van de gewichten van de bogen van G. Het gewicht van een boog kan men zien als de lengte van de boog of een kost geassocieerd met het doorlopen van de boog: de graaf kan bijvoorbeeld een wegennetwerk tussen steden voorstellen en het gewicht is dan de afstand tussen steden of de tol die voor het gebruik van de weg tussen twee steden geheven wordt. 72

74 Met het gewicht van een graaf bedoelt men de som van de gewichten van alle bogen van de graaf; met gewicht van een pad de som van de gewichten van de bogen van het pad. Als de graaf een wegennetwerk voorstelt, is het duidelijk dat het kennen van een kortste pad tussen twee knopen, t.t.z. een pad met kleinste gewicht dat de twee knopen verbindt, interessant is. Vermits deze twee knopen noodzakelijkerwijze in dezelfde component moeten liggen (waarom?) hebben we het in deze sectie steeds over samenhangende grafen. Het bestaan van een kortste pad in een samenhangende (eindige!) graaf ligt voor de hand. In de rest van deze sectie zullen we een constructieve methode behandelen om een kortste pad te vinden en zullen we aantonen dat deze methode in zekere zin optimaal is. We zullen in deze sectie steeds met enkelvoudige grafen werken: immers, lussen komen niet voor in een kortste pad en van een stel parallelle bogen hebben we genoeg met de kortste. (je kan dat zelf formeel bewijzen). Algoritmen in dit hoofdstuk bestaan uit een opeenvolging van opdrachten genummerd,2,.... Op het textueel einde van elke opdracht n staat impliciet Ga naar opdracht (n+). Met stop wordt bedoeld dat het algoritme gedaan is. Algoritme Kortste-pad algoritme van Dijkstra Gegeven twee verschillende knopen a en z in een samenhangende gewogen graaf G(V,E) met gewichten w(x,y) voor bogen (x,y); de lengte van een kortste pad van a naar z wordt gevonden door algoritme:. Initialisatie: zet T gelijk aan V en definieer de afbeelding L op V door L(a) = en L(x) =, x V \{a} 2. Kies volgende: kies een v T met kleinste L(v) en zet T gelijk aan T \{v} 3. Herbereken L: voor alle knopen y in T die verbonden zijn met knoop v, zet L(y) = min(l(y),l(v) + w(v,y)) 4. Test einde: indien z / T stop anders ga naar Kies volgende. Bewijs We bewijzen eerst de eindigheid: elk van de 4 onderdelen van het algoritme bestaat duidelijk uit een eindig aantal operaties en is bijgevolg eindig. Vermits in Kies volgende één knoop uit T wordt verwijderd en T aanvankelijk eindig was en er nooit elementen worden toegevoegd aan T, wordt Kies volgende slechts een eindig aantal keren uitgevoerd voordat z / T waarna het algoritme stopt. De correctheid zullen we bewijzen door aan te tonen dat de volgende drie uitspraken waar zijn vlak voor Kies volgende en vlak voor Test einde: U: x V \T: L(x) is de lengte van een kortste pad van a naar x U2: x V \T, kortste pad van a naar x met enkel knopen V \T U3: v T : L(v) = min x V \T (L(x) + kost(x,v)) 73

75 Hierin is kost(i, j) = w(i, j) indien er een boog (i, j) bestaat en anders gelijk aan. De correctheid van het algoritme is dan bewezen doordat het eindigt en dus uiteindelijk z / T, waardoor U voor z juist zegt wat het algoritme beweerde te doen. Het is duidelijk dat U, U2 en U3 waar zijn nadat de initialisatie en punten 2,3 en 4 één keer zijn uitgevoerd, dus de tweede keer dat de uitvoering van het algoritme vlak voor Kies volgende komt. (Waarom komt de uitvoering zeker een tweede keer langs dat punt?) Stel nu dat de drie uitspraken waar waren de n-de keer dat het algoritme vlak voor Kies volgende kwam; we bewijzen nu dat de uitspraken ook waar zijn de n-de keer dat we vlak voor Test einde komen: In Kies volgende kozen we een v T; we bewijzen dat daarvoor geldt dat L(v) is de lengte van een kortste pad van a naar v en dat kortste pad bestaat enkel uit knopen V \T afgezien van v zelf; stel L(v) is niet de lengte van een kortste pad van a naar v; neem een kortste pad P van a naar v; P = (a = x,x 2,...,x m+ = v); daarvan is w(x i,x i+ ) < L(v); stel x,...,x j V \T en x j / V \T; dan is L(x j ) < L(v) hetgeen de keuze van v tegenspreekt; bijgevolg moeten alle x j V \T behalve x m+ = v. Vermits voor v de eigenschap vermeld in U3 waar is, en vermits we net aantoonden dat een kortste pad van a naar v loopt over knopen in V \T, zijn U en U2 waar nadat we v verwijderd hebben uit T. Herbereken L herstelt U3 voor de andere knopen. Het is duidelijk dat als U, U2 en U3 waar zijn als het algoritme de n-de keer vlak voor Test einde komt, de uitspraken nog waar zijn als het algoritme de (n+)-de keer vlak voor Kies volgende komt. Door inductie zijn de uitspraken steeds waar op die bepaalde plaatsen. Een klein voorbeeld van hoe het algoritme werkt, vind je in figuur 2.. De knopen v T hebben de waarde van L(v) in een rechthoekige kader; de knopen v die al eens gekozen werden, hebben hun L(v) in een cirkel. Bemerk dat intermediair L(z) = 5 maar uiteindelijk is L(z) = 4 zoals het moet. Merk op dat het algoritme van Dijkstra niet een kortste pad berekent, maar enkel de lengte ervan. Om het pad zelf te kennen, wijzigen we het algoritme als volgt: associeer met elke knoop v ook een stukje informatie I(v); in de initialisatie zet je I(v) =, v V ; Herbereken L wordt nu: Herbereken L - bis: voor alle knopen y die verbonden zijn met knoop x, indien L(y) > L(x) + w(x,y) zet I(y) = x en L(y) = L(x) + w(x,y)) Een kortste pad wordt nu verkregen door vanuit knoop z achteruit de informatie I te volgen:, m.a.w. het pad (z,i(z),i 2 (z),...,i n (z) = a) is een kortste pad van z naar a. Figuur 2. laat de opeenvolgende fazen in het (uitgebreide) algoritme zien voor dezelfde graaf als voorheen: bij de relevante knopen v staat nu I(v) in een driehoek. 74

76 c c 3 3 a z a z b b 3 na initialisatie na keuze knoop a en herbereken L c 3 c 3 c 3 a z a z a z b 3 na keuze b en herbereken L b 3 na keuze c en herbereken L b 3 z gekozen en einde Figuur 2.: Illustratie van Dijkstra s algoritme Stelling De complexiteit van Dijkstra s algoritme is O(n 2 ) waarbij n het aantal knopen is. 2.5 Vlakke grafen Bewijs De stap Herbereken L wordt hoogstens n keer uitgevoerd. In Herbereken L wordt voor maximaal n knopen de grootheid L aangepast; ook Kies volgende vraagt hoogstens n operaties en bijgevolg zijn er maximaal 2 n 2 knoopoperaties in het algoritme. In een graaf met n knopen die volledig verbonden is, zijn er n (n )/2 bogen, die alle moeten beschouwd worden en bijgevolg is de complexiteit van het algoritme O(n 2 ). Intuïtief is een vlakke graaf, een graaf die je op papier kan tekenen zonder dat twee bogen mekaar snijden: je hebt geen derde dimensie nodig om de graaf te realiseren. Bij de studie van vlakke grafen, spelen bepaalde grafen met een speciale eigenschap een belangrijke rol: de grafen waarvan de knopen in twee disjuncte verzamelingen kunnen verdeeld worden zodanig dat er geen bogen zijn tussen knopen binnen dezelfde verzameling. Figuur 2.2 laat zulk een graaf zien. 75

77 c c 3 a 3 a z a z b b 3 a na initialisatie na keuze knoop a en herbereken L c 3 a c 3 a c 3 a a z b a 4 z c a 4 z c b 3 a na keuze b en herbereken L b 3 a na keuze c en herbereken L b 3 a z gekozen en einde Figuur 2.: Illustratie van Dijkstra s uitgebreide algoritme Definitie 2.5. Tweeledige graaf Een tweeledige graaf is een graaf (V,E) waarvan V = V V 2 zodanig dat V V 2 = en E V V 2 Met K n,m zullen we in het vervolg de tweeledige graaf aanduiden waarvan V n elementen bevat en V 2 m en waarvan elke knoop van V verbonden is met elke knoop van V 2. K n,m komt van pas als je n huizen wil verbinden met m nutsvoorzieningen (water, elektriciteit, gas, internetaansluiting...). Met K n zullen we de graaf met n knopen aanduiden, waarbij er een boog is tussen elke twee knopen - zulke grafen noemt men volledig verbonden en met spreekt ook wel van een kliek (in het Engels clique). De K is ter ere van Kuratowski. In figuur 2.2 vind je een voorstelling van K 4 en van K 2,2. Figuur 2.2: K 4 en K 2,2 Als je K n tekent op papier voor opeenvolgende waarden van n, en je probeert dat te doen zodanig dat geen twee bogen mekaar kruisen op je tekening, dan merk je dat je vanaf n = 5 daar niet meer in slaagt. En als je K n,m tekent voor 76

78 opeenvolgende waarden van (n, m) merk je dat de graaf steeds kruisende bogen heeft voor n,m > 2. Er is iets speciaals aan grafen die je kan tekenen zonder dat bogen mekaar kruisen: zulke grafen worden vlak genoemd. Een toepassing van het begrip vlakke graaf vind je in het beschouwen van een net van wegen tussen steden: indien de graaf van het wegennet vlak is, betekent dit dat er geen kruispunten (noch bruggen of tunnels) nodig zijn. In 752 bewees Euler de volgende formule 2 : Stelling Eulers formule voor vlakke grafen: Indien G een samenhangende vlakke graaf is met e bogen, v knopen en f zijvlakken dan v e + f = 2. We hebben zijvlak niet formeel gedefinieerd: intuïtief is het een stukje van het vlak dat omsloten wordt door een zo klein mogelijke kring, maar ook het stuk van het vlak dat buiten de graaf ligt (het oneindig grote stuk) telt mee als een zijvlak. De oorsprong van de term zijvlak (in het Engels face) is weer bij de veelvlakken te vinden. Bewijs van de formule van Euler: We gebruiken inductie op het aantal bogen. Stel e =. Dan is G één van de grafen in figuur 2.3. In beide gevallen is de formule van Euler correct. Stel dat de formule juist is voor grafen met n bogen. Laat G een graaf zijn met (n + ) bogen. f=2, e=, v= f=, e=, v=2 Figuur 2.3: De twee grafen met e = ) Onderstel eerst dat G geen kringen bevat. Neem een maximaal enkelvoudig pad in G; dat pad bevat een knoop a met δ(a) = : beschouw de graaf G die je verkrijgt door uit G a te verwijderen alsook de enige boog die erin toekomt; G heeft knoop en boog minder dan G en hetzelfde aantal zijvlakken en G is nog steeds samenhangend (waarom?), dus voor G geldt de formule van Euler, dus ook voor G (zie bijvoorbeeld figuur 2.4). 2) Stel nu dat G een kring bevat: neem een boog x van een kring van G; verwijder de boog x maar niet de knopen die de boog verbindt; we verkrijgen G (zie bijvoorbeeld figuur 2.5). G heeft n bogen en nog evenveel knopen als G, maar 2 Descartes (± 6) kende de formule reeds, en waarschijnlijk ook Archimedes (± 25) 77

79 a G G Figuur 2.4: G zonder kringen één zijvlak minder dan G; bovendien is G samenhangend (waarom?); dus voor G geldt (door de inductiehypothese) de formule van Euler en bijgevolg voor G ook. x G G Figuur 2.5: G met een kring Opmerking: de voorwaarde dat de graaf samenhangend is, is essentieel; de graaf met juist twee knopen en zonder boog, heeft f =,e =,v = 2 en de formule van Euler is duidelijk niet geldig. De oorsprong van Euler s interesse in de formule, was gelegen in de studie van ruimtelijke figuren, met name de polyhedra: de veelvlakken; die interesse bestaat al sinds de Griekse oudheid: in de regelmatige polyhedra vond men de bouwstenen van de wereld. De formule drukt het verband uit tussen het aantal vlakken, ribben en hoekpunten van een polyhedron. De transformatie van een polyhedron naar een vlakke graaf gaat als volgt: beeld je in dat de polyhedron van rekbaar materiaal is gemaakt, zoals een ballon en dat de hoekpunten en ribben erop getekend zijn; prik een gaatje in het midden van een willekeurig vlak, rek dat gaatje open totdat al het materiaal in een plat vlak ligt. De resulterende figuur gevormd door de ribben en hoekpunten is de vlakke graaf; het vlak dat doorprikt werd, komt overeen met het oneindige zijvlak. Stelling K 3,3 en K 5 zijn niet vlak. Bewijs Veronderstel dat K 3,3 wel een vlakke graaf is. Laat β het aantal bogen voorstellen dat een zijvlak begrenst (tel een boog n keer als hij n zijvlakken begrenst). Vermits elke boog maximaal 2 zijvlakken begrenst, hebben we voor elke vlakke graaf 2 e β (in het algemeen begrenzen sommige bogen geen 78

80 zijvlak). In K 3,3 heeft elke kring minimaal 4 bogen (waarom?) en dus is β 4 f. Samen met de vorige ongelijkheid hebben we dus: e 2 f. Stel dat K 3,3 vlak is. Door gebruik van de formule van Euler om in het rechterlid f te elimineren, bekomen we e 2 (e v + 2). Vul daarin de waarden van e en v in voor K 3,3 en we verkrijgen 9 en contradictie. Bijgevolg is K 3,3 niet vlak. In K 5 heeft elke kring minimaal 3 bogen... en het vervolg van het bewijs is analoog. We hebben vroeger de definitie van isomorfe grafen gezien, maar soms lijken twee grafen op elkaar zonder dat ze hetzelfde aantal knopen hebben: als we in het midden van een boog van een graaf een extra knoop zetten, dan hebben we weinig essentieels aan de graaf veranderd (als de graaf vlak was, blijft ze vlak; als de graaf samenhangend of... - vul zelf nog wat eigenschappen in - was, behoudt ze die eigenschap). Daarom is de volgende transformatie op grafen ingevoerd: drie (verschillende) knopen a,b,c van een graaf liggen op een rij als er bogen (a,b) en (b,c) bestaan en als er geen andere bogen invallen in b (anders gezegd: δ(b) = 2). Een rijreductie bestaat erin om uit de oorspronkelijke graaf de bogen (a,b) en (b,c) en de knoop b te verwijderen en een nieuwe boog (a,c) toe te voegen: zie figuur 2.6. a b c a c Figuur 2.6: Een rijreductie op een graaf Definitie Twee grafen G en G 2 worden homeomorf genoemd als beide grafen door een rij rijreducties kunnen herleid worden tot dezelfde graaf G Stelling Stelling van Kuratowski Een graaf G is vlak als en slechts als G geen deelgraaf bevat die homeomorf is met K 5 of K 3,3. 79

81 Bewijs Indien G een deelgraaf bevat die homeomorf is met K 5 of K 3,3, dan is het duidelijk dat G niet vlak kan zijn, vermits K 5 noch K 3,3 het zijn. Omgekeerd is de stelling moeilijker te bewijzen. Deze stelling maakt K 5 en K 3,3 in zekere zin tot de kleinste niet-vlakke grafen. 2.6 Het kleuren van grafen Definitie 2.6. Met een kleuring van een graaf (V, E) bedoelt men een toekenning van een kleur aan elke v V zodanig dat de kleur van v en w verschillen indien (v,w) E. Een n-kleuring is een kleuring met n of minder verschillende kleuren. Een minimale kleuring is een n-kleuring met minimale n. Er zijn heel wat praktische toepassingen van het (minimaal) kleuren van een graaf. Als voorbeelden Je moet 4 vergaderingen plannen voor 4 personen A,B,C en D. In de eerste vergadering zitten A,B; in de tweede A,C, in de derde zitten B,C,D en in de vierde C,D. Wat is het minimale aantal tijdstippen waarop een vergadering moet gepland worden? Twee vergaderingen moeten op een verschillend tijdstip doorgaan als eenzelfde persoon aan beide vergaderingen moet deelnemen. Je kan het probleem voorstellen door de graaf van figuur 2.7: elke knoop stelt een vergadering voor en twee vergaderingen zijn verbonden als ze niet op hetzelfde tijdstip mogen doorgaan omdat er iemand in beide vergaderingen moet zijn. Je zoekt er de kleuring met het kleinste aantal kleuren voor en je hebt het antwoord (elke nieuwe kleur komt overeen met een nieuw tijdstip). A,B C,D A,C B,C,D Figuur 2.7: De vergaderingsgraaf met kleuring Je moet in een warenhuis een aantal goederen opstapelen in de rekken, maar je mag bepaalde goederen niet naast elkaar zetten: bijvoorbeeld benzine mag niet naast brood, porno niet naast kuisproducten enzovoort. Ook hier kan je een graaf opstellen die al die beperkingen voorstelt en waarbij een kleuring van de graaf het probleem oplost. 8

82 Een compiler tracht integer variabelen in machineregisters te houden in plaats van in het geheugen. Typisch zijn er meer variabelen dan registers, doch soms kan hetzelfde register gebruikt worden voor meer dan één variabele. Bijvoorbeeld in { } int i,j,k,l,m; i = ; j = 2; k = i+j; i = 3; j = 4; l = i+j; m = k+l; kan aan i en l hetzelfde register worden toegekend en aan k en m ook. Dat kan men vinden door de interferentie-graaf van het stukje code neer te schrijven, d.w.z. een graaf met als knopen de variabelen en een boog tussen twee variabelen als ze tegelijkertijd in leven zijn. We bekomen de graaf in figuur 2.8. i 2 j 2 m k l 3 2 Figuur 2.8: De interferentiegraaf met kleuring (in cijfers) Een minimale kleuring geeft aan hoeveel registers je minimaal moet hebben om elke veranderlijke in een register te bewaren. Een probleem dat ook een praktisch aspect heeft, maar vooral historisch belangrijk is, is het vier-kleurenprobleem: kan elke landkaart gekleurd worden met vier verschillende kleuren zodanig dat twee aangrenzende landen nooit dezelfde kleur hebben? Het probleem werd voor het eerst gesteld door Francis Guthrie rond 85. De conjectuur bleef onbewezen - ondanks verwoede pogingen van menig wiskundige - tot 976, toen K. Appel en W. Haken bewezen dat er 936 grafen bestaan waarvan er minstens één terug te vinden is in elke minimale niet 4-kleurbare graaf en vervolgens bewezen dat zulke grafen niet minimaal zijn. Beide stappen in het bewijs werden geleverd door een computerprogramma. 8

83 Laten we nu het verband met grafen zien: we zullen van een vlakke kaart een vlakke graaf maken en het kleuren van de kaart herleiden tot het kleuren van de graaf. Een vlakke kaart is een vlakke graaf G waarvan de zijvlakken geïnterpreteerd worden als landen en de bogen als de grenzen tussen de landen. De duale graaf van G, G wordt als volgt geconstrueerd: teken een knoop in elk land van G (ook een knoop voor het onbegrensde stuk van de kaart) en verbind twee knopen door een boog indien de twee knopen in aangrenzende landen liggen. Figuur 2.9: Twee vlakke kaarten en hun duale grafen Merk op dat de duale graaf van een vlakke kaart vlak is (en enkelvoudig). Stelling Voor elke vlakke, enkelvoudige graaf G met meer dan één boog geldt dat e 3 v 6 Bewijs We bewijzen de stelling enkel voor het geval G ook samenhangend is: verwijder eerst uit G knopen met graad = (en de bijbehorende boog), totdat er geen zulke knoop meer bestaat. Je hebt nu graaf G die nog steeds vlak, enkelvoudig en samenhangend is, met f zijvlakken en e bogen en v knopen. Bovendien is e e = v v het aantal verwijderde knopen of bogen: noteer dat aantal door t. ) Indien e = dan moet v = ; vermits e > is t > ; verder kunnen we schrijven: e = t en 3 v 6 = 3 (v + t) 6 = 3 t 3 en vermits t 3 t 3 is ook e 3 v 6. 2) e kan niet gelijk zijn aan of 2 (waarom niet?), dus 3) e > 2; nu is elke zijvlak begrensd door minstens 3 bogen (vermits er geen lussen noch parallelle bogen zijn); stel met de som voor van het aantal bogen 82

84 in alle zijvlakken, dan is 3 f; vermits elke boog grenst aan exact 2 zijvlakken (waarom?), is ook = 2 e, bijgevolg is 2 e 3 f. Gebruik nu de formule van Euler voor G om f te elimineren uit die ongelijkheid en je krijgt: e 3 v 6 en dus ook e + t 3 (v + t) 6 en dus e 3 v 6. Stelling In elke vlakke, enkelvoudige graaf bestaat er minstens één knoop, zeg v, zodanig dat δ(v) 5. Bewijs Dit is duidelijk waar voor een graaf met of 2 knopen. Stel dat de stelling niet voldaan is voor een bepaalde graaf met minstens 3 knopen, d.w.z. alle knopen hebben graad 6 of meer, dan is de som van de graden van alle knopen minstens 6 v, en bijgevolg e 3 v, hetgeen in tegenspraak is met e 3 v 6. Het is nu duidelijk dat het kleuren van de vlakke kaart equivalent is met het kleuren van de duale graaf. De volgende stelling laat zien dat het kleuren van een vlakke graaf altijd kan met vijf kleuren: Stelling Elke enkelvoudige, vlakke graaf G(V, E) heeft een 5-kleuring. Bewijs We zullen inductie op het aantal knopen gebruiken: indien G juist één knoop heeft, is de stelling duidelijk waar. Veronderstel verder dat G samenhangend is; zoniet is de stelling waar voor elke component van G en bijgevolg voor G. Stel dat de stelling waar is voor grafen met n knopen; stel G heeft n + knopen. Dan bestaat er wegens de vorige stelling minstens één knoop v met graad 5 of minder. Indien de knoop graad 4 of minder heeft, komt v voor in de graaf G als in tekening 2.2. v v v v v Figuur 2.2: De 5 mogelijkheden waarbij δ(v) < 5 Beschouw de graaf G die je verkrijgt door uit G v weg te laten en alle bogen die in v toekomen. G voldoet aan de voorwaarden van de stelling en heeft n knopen, bijgevolg heeft G een 5-kleuring. Vermits v hoogstens 4 buren heeft, kan je aan v een kleur toekennen die verschillend is van de buren en toch één van de 5 kleuren is die voor de 5-kleuring van G gebruikt werden. Indien δ(v) = 5, dan komt v voor in G zoals op de figuur 2.2: bij elke buur w i 83

85 van v is ook de kleur c i (i =,...,5) gezet, zoals bepaald door de 5-kleuring van G. c5 w5 c w c4 w4 v w3 c3 w2 c2 Figuur 2.2: δ(v) = 5 We moeten nu nog een kleur bepalen voor v. Indien de buren van v niet alle 5 kleuren opgebruiken, kunnen we v een overblijvende kleur geven. Stel dus dat alle c i verschillend zijn. Beschouw de verzameling P,3 van alle paden in G die bij w beginnen en waarvan de knopen afwisselend de kleuren c en c 3 hebben. Zulke paden noemen we c c 3 paden. Er zijn nu twee mogelijkheden: P,3 bevat geen pad dat w 3 bevat: verander elke knoop in P,3 met kleur c in c 3 en elke knoop in P,3 met kleur c 3 in c. We hebben nog altijd een 5-kleuring van de graaf G (waarom?) en nu hebben knopen w 3 en w beide de kleur c 3 zodat v geen buur heeft met kleur c dus de nieuwe 5-kleuring van G kan uitgebreid worden tot een 5-kleuring van G door aan v de kleur c toe te kennen. P,3 bevat een pad p,3 dat w 3 bevat: construeer nu ook P 2,5 : zoals je op de figuur 2.22 kan zien, kan P 2,5 geen pad bevatten dat w 5 bevat; immers, als zulk een pad p 2,5 bestond dan konden de paden p,3 en p 2,5 beide uitgebreid worden met de knoop v en kringen vormen in G, en die kringen zouden mekaar ergens moeten snijden, wat niet mogelijk is vermits G vlak is. Nu kunnen we door omwisseling van de kleuren van de knopen in P 2,5 analoog met het eerste geval de stelling bewijzen. Appel en Haken bewezen dat elke vlakke graaf een 4-kleuring heeft en bijgevolg bewezen ze dus de vier-kleurenconjectuur voor vlakke kaarten. Misschien is dit het juiste ogenblik om even stil te staan bij het concept van een bewijs m.b.v. de computer : of iets als bewijs geldt of niet, is grotendeels een sociaal gebeuren; het is misschien wel juist te beweren dat de mathematische correctheid van een bewijs onafhankelijk is van of anderen akkoord zijn met die correctheid, maar een bewijs bestaat maar bij de gratie van een gemeenschap die het aanvaardt - zelfs als het bewijs later verkeerd blijkt te zijn. Het is dus aan de gemeenschap (enkel de wiskundige gemeenschap?) dat het toekomt om in het algemeen computergesteunde bewijzen te accepteren of niet: men kan zich een tak van de wetenschap voorstellen die enkel bewijzen geleverd door mensen op papier aanvaardt, net zoals er een tak van de wiskunde is die wel constructieve 84

86 snijdende bogen c5 w5 c w c4 w4 v w3 c3 w2 c2 Figuur 2.22: p,3 en p 2,5 maar geen existentiële bewijzen aanvaardt. Het is dus zelfs niet mogelijk enkel gebaseerd op wetenschappelijke argumenten te beslissen of computergesteunde bewijzen geldig kunnen zijn of niet. Feit is wel dat naar gelang er meer bewijzen per computer worden geleverd, de druk groter is om ze te aanvaarden, vooral als wetenschappers geen andere manier weten om het bewijs te leveren, en zeker als er nuttige of bruikbare gevolgen aan vastzitten. Anderzijds is het dikwijls mogelijk om een computerbewijs in principe na te kijken met de hand. Een hand-matig nakijken van het bewijs moet nu het computerprogramma nakijken, of liever: bewijzen dat het correct is. Maar een formeel bewijs van de correctheid van grote computerprogramma s is nog altijd niet doenbaar. Bovendien moet ook de correctheid van de machine waarop het programma wordt uitgevoerd bewezen worden... misschien iets dat we aan een andere computer kunnen overlaten? Om terug te komen op het kleuren van grafen: er zijn (niet-vlakke) grafen die geen 4-kleuring hebben; het eenvoudigste voorbeeld is K n met n > 4: daarvoor zijn minimaal n kleuren nodig. Er zijn ook niet-vlakke grafen die wel een 4-kleuring hebben: in het bijzonder heeft K 3,3 zelfs een 2-kleuring. (zie ook de oefeningen) 85

87 3 Bomen 3. Inleiding Definitie 3.. Boom Een boom is een enkelvoudige graaf met de eigenschap dat er tussen elke twee verschillende knopen een uniek enkelvoudig pad bestaat. Een willekeurige knoop van een boom kan aangewezen worden als de wortel. Definitie 3..2 Hoogte van een knoop De hoogte van een knoop v in een boom met wortel w, is het aantal bogen in het pad van w naar v. Definitie 3..3 Hoogte van een boom De hoogte van een boom is het maximum van de hoogtes van zijn knopen. wortel w b a c d e f h i g Figuur 2.23: Voorbeelden van bomen Figuur 2.23 laat een boom met een wortel w zien en een boom zonder wortel. De hoogtes van a, b, c, d, e, f, g, h, i en w zijn respectievelijk,2,2,,,2,3,,2 en. Figuur 2.24(a) toont een beslissingsboom: elke knoop bevat een test. De wortel is de knoop met de test inkomen < 5. ; afhankelijk van of de test positief of negatief uitvalt, ga je naar links of rechts waar je meer testen vindt of advies/antwoord op de vraag heb ik recht op een studiebeurs?. Figuur 2.24(b) toont de boomvoorstelling van de rekenkundige uitdrukking (3 + ) 5 7/3. 86

88 inkomen < 5. _ #kind > 3 niks * / studiebeurs ga naar 3. (a) Beslissingsboom (b) Voorstelling van (3 + ) 5 7/3 Figuur 2.24: Nuttige bomen 3.2 Eigenschappen van bomen De volgende stelling geeft een aantal equivalente karakterisaties van bomen: Stelling 3.2. Voor een enkelvoudige graaf T met n knopen geldt dat (a) (b) (c) (d) met (a) T is een boom (b) T is samenhangend en bevat geen kring (c) T is samenhangend en heeft (n ) bogen (d) T bevat geen kring en heeft (n ) bogen Bewijs (a) (b): als T een boom is bestaat er een pad tussen elke twee knopen, bijgevolg is T samenhangend; er kan geen kring zijn in T anders zouden sommige knopen door meer dan één enkelvoudig pad verbonden zijn (b) (c): we bewijzen door inductie op n dat T (n ) bogen heeft; voor n = heeft T nul bogen en de basis voor de inductie is waar; stel dat elke samenhangende graaf, zonder kringen en met n knopen (n ) bogen heeft; neem een graaf S met (n + ) knopen, zonder kringen en samenhangend; kies een enkelvoudig pad P van maximale lengte in S (is dit mogelijk?); vermits er geen kringen zijn in S, bevat P een knoop v met δ(v) = (indien δ(v) > dan kon het pad P uitgebreid worden en dan was het niet maximaal); beschouw S de graaf die je verkrijgt door uit S knoop v (en zijn boog) weg te laten; S heeft n knopen, heeft geen kring en is samenhangend en door inductie bevat S (n ) bogen; bijgevolg bevat S n bogen (c) (d): stel dat T een kring bevat, dan kunnen we bogen (minstens één! en geen knopen!) verwijderen uit T totdat de resulterende graaf T kringloos is maar nog steeds samenhangend; nu is T zonder kringen, samenhangend en bevat n knopen en we kunnen bijgevolg het resultaat (b) (c) gebruiken: T bevat (n ) bogen; daaruit volgt dat T strikt 87

89 meer dan (n ) bogen had, in tegenspraak met de onderstelling in (c); daaruit volgt dat T geen kring bevat (d) (a): we moeten bewijzen dat T samenhangend is en dat er een uniek pad bestaat tussen elke twee knopen; we kunnen een partitie maken van T in zijn componenten {T i } k i= ; stel dat het aantal knopen van T i gelijk is aan n i ; elk van de T i is samenhangend en kringloos en heeft bijgevolg (n i ) bogen; dus: (n ) = k i= (n i ) = k i= (n i ) k = n k; daaruit volgt dat k = en dus is T samenhangend; stel nu dat er twee paden van a naar b bestaan, dan kan je met die paden een kring vormen; maar T is kringloos, dus is elk pad tussen twee knopen uniek; bijgevolg is T een boom De stelling is o.a. belangrijk om de volgende reden: rondlopen in een graaf die geen boom is, is gevaarlijk omdat je in een kring kan terecht komen en op die manier in een oneindige lus. Om dat te vermijden, zou je altijd moeten bijhouden waar je al geweest bent. De stelling zegt o.a. dat voor een boom je een pad altijd kan uitbreiden voorwaarts en vermits er geen kringen zijn, zal je op de duur niet meer verder kunnen. Bijgevolg, als je weet dat je met een boom te doen hebt, dan kan je (eigenlijk zou je moeten) van die eigenschap gebruik maken bij het programmeren van toepassingen met die datastructuur. Definitie Terminologie i.v.m. bomen Laat T een boom zijn met wortel v ; laten x, y en z knopen zijn in T en (v,v,...,v n ) een pad in T, dan v n is de ouder van v n ; we spreken soms ook over vader of moeder; v... v n zijn voorouders van v n en v n is een afstammeling van v... v n v n is een kind van v n ; we spreken soms van zoon of dochter als x en y kinderen zijn van z, dan zijn x en y broers of zusters (in het Engels: siblings) als x geen enkel kind heeft, dan is x een blad of eindknoop als x geen blad is, is x een inwendige knoop de deelgraaf van T die een knoop x bevat en al de afstammelingen van x, is de deelboom van T met wortel x 3 Voorbeelden van al die terminologie: voor figuur 2.25 geldt dat c,d,e zijn bladeren of eindknopen a is de ouder van d 3 In feite moeten we bewijzen dat die deelgraaf een boom is! 88

90 wortel b a d e f c Figuur 2.25: Voorbeeldboom b, c, f zijn de afstammelingen van a a,wortel zijn de voorouders van b b,d,e zijn siblings a,b zijn inwendige knopen de deelboom met wortel a bevat de knopen a,b,c,d,e,f Soms vinden we de volgorde van de kinderen van een knoop in een boom belangrijk, in het bijzonder is dat zo bij een binaire boom. Definitie Binaire boom Een binaire boom is een boom met een wortel en waarvan elke knoop, of 2 kinderen heeft; wegens de manier waarop binaire bomen getekend en gebruikt worden, spreekt men van een linkerkind (verbonden door de linkertak met de ouder) en een rechterkind (...); de orde van de takken is dus belangrijk. Je zag al een binaire boom in figuur 2.24(a): het is daar belangrijk te weten of je links of rechts moet gaan bij een positief antwoord op de test in de knoop. Definitie Volledige binaire boom Een volledige binaire boom is een binaire boom waarvan elke inwendige knoop juist twee kinderen heeft. Een voorbeeld van een volledige binaire boom vinden we in de boomvoorstelling van de directe uitschakeling in een tornooi: figuur

91 monaco berchem madrid bornem moskou beerse milaan Figuur 2.26: Tornooiboom Stelling Indien T een volledige binaire boom is met i inwendige knopen, dan heeft T (i + ) bladeren en (2i + ) knopen. Bewijs Elke inwendige knoop heeft 2 kinderen, er zijn dus 2i kinderen in T; er is ook één knoop die geen kind is, namelijk de wortel, bijgevolg zijn er 2i + knopen. Vermits een blad geen inwendige knoop is en vice versa, en vermits elke knoop een blad is of een inwendige knoop, hebben we ook dat het aantal bladeren gelijk is aan 2i + i = i + Bij een tornooi met directe uitschakeling met n deelnemers, kan je de vraag stellen: hoeveel matchen moeten er ingericht worden om de winnaar te kunnen aanduiden? De tornooiboom heeft n bladeren, bijgevolg heeft hij n inwendige knopen en dat is ook het aantal matchen. Stelling Indien T een binaire boom is met hoogte h en t bladeren, dan lg(t) h (of t 2 h ). 4. Bewijs We bewijzen de stelling door inductie op h en door de deelbomen van T te beschouwen: voor h = hebben we één blad (de wortel), dus t = = 2 h = 2 en de stelling is voldaan. Stel h > ; beschouw T l en T r de linker- en rechterdeelboom van de wortel van T. T l of T r kunnen leeg zijn, maar niet beide. Onderstel eerst dat T r leeg is: dan is h l = h en door inductie is t l 2 h l; vermits t l = t verkrijgen we t 2 h 2 h. Het geval dat T l leeg is, is analoog. Stel T l noch T r leeg, dan is h l h en door inductie is t l 2 h l; analoog is t r 2 hr en dus t = t l + t r 2 h l + 2 hr 2 h + 2 h = 2 h. 4 lg is de logaritme met basis 2 9

92 Stelling Voor een binaire boom T met n knopen en hoogte h, is lg(n+ ) h + Bewijs Breid eerst de boom T uit tot een boom T als volgt: hang aan elk blad een linker- en een rechtertak als een inwendige knoop een linkertak mist, voeg een linkertak toe als een inwendige knoop een rechtertak mist, voeg een rechtertak toe T heeft nu n inwendige knopen (alle originele knopen van T) en hoogte (h + ); vermits T volledig en binair is, kunnen we stelling toepassen en besluiten dat T (n+) bladeren heeft en door stelling besluiten dat lg(n+) h+ Figuur 2.27 toont een boom en zijn uitbreiding zoals gedefinieerd in stelling 3.2.7: de toegevoegde knopen zijn getekend als een zwart rechthoekje. Merk ook op dat als de oorspronkelijk boom al volledig is, de uitbreiding toch verschilt! Figuur 2.27: Een binaire boom en zijn uitbreiding tot een volledige binaire boom Definitie Binaire zoekboom Een binaire zoekboom is een binaire boom waarin met elke knoop v een waarde w(v) is geassocieerd (bv. een getal) zodanig dat als l behoort tot de linker en r tot de rechterdeelboom van v, dat dan w(l) < w(v) < w(r) Een binaire zoekboom wordt ook soms gesorteerde binaire boom genoemd. Figuur 2.28 toont een binaire zoekboom waarin de waarde van de knopen woorden zijn; de orde is alfabetisch. Het volgende algoritme zoekt of een bepaalde waarde aanwezig is in een binaire zoekboom: het algoritme is geschreven als een pseudo-java methode die TRUE teruggeeft als de waarde gevonden is, anders FALSE; de methode is niet echt in Java, omdat het type waarde niet gespecifieerd is: het is een generische methode. Er ontbreken ook wat declaraties voor variabelen. 9

93 er een meisje dat eens heette roodkapje was Figuur 2.28: Een binaire zoekboom voor de woorden uit de zin Er was eens een meisje dat Roodkapje heette boolean zoek(t boom, W waarde); { P = wortel(t); doevoort = not(empty(t)); zoek = FALSE; while (doevoort) { if (waarde(p) == W) { doevoort = FALSE; zoek = TRUE; } else if (waarde(p) < W) P = rechterkind(p); else P = linkerkind(p); if (empty(p)) doevoort = FALSE } } We kunnen de complexiteit van dit algoritme uitdrukken in het aantal keer dat het lichaam van de lus wordt uitgevoerd. In het slechtste geval zit de gezochte waarde niet in de boom en zoeken we langs het langste pad, vertrekkend aan de wortel; dat pad heeft een lengte die gelijk is aan de hoogte h van de boom en de lus wordt dus h+ keer uitgevoerd. Uit stelling weten we dat lg(n+) h+ en voor een vaste n kunnen we het slechtste geval dus niet beter maken dan lg(n + ). Door de boom zo goed mogelijk te balanceren verkrijgen we een slechtste geval dat gelijk is aan lg(n+). Een voorbeeld van twee binaire bomen met dezelfde knopen zie je in figuur 2.29: de rechterboom is beter gebalanceerd dan de linkerboom en is dus minder hoog. 92

94 Figuur 2.29: Twee bomen met dezelfde knopen en verschillende hoogte 3.3 Een meer compacte voorstelling voor bomen. Dikwijls wordt een boom voorgesteld met gerichte bogen; die voorstelling benadrukt dat de functies linkerkind en rechterkind dikwijls expliciet aanwezig zijn (in een Java-voorstelling van een boom als velden in de klasse die de knoop voorstelt), doch niet de functie ouder. Daarenboven kan het ook nuttig zijn een boom als een (gerichte) graaf voor te stellen die geen boom meer hoeft te zijn; neem bijvoorbeeld de boomvoorstelling van de rekenkundige uitdrukking (i + 7) 2 + i + 7 in figuur 2.3(a); daarin zie je twee deelbomen die precies dezelfde zijn: de deelboom voor de deeluitdrukking i + 7; de overeenkomstige gerichte graaf (die geen boom meer is) staat in figuur 2.3(b). De voorstelling m.b.v. een gerichte graaf is meer compact omdat het voorkomen van de deeluitdrukking i + 7 door twee deelbomen gedeeld wordt (in het Engels: shared). + + ^ + ^ + 2 i i 7 (a) Boomvoorstelling i 7 (b) Graafvoorstelling 3.4 Opspannende bomen Figuur 2.3: Twee voorstellingen van (i + 7) 2 + i + 7 Er is echter ook een gevaar aan het delen van deelbomen: als de gedeelde deelboom gewijzigd wordt, veranderen beide voorkomens in de niet-gedeelde voorstelling van de boom! Indien zulk een effect niet gewenst wordt, mag men de efficiëntere voorstelling niet gebruiken. In deze sectie werken we uitsluitend met enkelvoudige grafen. 93

95 Definitie 3.4. Opspannende boom Een boom T is een opspannende boom van een graaf G, indien T een subgraaf is van G die alle knopen van G bevat. Een opspannende boom draagt dus alle knopen van een graaf en is in zekere zin een kleinste samenhangende deelgraaf die alle knopen draagt: als je een boog van een opspannende boom weglaat, dan zal je geen boom meer hebben (de samenhangendheid verdwijnt) en misschien zal er een knoop niet meer gedragen worden. Stelling Een graaf G heeft een opspannende boom T als en slechts als G samenhangend is. Bewijs Als G een opspannende boom T heeft, dan is G samenhangend, want dan is er een pad (over de bogen van de boom T) tussen elke twee knopen. Als G samenhangend is en kringloos, dan is G een boom en een opspannende boom van zichzelf. Indien G samenhangend is en een kring heeft, verwijder dan één boog uit die kring (maar geen knopen); de resulterende graaf is nog steeds samenhangend en heeft een kring minder dan G; door inductie op het aantal kringen is de stelling nu bewezen. De stelling doet meer dan het bestaan van een opspannende boom bewijzen: het geeft een constructieve methode om een opspannende boom te vinden; ruwweg: verwijder een boog uit elke kring en wat je overhoudt is een opspannende boom. Een algoritme gebaseerd hierop is niet erg efficiënt, want het houdt in dat we kringen moeten zoeken en dat is in het algemeen tijdrovend. Stelling Karakterisatie van een opspannende boom Een deelgraaf T van een samenhangende graaf G die kringvrij is en die een maximaal aantal bogen van G bevat, is een opspannende boom van G. Bewijs We nemen aan dat G minstens 2 knopen heeft. Dat T een maximaal aantal bogen bevat, betekent hier dat je geen boog kan toevoegen zonder een kring te maken. We moeten bewijzen dat T samenhangend 94

96 is (dan is T een boom) en dat T alle knopen van G bevat (dan is T opspannend). Stel dat de knoop v G\T; vermits G samenhangend is bestaat er een boog b die in v toekomt; b / T want anders zou v T; vermits T maximaal is, bevat de graaf T {b} een kring die natuurlijk b bevat. Maar dat betekent dat v T, hetgeen in tegenspraak is met de onderstelling. Bijgevolg bevat T alle knopen van G. Stel T is niet samenhangend; beschouw de partitie in componenten {T i } n i=. Figuur 2.3 laat T en T 2 zien. Vermits G zelf samenhangend is, bestaan er knopen v T en v 2 T 2 die verbonden zijn door een pad P (zonder kring) in G dat verder geen knopen met T of T 2 gemeen heeft (op figuur 2.3 in stippellijn). Onderstel dat P slechts één boog b heeft. T {b} bevat nu een kring en die kring loopt door v en v 2 ; maar dat betekent dat er al een pad was van v naar v 2 in T, wat de onderstelling dat T en T 2 verschillende componenten waren tegenspreekt. We moeten nog bewijzen dat in een partitie {V k } n k= van knopen van een samenhangende graaf G, we altijd een V i en V j kunnen kiezen zodanig dat er een v i V i en v j V j en de boog (v i,v j ) G: neem V en een willekeurige andere V k ; daar G samenhangend is, bestaat er een pad van een knoop v naar een knoop van V k ; we kunnen v zodanig kiezen dat de eerste boog toekomt in een knoop v / V. Als v V k, dan zijn we klaar; anders behoort v tot een V j met j en we zijn klaar. Een bijkomende karakterisatie van opspannende bomen: Eigenschap Indien T een deelgraaf is van een samenhangende, enkelvoudige graaf G met n knopen, en T is kringloos en heeft n bogen, dan is T een opspannende boom van G. Figuur 2.3: Twee componenten van T verbonden door een pad van G De stelling geeft aanleiding tot een algemeen (niet deterministisch) algoritme voor het construeren van een opspannende boom voor een graaf G: vertrek van de lege graaf T; voeg aan T herhaaldelijk een boog uit G toe die geen kring introduceert in T en totdat dat niet meer mogelijk is; T is een opspannende boom. Merk op dat: () je hoeft elke boog maar één keer te beschouwen (waarom?) (2) de volgorde waarin je bogen beschouwt, is onbelangrijk (3) uiteindelijk is T een boom, maar zolang je nog bezig bent met bogen toevoegen, hoeft T niet samenhangend te zijn (4) je al kan stoppen als je n bogen hebt toegevoegd als G n knopen heeft. 95

97 Er zijn twee volgordes van bogen kiezen die hun oorsprong vinden in algemene keuzestrategien (later ook meer daarover in de sectie over het doorlopen van bomen): diepte-eerst en breedte-eerst. We beschrijven de methodes informeel: Diepte-eerst constructie van opspannende boom: kies een knoop en construeer een zo lang mogelijk pad zonder kring vertrekkend van die knoop; heel dat pad zal tot de opspannende boom behoren; keer één stap terug in het pad en van daaruit construeer je weer een zo lang mogelijk pad zonder kring - als dat niet ging, ga je nog maar een stap terug; blijf dit doen tot je teruggekeerd bent in de beginknoop en geen boog meer kan toevoegen; figuur 2.32 illustreert de methode, vertrekkend vanaf de topknoop: een boog behoort tot de opspannende boom indien hij getekend is in stippellijn. Figuur 2.32: 3 fazen in de diepte-eerst constructie van een opspannende boom Breedte-eerst constructie van opspannende boom: kies een knoop en neem alle bogen die daaruit vertrekken en zodanig dat er geen kring gevormd wordt; al die bogen zullen behoren tot de opspannende boom; in alle nieuwe knopen waar je met die net toegevoegde bogen bent toegekomen, neem je weer alle bogen die samengenomen met wat je al had, geen kring vormen; blijf dat doen tot je geen bogen meer kan toevoegen; figuur 2.33 illustreert de methode, vertrekkend vanaf de topknoop. Figuur 2.33: 3 fazen in de breedte-eerst constructie van een opspannende boom De correctheid van beide methodes steunt op het feit dat alle bogen ooit eens beschouwd worden als kandidaat voor toevoeging en stelling De orde is in beide methodes zo dat de tussenliggende grafen altijd een boom zijn, want samenhangend. Figuur 2.34 laat voor K 4 zien dat de diepte-eerst opspannende bomen essentieel verschillen van de breedte-eerst opspannende bomen. Misschien heb je nu de indruk dat alle opspannende bomen kunnen verkregen worden door ofwel de diepte-eerst ofwel de breedte-eerst methode. Figuur 2.35 laat een graaf zien en een opspannende boom, die met geen van beide methodes kan verkregen worden. 96

98 K 4 diepte eerst breedte eerst Figuur 2.34: Opspannende bomen voor K 4 Figuur 2.35: Graaf met een hybride opspannende boom 3.5 Minimale opspannende bomen Beschouwen we het volgende probleem: gegeven een aantal steden en stel dat de kost van het bouwen van een weg tussen de steden gegeven is; bepaal welke wegen moeten aangelegd worden om te voldoen aan () de totale kost is minimaal (2) elke stad is bereikbaar vanuit elke andere stad. Het wegennet dat daaraan voldoet moet een boom zijn, want er kunnen geen kringen zijn (anders ware het net niet van minimale kost) en er is een pad tussen elke twee steden. Dit soort bomen wordt nu gedefinieerd: Definitie 3.5. Minimale opspannende boom Voor een gewogen graaf G is T een minimale opspannende boom indien T een opspannende boom van G is met het kleinste gewicht. Figuur 2.36 laat een graaf G zien, een opspannende boom B en een minimale opspannende boom T. Efficiënte algoritmen die een minimale opspannende boom construeren zijn gebaseerd op de volgende stelling: 97

99 Figuur 2.36: Een graaf met opspannende bomen Stelling Een boog die tot een minimale opspannende boom behoort Gegeven een samenhangende graaf (V,E), U V en e een boog in E met minimale lengte van alle bogen met begin in U en einde in V \U; er bestaat een minimale opspannende boom T voor (V,E) zodanig dat e T. Bewijs: Neem een minimale opspannende boom T voor de graaf. Indien e tot T behoort is de stelling bewezen, indien niet, voeg dan e toe aan T. We verkrijgen T die een kring bevat (stelling 3.4.3) en die kring bevat e alsook nog een boog e = (u,v) waarbij u U en v V \U. Door uit T e te verwijderen verkrijgen we weer een opspannende boom T (waarom is T een boom?) en bovendien is de w(t) w(t ) vermits w(e) w(e ). Bijgevolg is T een minimale opspannende boom die e bevat. Algoritme Prim Gegeven een samenhangende gewogen graaf G(V, E) met een verzameling knopen V = {v,v 2,...,v n }. De volgende procedure is een algoritme dat een minimale opspannende boom T construeert.. Initialisatie: T := ({v }, ) 2. Stop?: Indien T (n ) bogen heeft, stop. 3. Voeg boog toe: Van alle bogen die een knoop van T verbinden met een knoop die niet tot T behoort, kies een boog b met het kleinste gewicht en voeg die toe aan T: er bestaat minstens één zulke boog omdat G samenhangend is en T nog niet alle knopen bevat; T zal na toevoeging van b nog steeds kringloos zijn. Ga naar Stop?. Bewijs Vermits bij het einde van het algoritme T een boom is met n knopen en (n ) bogen en T kringloos is, is T een opspannende boom voor G. We moeten dus terminatie van het algoritme en minimaliteit van T bewijzen. Een illustratie van de redenering hieronder, vind je in figuur Eindigheid is eenvoudig want Voeg boog toe wordt slechts (n ) keer uitgevoerd, waarna het algoritme stopt. Misschien wil je je er nog van overtuigen dat Voeg boog toe altijd kan, t.t.z. dat er altijd een boog bestaat die geen kringen introduceert in T. Na Initialisatie bestaat T uit één knoop en dus is T een deel van een minimale opspannende boom (mob). We bewijzen nu dat die eigenschap behouden blijft 98

100 door Voeg boog toe: noteer met W de knopen van T en onderstel dat T T met T een mob. Noteer met B = {(x,y) x W, y V \W, (x,y) E}. Neem de kortste boog (i, j) in B die geen kring veroorzaakt indien toegevoegd aan T. Indien (i,j) T dan is duidelijk dat T {(i,j)} T =mob. Indien (i,j) / T dan zal T {(i,j)} een kring bevatten, waarvan (i,j) deel uitmaakt. In die kring zit nog een boog (x,y) B en door die uit T {(i,j)} te verwijderen krijgen we een nieuwe opspannende boom T (want bevat alle knopen en is samenhangend). De vraag is dan: is T ook minimaal? Vermits w(i,j) w(x,y) (zo was (i,j) immers gekozen), is w(t ) w(t ) en bijgevolg is T een mob. Bijgevolg is T {(i,j)} deel van een mob. Bijgevolg is de opspannende boom door Prim geconstrueerd, een minimale opspannende boom. x y T i j W Figuur 2.37: Illustratie bij algoritme Het algoritme van Prim is een klassiek voorbeeld van een gulzig (Engels: greedy) algoritme: op elk ogenblik dat een keuze gemaakt moet worden, wordt een keuze gemaakt die er op dat moment het beste uit ziet, t.t.z. zonder te kijken naar de vorige keuzes (niet helemaal correct) of naar de toekomstige keuzes. Niet elk gulzig algoritme bereikt dan ook een optimaal resultaat; bv. een kortste-pad algoritme dat op elk ogenblik een bestaand pad zou uitbreiden met de kortste boog, geeft niet altijd een kortste pad en een gulzig schaakspeler wint ook niet altijd. Doch in het geval van Prim werkt het perfect. Het algoritme van Prim wordt geïllustreerd in figuur 2.38: de initiële knoop is A; de volgorde waarin de bogen worden toegevoegd, staat bij de bogen als a,b,c...h. Het algoritme van Prim bouwt een mob incrementeel, t.t.z. op elk ogenblik in het algoritme is T een mob van een deelgraaf van G. Er is een variante op het algoritme van Prim dat deze eigenschap niet heeft: Algoritme Kruskal Gegeven een samenhangende gewogen graaf G(V,E) met een verzameling knopen V = {v,v 2,...,v n }. De volgende procedure is een algoritme dat een minimale opspannende boom T construeert.. Initialisatie: T := 99

101 A 2 4 a g 3 8 e f 2 d 6 3 b 7 4 c 5 h 9 Figuur 2.38: De uitvoering van algoritme Stop?: Indien T (n ) bogen heeft, stop. 3. Voeg boog toe: Voeg aan T toe een boog b met minimaal gewicht en die bovendien geen kring veroorzaakt indien toegevoegd aan T. Ga naar Stop?. Bewijs Eindigheid van Kruskal is analoog aan die van Prim. Dat T op het einde een opspannende boom is, is ook analoog na te gaan. We tonen nu nog de minimaliteit van T aan. Onderstel dat T geen mob is. Noem de bogen van T b,b 2,...,b n in orde van toevoeging door het algoritme. Laat S een mob (van G) zijn zodanig dat {b,b 2,...,b i } S en met maximale i (zulk een S bestaat en door stelling is i!) Er zijn twee mogelijkheden: i = n : nu is T = S en T is een mob. i < n : dus b i+ / S; laat H de graaf zijn gevormd door de bogen {b,b 2,...,b i } en hun knopen. Beschouw de graaf S {b i+ } = S. S heeft een kring (want een boog te veel) waarin minstens één boog b zit die niet tot T behoort (omdat T zelf kringvrij is). Dus b S. Nu bevat H {b} geen kring, want H {b} S en vermits Kruskal in de (i + )- de Voeg boog toe de boog b i+ koos (om toe te voegen aan H), moet w(b i+ ) w(b). Bijgevolg is S \{b} = S een mob. Maar nu is S een mob die {b,b 2,...,b i+ } omvat wat in tegenspraak is met de maximaliteit van S. Dus het is niet mogelijk dat i < n. 3.6 Doorlopen van bomen Merk op dat T tijdens Kruskal s algoritme geen boom hoeft te zijn: de uitvoering van Kruskal wordt in 2.39 geïllustreerd op dezelfde graaf als in Het is dikwijls nodig om op een systematische manier alle knopen van een boom te bezoeken om er een operatie mee of op uit te voeren; bijvoorbeeld: als de knopen een getal bevatten, willen we misschien die getallen optellen, of met één

102 A 2 4 d g 3 8 c b 2 f 6 3 a 7 4 e 5 h 9 Figuur 2.39: De uitvoering van algoritme verhogen of afdrukken... In de twee eerste gevallen is de volgorde van niet veel belang, maar bij het afdrukken kan de volgorde belangrijk zijn. In alle gevallen is het belangrijk om elke knoop juist één maal te behandelen. We zullen eerst twee algemene methodes beschrijven (diepte-eerst en breedte-eerst) en daarna algoritmen die knopen in een vaste, standaard volgorde behandelen. We formuleren elke methode als een algoritme. In deze sectie hebben we het altijd over bomen met een wortel. Om de zaken scherp te stellen, moeten we goed afspreken wat we juist kunnen bij een boom: er is slechts één knoop direct bereikbaar: de wortel er is geen volgende-knoop -operatie er is geen operatie die je direct de knoop geeft met een bepaalde eigenschap er is ook geen operatie die je direct de ouder, de broer of zuster van een knoop kan geven de enige operatie is: geef de verzameling kinderen van een gegeven knoop; in het geval van een binaire boom ook geef linkerkind en geef rechterkind; we korten deze operaties af door de funties kinderen(k), linkerkind(k) en rechterkind(k) met k de gegeven knoop; indien er geen kind is, dan geven deze functies LEEG terug In feite beschouwen we hier een boom als een gerichte graaf, met enkel pijlen van een ouder naar de kinderen. In Java zou een knoop van een binaire boom een instance van een klasse kunnen zijn met daarin velden die de twee kinderen voorstellen, maar een kind heeft geen verwijzing naar de ouder. Algoritme 3.6. Diepte-eerst doorlopen van een boom Gegeven een boom T met wortel w en knopenverzameling V.. Initialisatie: S := {(w,)} en R :=

103 2. Kies knoop: kies uit S een paar p = (a, n) met maximale n 3. Pas aan: S := (S\{p}) {(b,n + ) b kinderen(a)} en R := R {a}; behandel a 4. Stop?: indien S = stop anders ga naar Kies knoop. Bovenstaande procedure eindigt en bij beëindiging is R = V. Bewijs Noteer door S V = {x i N zodat (x,i) S}. Beschouw de volgende eigenschappen: R S V =, R S V V en a S V : { knopen van de deelboom met wortel a } R = Deze eigenschappen zijn waar na de initialisatie en blijven behouden door Pas aan, bijgevolg zijn ze invarianten. Vermits R één element bijkrijgt bij elke doorgang van het algoritme en V eindig is, kan het algoritme maar een eindig aantal keer langs Pas aan komen. Bijgevolg stopt het ooit. Een andere invariant is: x R kinderen(x) (S R). Vermits bij beëindiging van de procedure S = en bovendien na de eerste doorgang door de procedure w R, verkrijgen we op het einde R = V : de wortel is immers verbonden met elke knoop door een pad dat de kind-relatie volgt. Merk op dat in het bewijs geen gebruik werd gemaakt van de manier waarop p gekozen werd in Kies knoop: d.w.z. dat elke keuze aanleiding geeft tot dezelfde bewezen eigenschappen voor het algoritme. R bevat alle en enkel de behandelde knopen van de boom; daarom was het belangrijk om te bewijzen dat op het einde R = V. Door van R een geordende verzameling te maken, kunnen we ook uitspraken doen over de volgorde waarin de knopen behandeld zijn: informeel kunnen we zeggen dat als een knoop a behandeld is, alle knopen uit de deelboom met a als wortel behandeld worden voordat een knoop behandeld wordt die niet tot die deelboom behoort. De tweede component van de elementen in S, geeft de diepte van de knoop in de originele boom aan. We kunnen ook aantonen dat elke knoop maar één keer behandeld wordt. Algoritme Breedte-eerst doorlopen van een boom Gegeven een boom T met wortel w en knopenverzameling V.. Initialisatie: S := {(w,)} en R := 2. Kies knoop: kies uit S een paar p = (a,n) met minimale n 3. Pas aan: S := (S\{p}) {(b,n + ) b kinderen(a)} en R := R {a}; behandel a 4. Stop?: indien S = stop anders ga naar Kies knoop. Bovenstaand procedure eindigt en bij beeindiging is R = V. Bewijs We kunnen het bewijs bij 3.6. hergebruiken. 2

104 In breedte-eerst worden alle knopen op een bepaalde diepte behandeld voor alle knopen met een grotere diepte. Figuur 2.4 laat voor een boom zien in welke volgorde zijn knopen behandeld worden door de twee algoritmen: vermits Kies knoop ondergespecifieerd is, is het slechts één mogelijke volgorde van behandeling, maar het essentieel verschil is duidelijk Figuur 2.4: Illustratie diepte-eerst en breedte-eerst Het is de moeite om de twee algoritmen met elkaar te vergelijken voor een gebalanceerde binaire boom met diepte d. In het bijzonder vergelijken we de maximale grootte van S tijdens de algoritmen. In diepte-eerst verkrijgen we de maximale grootte van S vlak voor er de eerste keer een blad behandeld wordt: #S = d +. In breedte-eerst verkrijgen we de maximale grootte vlak nadat alle knopen met diepte d behandeld zijn: S bevat dan alle bladeren, t.t.z. #S = 2 d. Een implementatie van het diepte-eerst of breedte-eerst algoritme moet op één of ander manier S voorstellen; uit bovenstaande vergelijking blijkt dus dat - althans voor sommige bomen - diepte-eerst een plaatsvoordeel heeft t.o.v. breedte-eerst. Breedte-eerst heeft echter een belangrijk voordeel t.o.v. diepte-eerst, nl. bij het zoeken naar een knoop met een bepaalde eigenschap in oneindige bomen. Eerst wat achtergrond: dikwijls is de (eindige) oplossingsverzameling van een probleem te vinden in een oneindige verzameling van bijna -oplossingen en is die oneindige verzameling gestructureerd als een boom. Een ander voorbeeld van oneindige bomen vind je bij spel-bomen in sectie 3.7. Veronderstel dus dat we een oneindige boom hebben - t.t.z. oneindig diep, maar met een eindige vertakking in elke knoop - met in elke knoop een paar (x,y) waarvan x {,} en y R en dat er slechts één knoop is met een x =. In figuur 2.4 zie je een stukje van zulk een boom. We zijn nu geïnteresseerd in de y-waarde van de enige knoop die x = heeft. Als we nu in bovenstaande algoritmen, behandel a vervangen door: indien a = (,y) dan schrijf y en stop dan is het niet moeilijk na te gaan dat Diepte-eerst bij elke Kies knoop de (enige) juiste knoop moet kiezen of anders verloren zal lopen in een oneindige tak. Breedte-eerst geen vergissing kan maken in Kies knoop, want breedteeerst behandelt knopen per diepte, en vermits de gezochte knoop op een eindige diepte zit, wordt die ooit gevonden. 3

105 (,_) (,_) (,_) (,_) (,_) (,_) (,_) (,_) (,_) (,_) (,37) (,_) (,_) (,_) (,_) Figuur 2.4: Oneindige boom met ergens nuttige informatie Als diepte-eerst altijd de juiste keuze maakt in Kies knoop, dan wordt de gezochte knoop sneller gevonden dan bij breedte-eerst. (hoeveel sneller?) Als er geen knoop in de boom zit met x = zullen beide algoritmen niet stoppen. Zoeken in een oneindige boom is dus veiliger met breedte-eerst en als diepte-eerst wordt gebruikt, moet de Kies knoop van het algoritme perfect zijn. Laten we nu terugkeren naar eindige, binaire bomen: neem het diepte-eerst algoritme en specifieer Kies knoop: kies de meest linkse knoop a waarvoor (a,n) S en n maximaal is Behandel a: schrijf a Toegepast op de boom in figuur 2.42 krijgen we als uitvoer van dit algoritme de (namen van de) knopen in de volgorde: -/2*3+45 Je ziet dat van elke deelboom de wortel wordt afgedrukt voor de andere knopen van de deelboom en dat een linkerdeelboom helemaal wordt afgedrukt voor een rechterdeelboom. Deze orde (van knopen behandelen of doorlopen van de boom) wordt prefix orde genoemd. Er is ook een infix orde en een postfix orde: voor de boom in 2.42 krijgen we als infix uitvoer (zie figuur 2.42): /2-3*4+5 en als postfix uitvoer (zie figuur 2.43): 2/345+*- Informeel gespecifieerd is infix orde: behandel de linkerdeelboom voor de wortel van de deelbomen en daarna de rechterdeelboom. Postfix orde is dan: behandel eerst linkerdeelboom, dan rechterdeelboom, dan pas de wortel van de deelboom. Het infix en postfix-algoritme zijn niet gemakkelijk te enten op diepte-eerst, daarom een andere specificatie: de algoritmen zijn geschreven in de vorm van een recursieve (Java-achtige) methode met als argument een knoop. 4

106 - / * Figuur 2.42: Boom doorlopen in infixorde Algoritme infix void infix(w knoop) { if ((W LEEG)) { infix(linkerkind(w)); behandel(w); infix(rechterkind(w)); } } 5

107 - / * Figuur 2.43: Boom doorlopen in postfixorde Algoritme postfix void postfix(w knoop) { if ((W LEEG)) { postfix(linkerkind(w)); postfix(rechterkind(w)); behandel(w); } } 6

108 Voor de volledigheid ook een specificatie van prefix orde in dezelfde notatie: - / * Figuur 2.44: Boom doorlopen in prefixorde Algoritme prefix void prefix(w knoop) { if ((W LEEG)) { behandel(w); prefix(linkerkind(w)); prefix(rechterkind(w)); } } Om te besluiten wat bijkomende intuïtie i.v.m. de algoritmen diepte-eerst en breedte-eerst: de verzameling S die expliciet werd bijgehouden tijdens het algoritme, bevat conceptueel niet de knopen, maar een aanwijzing over wat er later nog moet gebeuren in het algoritme; je kan S zien als een agenda waarin je op een bepaald ogenblik schrijft wat je later nog moet doen. In een gewoon agenda schrijf je een toekomstige activiteit in op de plaats (bij de juiste datum, uur) die het tijdstip voorstelt waarop de activiteit moet uitgevoerd worden. Dat vergemakkelijkt het opzoeken van de activiteiten die je nu moet doen. S is minder gestructureerd en daarom moeten we telkens als we gaan beslissen wat we willen doen, heel de verzameling bekijken om de juiste activiteit eruit te pikken. In de recursieve beschrijvingen van bijvoorbeeld prefix, vinden we S niet expliciet terug; nochtans is S aanwezig in de recursiestapel: op de recursiestapel staat immers het adres van een instructie die bij terugkeer uit een recursieve oproep moet uitgevoerd worden alsook de variabelen die lokaal zijn aan een activatie van de procedure. Wat we tussendoor ook zien is dat een recursief algoritme 7

109 3.7 Spelbomen een niet-recursieve variant heeft: dat is in het algemeen waar. Dit begrijpen is essentieel voor informatici. Beschouwen we nim : een spel waarbij er n stapels munten zijn, en twee spelers die om beurten van één willekeurige stapel één of meer munten wegnemen. Degene die de laatste munt wegneemt (daartoe gedwongen door de regels en de tegenstander) verliest het spel. We analyseren nim voor twee stapels, waarbij de eerste stapel 3 munten en de tweede stapel 2 munten telt bij het begin van het spel. De spelers heten Doos en Bol en Doos begint. Hij heeft 5 mogelijke zetten en zou graag weten wat de gevolgen zijn van elk van die mogelijkheden. Daartoe tekent hij een boom met als wortel een doosje met daarin de beginsituatie van het spel, namelijk 3. Als kinderen van die wortel tekent hij die vijf mogelijkheden, maar 2 die tekent hij in een cirkel, omdat het dan de beurt zal zijn aan Bol. En bij elk van de vijf mogelijkheden voor zijn eerste zet, tekent Doos de mogelijke zetten van Bol enzovoort: vermits er bij elke zet minstens één munt verdwijnt, is deze boom eindig; je ziet de volledige boom die Doos tekende in figuur Figuur 2.45: De spelboom voor nim(3,2) Elke eindknoop heeft en een eindknoop in de vorm van een doosje, toont een overwinning van Doos: Doos wil natuurlijk het spel zo laten verlopen dat hij bij een doosje aankomt op het einde van het spel. En Bol zal hem dat proberen te verhinderen. Die volledige spelboom helpt niet veel voor Doos om zijn keuze te maken bij de eerste zet. Daarom gaat hij alle eindknopen markeren met of : als hij verliest als het spel in die toestand komt, als hij wint. Je krijgt de boom van Het is duidelijk dat Doos in een eindknoop wil geraken waar een in staat, want dan wint hij. Maar er is nog geen aanduiding in de wortel van de spelboom over 8

110 Figuur 2.46: De eindknopen hebben een label zijn eerste zet. Stel dat een spelboom maar één niveau diep is, zoals in tekening Figuur 2.47: Propagatie van kinderen naar ouders Als van de doos-knoop alle kinderen een hebben, dan zal Doos verliezen, gelijk wat hij doet, en daarom kan hij de wortel van de boom als label geven: eens hij in die situatie verzeild is, verliest hij zeker. Daarentegen, als er minstens één kind is met label gelijk aan, kan Doos bij zijn zet daar naartoe gaan: daarom kan hij de doos-knoop het label geven. Een doos-knoop krijgt dus het maximum van de labels van zijn kinderen. In figuur 2.47 links krijgt de wortel dus label. Langs de andere kant, als een bol-knoop alleen maar kinderen met een heeft, dan is de situatie een win voor Doos, want gelijk wat Bol kiest, hij verliest. Maar als er minstens één kind met een label gelijk aan is, kan Bol die zet kiezen en is hij dus in een situatie om Doos te doen verliezen, bijgevolg kan de bol-knoop het label krijgen. Een bol-knoop krijgt dus het minimum van de labels van zijn kinderen. In figuur 2.47 rechts krijgt de wortel dus label. Deze procedure van labeling berekent een label voor elke knoop waarvan de labels van zijn kinderen al bekend zijn. We passen ze toe op figuur 2.46 en verkrijgen figuur Zoals aangegeven, labelt deze procedure in een pad van de bladeren naar de wortel afwisselend met het minimum en maximum van de labels van de kinderen: daarom wordt dit de minimax procedure genoemd. 9

111 Figuur 2.48: Alle knopen hebben een label Figuur 2.48 laat het resultaat zien van de minimaxprocedure uitgevoerd op 2.46: de wortel is nu een doos-knoop met daarin een : dit betekent dat - op voorwaarde dat Doos altijd de juiste zet doet - hij zeker wint. Inderdaad, aanvankelijk is er slechts één juiste zet, namelijk die waarbij Doos zorgt dat beide stapels even veel munten bevatten. En gelijk wat Bol daarop antwoordt, door altijd een zet te doen die leidt naar een knoop met label =, zal Doos onvermijdelijk winnen. Nim(3,2) is nu geen interessant spel meer: we hebben heel de spelboom opgesteld, de minimax procedure erop losgelaten en nu weten we dat nim(3,2) een spel is van het type beginner-wint. In principe kan je van veel andere spelen ook de hele spelboom opstellen, maar in praktijk is dat niet te doen omdat de spelboom te diep is en de vertakkingsgraad te groot. Denk bijvoorbeeld aan schaak: er zijn 2 openingszetten, waarop telkens 2 mogelijke antwoorden zijn en het aantal mogelijke zetten stijgt nadien nog. Als we veronderstellen dat de vertakkingsgraad 2 blijft en er zowat 4 zetten in een spel zijn, dan heeft de spelboom bladeren! De schaakboom kunnen we dus maar tot op een bepaalde diepte d opbouwen en analyseren. Maar vermits we nu niet tot aan de bladeren zijn geraakt, kunnen we niet zeker zijn of een bepaalde positie winnend is of niet. Daartoe gaan we een evaluatiefunctie E gebruiken: E kent aan elke knoop op diepte d een getal toe dat groter is naarmate de positie beter is voor Doos. De evaluatiefunctie is meestal niet onfeilbaar, an kan zoals in het geval van schaken, gebaseerd zijn op jarenlange ervaring van grootmeesters, spelanalyses en zelfs afhankelijk zijn van een persoonlijke voorkeur en spelstijl. In ieder geval: hoe beter de evaluatiefunctie, hoe beter de persoon die E gebruikt kan spelen. Maar hoe gaan we verder nadat de bladeren hun label hebben gekregen m.b.v. de evaluatiefunctie? We passen weer de minimax procedure toe: een doos-knoop krijgt het maximum van zijn kinderen, een bol-knoop het minimum ervan. We passen dit toe op een stuk van de spelboom voor 3-op--rij; Doos zet X-en en Bol zet O-s in een 3 bij 3

112 matrix; wie eerst 3 van zijn tekens op een rij (horizontaal, verticaal of diagonaal) heeft, wint. Als evaluatiefunctie gebruiken we het aantal rijen dat Doos nog kan vervolledigen tot een winnende rij min het aantal rijen dat Bol nog kan vervolledigen tot een winnende rij. We construeren de spelboom tot diepte 2: zie figuur x x x x x o x o x x o o o o x x x x x o o o o o x o x Figuur 2.49: Spelboom voor 3-op--rij tot diepte 2 Daarna geven we de bladeren van die spelboom het label dat door de evaluatiefunctie gegeven wordt en passen de minimax procedure toe. We verkrijgen de spelboom in figuur 2.5. Daaruit blijkt dat Doos best begint met een X in het centrum te leggen... op voorwaarde dat de evaluatiefunctie goed genoeg is tenminste Figuur 2.5: Labeling van de spelboom voor 3oprij tot diepte 2 Soms kan vermeden worden om sommige spelposities - knopen in de spelboom - 5 symmetrische bordtoestanden zijn weggelaten

113 te evalueren: daardoor speel je vlugger of heb je tijd over om de spelboom dieper af te zoeken. Dezelfde spelboom van 3-op--rij tot diepte 2 wordt gebruikt om te illustreren wanneer de berekening van de evaluatiefunctie overbodig wordt: in figuur 2.5 zie je dat als berekend is dat m waarde - heeft, de evaluatie van de broers en zusters van m niet meer moet gebeuren: immers, het label van de ouder van m zal hoogstens - zijn (want we zullen het minimum van de labels van de kinderen nemen) en er is op dat niveau al een label -, dus gelijk wat de vraagtekens opleveren, het label van de wortel w - die het maximum wordt van de labels van zijn kinderen - zal er niet door beïnvloed worden. w - - m - -???? Figuur 2.5: α snede in de labeling We noemen dit een α-snede (cutoff): een α-snede komt voor bij een doos-knoop w als een kleinkind m een waarde heeft die kleiner of gelijk is dan de α-waarde van w; de α-waarde van w is de tot dan toe grootste waarde van een kind van w. In die situatie mag de deelboom met wortel de ouder van m verwijderd worden uit de spelboom: men spreekt in het Engels van prune the tree. Dat verwijderen is figuurlijk: het betekent dat van die deelboom geen labels meer moeten berekend worden. De uiteindelijke waarde van het label van w wordt niet gewijzigd door het algoritme. Analoog aan de α-snede is er ook een β-snede: een β-snede komt voor bij een bol-knoop w als een kleinkind m een waarde heeft die groter of gelijk is aan de β- waarde van w; de β-waarde van w is de tot dan toe kleinste waarde van een kind van w. In die situatie mag de deelboom met wortel de ouder van m verwijderd worden uit de spelboom. Als bijkomend voorbeeld van het α β-algoritme, beschouw de figuur 2.52: de waarde van de bladeren staat eronder, doch is nog niet berekend. De spelboom wordt weer diepte-eerst doorlopen - en hier ook van links naar rechts. Vlak voor de evaluatie van knoop a gebeurt (zie figuur 2.53) is de β- waarde van d = 6. Vermits E(a) = 8 hebben we een β-snede die mogelijk maakt om de evaluatie van de de andere kinderen van c over te slaan. De definitieve waarde van d is dan bekend en = 6. Daardoor wordt de α-waarde van w = 6. 2

114 Figuur 2.52: Spelboom met waarden voor de bladeren Later is de waarde van e al bekend: 3 en 3 < α-waarde van w bijgevolg hebben we een α-snede voor w, t.t.z. de deelboom die begint bij h (de ouder van e die de snede mogelijk maakte) hoeft niet geëvalueerd te worden. Figuur 2.53 toont de niet-berekende waarden van eindknopen en lege cirkels/dozen voor knopen die weggesneden werden. w 7 d 6 h 7 b 6 c e 3 f g a Figuur 2.53: Aanduiding van het effect van de α β-snedes In de oefeningen worden de algoritmen preciezer gedefinieerd gebaseerd op de algoritmen in sectie

115 4 Netwerkmodellen en Petri-netten 4. Transportnetwerk Een netwerk van verbindingen, elk met hun eigen capaciteit, kan gemodelleerd worden als een gerichte, gewogen graaf. Als voorbeeld kan je denken aan een wegennetwerk, een elektrisch netwerk of aan een stel oliepijplijnen. Het belangrijkste probleem i.v.m. dit soort netwerken is het optimaliseren van een stroming, zonder capaciteitsoverschreiding natuurlijk. We zullen dit optimalisatieprobleem oplossen in de context van grafentheorie. Ook andere problemen die op het eerste zicht niets met optimalisatie van stroming te maken hebben, kunnen gemodelleerd worden als een netwerkprobleem: personeelstoewijzing, toekenning van resources en ook het partner-keuzeprobleem ( The marriage problem ). Petrinetten modelleren gelijktijdige acties en vormen een kader om bijvoorbeeld deadlock problemen te bekijken. Definitie 4.. Transportnetwerk Een transportnetwerk (of simpelweg een netwerk) is een enkelvoudige, gewogen, gerichte graaf G die voldoet aan. er is juist één knoop in G zonder binnenkomende bogen; deze knoop wordt de bron genoemd 2. er is juist één knoop in G zonder buitengaande bogen; deze knoop wordt de put genoemd (Engels: sink) 3. het gewicht C i,j van de (gerichte) boog (i,j) is postief en wordt de capaciteit van de boog genoemd 4. als de richting van de bogen vergeten wordt, dan is G samenhangend Figuur 2.54 toont een netwerk: de bron is de knoop a en de put is de knoop z; de capaciteit van elke boog is bij de boog geschreven. Het netwerk modelleert bijvoorbeeld een stel eenrichtingsstraten in een stad tussen het station (knoop a) en de markt (knoop z); de capaciteit is het aantal voertuigen dat per minuut kan passeren door elke straat. De beperking dat een netwerk enkelvoudig moet zijn, is niet erg groot: zowel lussen als parallelle bogen kan je wegwerken door knopen bij te zetten op elke lus of parallelle boog; er verandert niets essentieels aan het netwerk wat betreft de problemen die we bestuderen in deze sectie. 4

116 a 3 b 2 2 c 4 z 5 4 d 2 e Figuur 2.54: Een transportnetwerk Definitie 4..2 Stroming in een netwerk Voor een netwerk G(V,E) met capaciteit C i,j, i,j V 6 is F een stroming als F een afbeelding is van E naar R + zodanig dat. F(i,j) C i,j 2. voor elke knoop j die niet de bron of de put is geldt: F(i,j) = F(j,i) i V i V We noemen F(i,j) de stroming in boog (i,j). Voor een knoop j noemen we i V F(i,j) de stroming naar of in j en i V F(j,i) de stroming uit j. Formule 2 in definitie 4..2 drukt het behoud van stroming uit: alles wat binnenkomt in een knoop, gaat er weer buiten en alles wat buitengaat, is binnengekomen; dat verhindert dat er een ophoping of productie gebeurt in de knopen. Figuur 2.55 toont een stroming voor het netwerk van figuur 2.54; de stroming is gedefinieerd door: F(a,b) = 2 F(b,c) = 2 F(c,z) = 3 F(a,d) = 3 F(d,c) = F(d,e) = 2 F(e,z) = 2 en telkens naast de capaciteit van de overeenkomstige boog gezet. Je kan nagaan dat formule 2 in definitie 4..2 voldaan is voor elke knoop behalve de bron en de put. Je kan ook nagaan dat de stroming uit de bron gelijk is aan de stroming in de put: F(a,b) + F(a,d) = F(c,z) + F(e,z). 6 als er geen boog (i, j) bestaat, dan nemen we aan dat C i,j = 5

117 b 2,2 c a 3,2 5,3 2, 4,3 4,2 z d 2,2 e Figuur 2.55: Een stroming in een transportnetwerk Deze gelijkheid wordt veralgemeend in: Stelling 4..3 Bron-uit = put-in Van een stroming F in een netwerk G(V,E) is de stroming uit de bron gelijk aan de stroming in de put, of meer formeel: F(a,i) = F(i,z). i V i V Bewijs Het is duidelijk dat j V( i V F(i,j)) = ( F(i,j)) i V j V = ( j V i V F(j,i)) De omwisseling van de s mag omdat we met eindige grafen te doen hebben. De tweede gelijkheid geldt wegens hernoeming van i en j. Daaruit volgt: = ( F(i,j) ) F(j,i) j V i V i V ( = F(i,z) ) ( F(z,i) + F(i,a) ) F(a,i) i V i V i V i V + ( F(i,j) ) F(j,i) i V j V \{a,z} = F(i,z) F(a,i) i V i V i V vermits F(z,i) = = F(i,a) voor i V (door definitie 4..2) en i V F(i,j) = i V F(j,i) voor j (V \{a,z}) (door formule 2 in definitie 4..2) 6

118 Op basis van stelling 4..3, kunnen we nu definiëren: Definitie 4..4 Grootte van een stroming De grootte van een stroming F in een netwerk G(V,E) met bron a en put z is gedefinieerd door i V F(a,i) of i V F(i,z) De grootte van de stroming in figuur 2.55 is 5. Het netwerkprobleem kan nu als volgt geformuleerd worden: voor een gegeven netwerk G, vind de maximale stroming, of m.a.w. vind de stroming met de maximale grootte. Tot slot van deze sectie, nog iets over netwerken met meer dan één bron of put: het netwerk in figuur 2.56 stelt de waterbevoorrading van de steden A en B voor, vanuit de bronnen X, Y en Z en over verdeelstations b, c en d. X b 6 4 A Y Z 3 3 d 2 c B Figuur 2.56: Een transportnetwerk met meerdere bronnen en putten Door een superbron a en een superput z toe te voegen aan dit netwerk, verkrijgen we terug een gewoon netwerk: vanuit a voeg je ook een gerichte boog toe naar elke bron van het originele netwerk, en vanuit elke oude put een gerichte boog naar z; de toegevoegde bogen krijgen alle de capaciteit. X b 6 4 A a Y Z 3 3 d 2 c B z Figuur 2.57: Een transportnetwerk met een superbron en superput In dit nieuwe netwerk geeft een maximale stroming ook een maximale stroming voor het oorspronkelijke netwerk. Denk niet dat een maximale stroming uniek is: figuur 2.58 toont een netwerk met oneindig veel maximale stromen, nl. voor alle i,j die voldoen aan i + j = 5 en i,j 3. 7

119 3,i 3,i 5,5 3,j 3,j Figuur 2.58: Een netwerk met oneindig veel maximale stromen 4.2 Maximale stroming We zullen een algoritme zien om een maximale stroming te berekenen; het basisidee is eenvoudig: vertrek van een stroming en verbeter die totdat dat niet meer mogelijk is; je hebt nu een maximale stroming. Een intuïtieve beschrijving van hoe je een stroming verbetert, gaat als volgt: neem een pad P van de bron a naar de put z zoek het minimum van C b F(b) over alle bogen b P bepaal de nieuwe stroming langs het pad P door bij elke F(b) bij te tellen Een paar opmerkingen bij dit voorschrift: de operatie verhoogt de stroming enkel als het pad P (toevallig) zo is dat > de beschrijving geldt alleen voor een pad waarvan elke boog de goede richting heeft, maar a we mogen niet alleen paden van a naar z zoeken langs de gerichte bogen: bekijk figuur 2.59(a); daarin zie je dat geen enkel pad van a naar z met enkel goede bogen verbeterd kan worden met bovenstaande methode; maar de stroming langs het pad (a,b,c,z) kan wel verbeterd worden door de stroming getoond in figuur 2.59(b); 2, 2,2 3,2 b d 4, 4,4 c 4,3 (a) Een niet maximale stroming z a 2,2 2,2 3,2 b d 4, 4,4 c 4,4 (b) Een verbeterde stroming langs een pad met omgekeerde boog z Figuur 2.59: Verbetering van stroming we moeten dus ook paden beschouwen waarvan bogen omgekeerd lopen en we moeten voor die verkeerde bogen niet iets optellen bij de stroming, maar er iets aftrekken: als een omgekeerde boog een stroming draagt kan 8

120 het immers zijn dat er alleen maar iets rondstroomt zonder ooit de put te bereiken; we formaliseren dat als volgt: Definitie 4.2. Goede en slechte boog In een gerichte graaf G(V,E) met pad (v,v 2,...,v n ) noemen we de boog (v i,v i+ ) goed (gericht) indien (v i,v i+ ) E en anders slecht (gericht) In een pad P zullen we de goede bogen noteren door P + en de slechte door P. Stelling Verbeteren van een stroming Laat P een pad zijn van a naar z in een netwerk G(V,E), waarbij. (i,j) P + : F(i,j) < C i,j 2. (i,j) P : < F(i,j) Laat bovendien = min(min (i,j) P+ {C i,j F(i,j)},min (i,j) P {F(i,j)}); definieer de functie F als volgt: F (i,j) = F(i,j) (i,j) / P = F(i,j) + (i,j) P + = F(i,j) (i,j) P Dan is F een stroming waarvan de grootte meer is dan die van F. Bewijs Om na te gaan dat F een stroming is, moeten we en 2 van definitie 4..2 bewijzen: beide zijn niet moeilijk. Dat de stroming met verbeterd is, volgt uit het feit dat de stroming van de boog (a, ) P (en die is goed - waarom?) met is verhoogd en de stroming door de andere bogen die vertrekken in a niet is veranderd. Eén van de gevolgen van de stelling over de verbetering van de stroming, is dat bij een maximale stroming F elk pad van a naar z, minstens één goede boog heeft met C i,j = F(i,j) of één slechte boog met F(i,j) = ; zoniet kon de stroming verbeterd worden langs dat pad. We zouden ook graag de volgende eigenschappen hebben: als een stroming geen enkel pad van a naar z heeft dat kan verbeterd worden (volgens de methode van stelling 4.2.2) dan is de stroming maximaal - dit lijkt voor de hand liggend, maar is niet triviaal te bewijzen! een algoritme om de flow te maximaliseren bestaat erin om een pad te 9

121 zoeken dat aan de voorwaarden van stelling voldoet, de stroming langs het pad te verbeteren en dat te herhalen tot er geen zulk pad meer is - indien voorgaand puntje waar is en de procedure eindigt, dan levert dit inderdaad een maximale stroming op. We zullen beide eigenschappen formeel aantonen. We beschrijven eerst een klassiek algoritme dat een voorbeeld is van een labeling procedure. We hebben al vroeger een algoritme gezien dat labels gebruikte nl. het algoritme van Dijkstra (2.4.2): knopen kregen daarbij een label met informatie. In het volgende algoritme gebruiken we een dubbel label dat lijkt op het dubbele label op pagina 74: informeel is de eerste component van het label de knoop waarvan je kwam (en daarom zal de startknoop een lege eerste component in zijn label hebben) en de tweede component van het label zal de uit stelling zijn van het pad dat tot dan is gevonden. Algoritme Constructie van een maximale stroming. Laat G(V,E) een netwerk zijn met bron a en put z en capaciteit C, waarbij alle capaciteiten positief en geheel zijn. Onderstel een orde op de knopen met a = v,v,...,v n = z. Met B zullen we de verzameling beschouwde knopen aanduiden; met L de verzameling van knopen met een label; de operaties op B zullen we expliciet maken; die op L zijn impliciet.. Initialisatie: Definieer (i,j) E : F(i,j) = 2. Label de bron: Geef a het label (, ); zet B = 3. Aangekomen?: Indien z een label heeft, verbeter de stroming en ga terug naar Label de bron. Verbeter de stroming gaat als volgt: er is juist één pad P van a naar z dat achteruit kan geconstrueerd worden te vertrekken van z, dan de eerste component van het label van z en zo verder tot in a. De tweede component van het label van z is een grootheid die nu wordt bijgeteld bij F voor goede bogen in P en afgetrokken van F voor slechte bogen van P. Daarna worden alle labels in heel het netwerk gewist. 4. Kies volgende knoop: Indien L \ B =, stop: de stroming F is maximaal. Noem v de nog niet beschouwde knoop v i met een label en met kleinste index i. 5. Label buren: Stel dat het label van v gelijk is aan (α, ). Behandel nu elke boog van de vorm (v,w) of (w,v) in de volgorde (v,v ), (v,v), (v,v ), (v,v),... waarbij w nog geen label heeft. voor elke boog (v,w) (dus een boog die wegloopt uit v): indien F(v,w) < C v,w geef w het label (v,min{,c v,w F(v,w)}) anders geef je w geen label 2

122 Bewijs voor elke boog (w,v) (dus een boog die toekomt in v): indien F(w,v) > geef w het label (v,min{,f(w,v)}) anders geef je w geen label Ga naar Aangekomen? Eindigheid: Punt 3 in het algoritme is cruciaal: zolang de uitgang stop niet genomen wordt, wordt punt 3 herhaaldelijk uitgevoerd. Vanuit punt 3, gaat de uitvoering ofwel naar punt 2 of punt 4. De overgang van punt 3 naar punt 2 kan maar een eindig aantal keer gebeuren, want die overgang impliceert dat de stroming verbeterd wordt met > ; is geheel omdat alle capaciteiten geheel zijn en vermits de maximale stroming begrensd is (door de som van de capaciteiten van de bogen die vertrekken in de bron) kan de gegeven stroming dus slechts een eindig aantal keer verbeterd worden. Na een eindig aantal overgangen van punt 3 naar punt 2, wordt dus steeds opnieuw de overgang van punt 3 naar punt 4 genomen. In punt 4 wordt telkens een knoop toegevoegd aan B (die nooit meer terug op wordt gezet). Bijgevolg zal na verloop van tijd L = B en op dat moment stopt het algoritme. Maximaliteit: we stellen het bewijs nog even uit tot we stelling hebben gezien. Merk op dat het algoritme niet alle maximale stromen vindt: bekijk nog eens figuur 2.58 en overtuig jezelf! Definitie Snede van een netwerk Een snede van een netwerk G(V,E) met bron a en put z, is een 2-tal (P,P) zodanig dat a P, z P, P P = V en P P = We kunnen een snede tekenen door een lijn die de knopen van het netwerk in twee verzamelingen verdeelt: op figuur 2.6 is een snede aangegeven met een stippellijn. We kunnen nagaan hoeveel stroming er globaal loopt over de snede, t.t.z. van links naar rechts in de gebruikelijke tekening van een netwerk: daarbij moeten we een boog van P naar P positief rekenen en een omgekeerde boog negatief; voor het net in figuur 2.6 wordt dat: F(c,e) + F(b,d) F(d,c) = 2 + = 2 Vergelijken we die grootheid met de stroming (in a of z) dan zien we dat die ook gelijk is aan 2! Is dit toeval of niet? We kunnen ook proberen een afschatting te maken van hoeveel stroming er maximaal van links naar rechts over de snede 2

123 e a 2, 2, c b 3,2 2,2, 2, 2, d z Figuur 2.6: Een netwerk met een stroming en een snede kan lopen, door optimistisch te veronderstellen dat er misschien een stroming bestaat die voor alle goede bogen over de snede maximaal is, t.t.z. gelijk aan de capaciteit van die boog en voor alle slechte bogen nul. We zullen die grootheid de capaciteit van de snede noemen. Voor hetzelfde voorbeeld geeft dat: C c,e + C b,d = = 5 En het lijkt alsof capaciteit van de snede groter is dan de stroming van de snede en ook groter dan de maximale stroming (je kan nagaan dat die 4 is). Is dit toeval? We bekijken deze vragen in een meer formeel kader: Definitie Capaciteit C(P,P) van een snede De capaciteit van een snede (P,P) is C(P,P) = C i,j i P j P Stelling De capaciteit van een snede is niet kleiner dan een stroming, m.a.w. F(a,i). i P j P C i,j i V Bewijs F(a,i) = (F(a,i) F(i,a)) + (F(j,i) F(i,j)) i V i V j P \{a} i V = (F(j,i) F(i,j)) j P i V = F(j,i) + F(j,i) F(i,j) F(i,j) j P i P j P i P j P i P j P 22 i P

124 = F(j,i) F(i,j) j P i P j P i P F(j,i) j P i P C(P,P) Merk op dat de derde laatste regel van de stelling inderdaad aantoont dat de stroming gelijk is aan de stroming die door de snede loopt. Een minimale snede is een snede met minimale capaciteit. Vorige stelling impliceert direct dat de maximale stroming kleiner of gelijk is aan de capaciteit van de minimale snede. Het verband tussen beide grootheden is nog sterker: Stelling Max flow - min cut Voor een snede (P,P) en stroming F in een net G(V,E) geldt dat als C(P,P) = F (of dus als C i,j = F(a,i) ) i P j P i V dan is de stroming maximaal en de snede minimaal. Bovendien is die gelijkheid equivalent met. i P,j P : F(i,j) = C i,j en 2. i P,j P : F(i,j) = t.t.z. goede bogen over de snede hebben een stroming gelijk aan hun capaciteit en slechte bogen een nul stroming. Bewijs Volgt onmiddellijk uit de ongelijkheden van stelling Merk op dat we niet bewezen dat er voor elke maximale stroom een minimale snede is met die gelijkheid noch omgekeerd. Figuur 2.6 toont een maximale stroom met minimale snede. Nu kunnen we bewijzen dat algoritme inderdaad eindigt met een maximale stroming. Bewijs van Op het ogenblik dat het algoritme stopt, is er een verzameling P van knopen met een label (a P) en P van knopen zonder label (z P). (P,P) vormt dus een snede. Beschouw een boog die vertrekt in i, t.t.z. een boog (i,j) met i P en j P. Vermits i een label heeft moet F(i,j) = C i,j anders zou j een label hebben gekregen. Beschouw nu een aankomende boog in i, t.t.z. een boog (j, i) met i P en j P. Vermits i een label heeft moet F(j,i) = anders zou j een 23

125 e a 2,2 2,2 c b 3,2 2,2, 2,2 2,2 d z Figuur 2.6: Een netwerk met een maximale stroming en een minimale snede label hebben gekregen. Samen met stelling verkrijgen we dat F maximaal is. We zien dus dat het algoritme tegelijkertijd een maximale stroming construeert en een minimale snede. We tonen de opeenvolgende stappen in algoritme in de reeks figuren 2.62(a) en 2.62(b): (_, ) a b 7, 3, 2, d 4, 4, c 4, z (_, ) a (a,7) b 7, 3, 2, d (a,2) 4, 4, c (d,2) 4, (c,2) z (a) Na initialisatie en labeling bron a (b) Na een labeling die z bereikt Figuur 2.62: Illustratie bij algoritme Als orde op de knopen kozen we (a,c,d,b,z). Vanuit a krijgt dus eerst d en dan b een label. Vanuit d wordt dan c gelabeld; vanuit d wordt b niet gelabeld omdat b al een label heeft. Vervolgens krijgt z een label vanuit c: er is nu een pad vanuit a naar z, te zien in figuur 2.62(b). De stroming wordt aangepast: het resultaat is te zien in figuur 2.63(a). (_, ) a b 4, 7, 3, 4,2 2,2 d c 4,2 (a) De stroming is een eerste maal verbeterd z (_, ) a (a,7) b 7, 3, 2,2 d (b,3) c 4, (d,2) 4,2 4,2 (c,2) (b) Een tweede labeling heeft z bereikt z Figuur 2.63: Illustratie 2 bij algoritme De labeling herbegint in de situatie van figuur 2.63(a). Vanuit a krijgt d nu geen label, want de stroming door de boog (a,d) is al maximaal. Vanuit b krijgt c 24

126 geen label, want de boog (c,b) is slecht en de stroming =. Dus krijgt d een label vanuit b, en vermits de capaciteit van de boog (b,d) (3) kleiner is dan de van b (7 op dat ogenblik) krijgt het label van d een = 3. Vanuit d krijgt c een label en vermits de overschotcapaciteit van de boog (d,c) nog 2 is, krijgt c een = 2. Vanuit c kan enkel nog z gelabeld worden: de eindsituatie is te zien in figuur 2.63(b). Weerom kan de stroming langs het bekomen pad aangepast worden, wat resulteert in figuur 2.64(a). b 4, 7,2 4,4 (_, ) a 3,2 4,4 2,2 d (a) De stroming is een tweede maal verbeterd c z (_, ) a 7,2 2,2 (a,5) 3,2 b d (b,) 4, 4,4 c 4,4 (b) De labeling bereikt z niet meer: de snede is minimaal, de stroming maximaal z Figuur 2.64: Illustratie 3 bij algoritme Op dit ogenblik is de stroming al maximaal, maar daarom stopt het algoritme nog niet: er wordt nog eens een poging gedaan om een pad van a naar z te maken, met bogen die nog overschotcapaciteit hebben. De laatste ronde van labelen begint in de situatie van figuur 2.64(a): vanuit a kan enkel b een label krijgen (de capaciteit van boog (a, d) is al opgebruikt) en boog (b, d) heeft ook nog wat overschotcapaciteit, maar dan is het gedaan: de labeling stopt bij figuur 2.64(b). We hebben P = {a, b, d} en P = {c, z} en de snede is minimaal. Voer zelf het algoritme uit op de netwerken in figuur 2.65, met als orde op de knopen: (a,b,c,d,e,z). c c 5 5 a 4 4 d 4 b z a 4 4 d 4 b z 3 e e Figuur 2.65: Twee netwerken om op te oefenen Het vinden van een maximale stroming in een netwerk, komt neer op zoek (gehele) getallen F(i,j) zodanig dat j F(a,j) maximaal is F(i,j) C i,j voor gegeven C i,j j : i F(i,j) = i F(j,i) 25

127 4.3 Matching Dit soort problemen wordt ook opgelost in lineaire programmatie, m.b.v. het simplex algoritme: je leert er later misschien meer over. Beschouw het volgende probleem: er zijn 4 studenten (A,B,C en D) en die willen elk apart naar het monitoraat dat open is op 5 tijdstippen (a,b,c,d en e). Elk van die studenten heeft zijn voorkeur voor één of meer tijdstippen laten blijken en nu is het aan het monitoraat om een afspraakagenda vast te leggen zodat elk van die studenten kan komen op een tijdstip dat zijn voorkeur heeft. Het is duidelijk dat dit niet altijd mogelijk is: indien bijvoorbeeld studenten A en B beiden als enige voorkeur het tijdstip a hebben, dan is het al onmogelijk. Maar zelfs als het mogelijk is, is het niet triviaal om dit probleem op te lossen, zeker niet als er veel meer dan 4 studenten en veel meer dan 5 tijdstippen zijn. Op het eerste zicht heeft dit probleem niet veel met grafen te maken, maar laten we toch een graaf maken van dit probleem: de knopen zijn de studenten en de tijdstippen en er is een gerichte boog tussen een student en een tijdstip, indien die student dat tijdstip verkiest. Stel dat A voorkeur {b, c} heeft, B heeft {a, b}, C{d, e} en D {b, c, e}. Dan krijgen we figuur 2.66 A a B b C c D d e Figuur 2.66: Graaf voor het toekenningsprobleem We hebben een tweeledige, gerichte graaf. Het verband met de vorige sectie zien we als we een bron en put toevoegen en elke boog capaciteit gelijk aan één geven. Zie figuur Als we nu een maximale gehele stroming F in dat netwerk vinden en de waarde van die maximale stroming is 4 (het aantal studenten) dan hebben we ook een toekenning van de studenten aan de tijdstippen: een boog e van een student naar een tijdstip met F(e) = is zulk een toekenning. Figuur 2.68 toont een maximale stroming (de stroming met waarde één loopt door de bogen in stippellijn). De oplossing geeft de toekenning (A,b), (B,a), (C,d), (D,e). We hebben een volledige toekenning of matching. Het is ook mogelijk dat de maximale stroom kleiner is dan het aantal studenten (voor een andere voorkeur natuurlijk); dan geeft de maximale stroming enkel een maximale matching. Meer formeel nu: 26

128 A a B b bron C c put D d e Figuur 2.67: Netwerk voor het toekenningsprobleem: alle bogen hebben capaciteit = A a B b bron C c put D d e Figuur 2.68: Een oplossing voor het toekenningsprobleem Definitie 4.3. Voor een gerichte, tweeledige graaf G(V W, E) waarbij V W = en E V W, is M een overeenkomst of matching indien M E en (x,y), (i,j) M : indien (i,j) (x,y) dan is i x en j y (t.t.z. in elke knoop komt hoogstens één boog aan en er vertrekt er hoogstens één) Een maximale matching heeft een maximaal aantal bogen in M. Een matching is volledig indien v V, w W : (v,w) M. Een gerichte, tweeledige graaf G(V W,E) waaraan een bron en put wordt toegevoegd, bogen van de bron naar de knopen in V en bogen van de knopen in W naar de put, en waar aan elke boog de capaciteit één wordt toegekend, noemen we het matching netwerk dat van G is afgeleid. De volgende stelling formaliseert de overeenkomst tussen een maximale stroming in een matching netwerk en een maximale matching. Een gehele stroming F is zodanig dat F enkel gehele waarden heeft. 27

129 Stelling Voor een gerichte, tweeledige graaf G(V W, E) waarbij V W = en E V W geldt dat Een gehele stroming F in het overeenkomstige matching netwerk, geeft een matching in G: v V komt overeen met w W als en slechts als F(v,w) = Een maximale gehele stroming komt overeen met een maximale matching. Een gehele stroming met waarde #V komt overeen met een volledige matching. Bewijs Het bewijs van de stelling mag je zelf uitwerken. Als we geïnteresseerd zijn in een volledige matching, dan is er soms een vlugge test die aantoont dat er geen volledige matching bestaat (zodat zoeken ernaar vermeden kan worden): het is duidelijk dat als n studenten samen minder dan n verschillende voorkeuren hebben opgegeven, ze niet allen hun zin kunnen krijgen. Veralgemeend betekent dat: definieer de afbeelding 7 R : P(V ) P(W) S {w W v S met (v,w) E} Indien G een volledige matching heeft, dan moet #S #R(S), S V De Engelse wiskundige Philip Hall bewees in 935 ook het omgekeerde: Stelling De trouwstelling van Hall Een gerichte, tweeledige graaf G(V W,E) waarbij V W = en E V W, heeft een volledige matching als en slechts als #S #R(S), S V Bewijs Als G een volledige matching heeft, is zeker #S #R(S), S V : dat hebben we voordien al geargumenteerd. Stel nu dat #S #R(S), S V en laat n = #V. Neem een minimale snede (P,P) in het matching netwerk afgeleid van G (laat a de toegevoegde bron en z de toegevoegde put zijn). Als de capaciteit C(P,P) van de snede n is, dan is er een volledige matching. Laat ons veronderstellen dat C(P, P) < n. We weten (door de definitie) dat C(P,P) = #D waarbij D = {(x,y) x P,y P } 7 P(S) stelt de machtsverzameling van S voor 28

130 D is nu de disjuncte unie van de volgende verzamelingen A = {(a,v) v V } D Mid = {(v,w) v V,w W } D Z = {(w,z) w W } D Het is duidelijk dat door de veronderstelling: n > #D = #A + #Mid + #Z Definieer V P = V P. Het kan niet zijn dat V P = want anders zou elke boog (a, v) met v V tot de snede behoren en zou de capaciteit van de snede n zijn. Het is duidelijk dat #A = n #V P. Definieer de twee disjuncte verzamelingen: X = R(V P) P Y = R(V P) P De figuur 2.69 illustreert de verzamelingen V P, X, Y, A, Mid en Z: de bogen die uit V vertrekken zijn niet echt getekend omdat ze niet belangrijk zijn voor een goed begrip. Dan hebben we: #X + #Y = #R(V P), en: x X is er juist één boog in Z, dus #X #Z Bovendien: y Y is er minstens één boog in Mid, dus #Mid #Y. Samenvoegen van die (on)gelijkheden geeft nu: n > #A + #Mid + #Z (n #V P) + #Y + #X = (n #V P) + #R(V P) = n (n #V P) + #V P hetgeen een tegenspraak is. Bijgevolg moet de minimale snede een capaciteit n hebben. De stelling van Hall kan toegepast worden op partnerkeuzes, vandaar de naam: in de veronderstelling dat mannen enkel vrouwen verkiezen, kan enkel iedere man één van zijn voorkeuren als bruid krijgen, als de voorwaarde van de stelling van Hall voldaan is. In praktijk is die voorwaarde zelden voldaan natuurlijk. 29

131 snede A Y a z Z VP X = P = P Figuur 2.69: Illustratie bij stelling Petrinetten Een voorbeeld van een Petrinet zie je in figuur 2.7; het is de voorstelling van het stukje programma p 2 i = p 4 p 6 i = 3 p 8 p p k = i+j p 7 l = i+j m = k+l p 2 p 3 j = 2 p 5 j = 4 p 9 p Figuur 2.7: Petrinetvoorstelling van een programma 3

132 i = ; j = 2; k = i+j; i = 3; j = 4; l = i+j; m = k+l; Je ziet dat het Petrinet een gerichte tweeledige graaf is met twee soorten knopen: die gesymboliseerd door een cirkel - we zullen die plaatsen noemen - en die gesymboliseerd door een staafje die we transities noemen. De plaatsen komen (in dit voorbeeld) overeen met programmapunten tussen instructies; de transities komen overeen met de instructies in het programma. De gerichte bogen lopen steeds van een plaats naar een transitie en van een transitie naar een plaats. De plaatsen zijn leeg, behalve p, waarin een zwart bolletje is getekend: een token. Een plaats met een token symboliseert het feit dat een preconditie voor het mogen uitvoeren van een instructie verbonden met de plaats is voldaan: om een instructie te mogen uitvoeren moeten wel alle precondities voldaan zijn. Eénzelfde preconditie kan gelden voor meer dan één instructie, doch één token geeft aanleiding tot het uitvoeren van maar één instructie. Als een transitie is gebeurd - de instructie is uitgevoerd - dan verschijnt er een token op elke plaats verbonden met de transitie. De idee achter deze voorstelling van het programma is dat door de aanwezigheid van het token in p, het programma gestart wordt: de eerste twee instructies i = en j = 2 mogen worden uitgevoerd en zijn zelfs niet afhankelijk van elkaar en daarom is het beëindigen van de ene geen voorwaarde voor het begin van de andere. Hier wordt o.a. gemodelleerd dat die twee instructies in parallel mogen worden uitgevoerd. De instructie k = i + j is afhankelijk van het beëindigen van de eerste twee instructies en zal pas mogen uitgevoerd worden - de terminologie is de transitie vuurt - indien er een token zit zowel in p 4 als in p 5. Als die transitie gevuurd heeft, dan is er al één preconditie voldaan voor de uitvoering van de laatste toekenning en daarom zal er al een token verschijnen in p. Doch p heeft nog geen token en daarom moet de instructie nog wachten. In het voorbeeld 2.7 zie je dat het Petrinet niet de evolutie van de waarden van de programmaveranderlijken modelleert, maar de opeenvolging van instructies die worden uitgevoerd, de opeenvolging van programmapunten die worden bereikt. Na deze intuïtieve inleiding definiëren we meer precies wat we bedoelen: Definitie 4.4. Petrinet Een Petrinet is een enkelvoudige gerichte graaf G(V,E) waarbij V = P T, P T = en E P T T P; P noemen we plaatsen en T transities. 3

133 In tekeningen zullen we plaatsen door cirkels voorstellen en transities door een staafje. In het algemeen hoeft een Petrinet niet enkelvoudig te zijn, maar voor de eenvoud zullen we altijd onderstellen dat er geen parallelle bogen zijn. (hoe zit het met lussen?) Definitie Markering van een Petrinet Een markering van een Petrinet is een toekenning van een natuurlijk getal aan elke plaats van het Petrinet. In tekeningen zullen we een markering voorstellen door zwarte bolletjes in de cirkels. We zeggen: p heeft n tokens. Plaatsen modelleren voorwaarden, terwijl transities gebeurtenissen voorstellen. Op zijn minst één token in een plaats betekent dat de voorwaarde voldaan is. Als een boog van plaats p naar transitie t loopt, dan zeggen we dat p een inputplaats is voor t. Outputplaats is analoog gedefinieerd. Als elke inputplaats van t minstens één token heeft, zijn alle voorwaarden voor de transitie t voldaan en wordt t actief. Als de actieve transitie t vuurt, dan wordt één token van elke inputplaats verwijderd en krijgt elke outputplaats van t er één token bij: het aantal inputplaatsen hoeft niet gelijk te zijn aan het aantal outputplaatsen. Een opeenvolging van vurende transities is een salvo. Definitie Bereikbare markering Een markering M is bereikbaar vanuit een markering M, indien er vertrekkend van M een salvo is dat M als resultaat heeft. Vanuit een bepaalde markering is soms meer dan één markering bereikbaar met slechts één vurende transitie. Zie bijvoorbeeld figuur 2.7. Markering M 2 en M 3 zijn beide bereikbaar vanuit M ; maar M 2 is niet bereikbaar vanuit M 3, noch omgekeerd. 8 Bemerk ook dat in M 2 en M 3 geen enkele transitie nog kan vuren: het net is dus in zekere zin dood. Er zijn er nog wel tokens, maar niet genoeg: elke transitie zit te wachten op meer tokens. Het net zit in een impasse (Engels: deadlock) al reserveert men deze term (in deze context) meestal wel om een situatie aan te duiden waarbij twee (of meer) transities zitten te wachten op een token dat de andere transitie zou kunnen produceren. Een voorbeeld van een deadlock vinden we in figuur 2.73: om die figuur te verstaan, bekijk eerst 2.72; daarin is gemodelleerd dat twee personen beide iets zouden willen eten - iets waarvoor ze mes en vork nodig hebben - doch over slechts 8 in het hoofdstuk over herschrijfsystemen wordt die situatie nauwkeuriger beschreven 32

134 M 2 M M 3 Figuur 2.7: Twee bereikbare markeringen één mes en één vork beschikken. Indien de eerste persoon het mes neemt en de tweede neemt de vork, dan kunnen geen van beide beginnen eten en zitten beide te wachten op het andere stuk bestek. Het is natuurlijk interessant dat we kunnen karakteriseren wat deadlock juist is, maar een Petrinet zonder deadlock betekent nog niet dat alle transities aan bod zullen komen: een Petrinet dat de twee personen die willen eten voorstelt, kan bijvoorbeeld zorgen dat één persoon nooit iets kan eten, zelfs als ze iets zouden afspreken. Daarom is er de notie van een levende markering voor een Petrinet. Definitie Levende markering Een markering M van een Petrinet is levend, indien na elk salvo te beginnen bij M, er voor elke transitie t een salvo bestaat zodanig dat na dat salvo t actief wordt. Deze definitie zegt niet dat de transitie t ook vuurt, enkel dat alle precondities voor t voldaan zijn. Als een markering levend is, dan is het duidelijk dat die markering geen aanleiding kan zijn tot deadlock. En ook dat ze potentieel eerlijk is: geen enkele transitie wordt definitief uitgesloten van vuren. Een andere eigenschap die belangrijk is bij Petrinetten, is de hoeveelheid tokens die een bepaalde plaats ooit kan bevatten: je kan de plaatsen zien als een register met een teller die aangeeft hoeveel tokens er zijn en je wil graag weten dat een 33

135 eet, geef mes en vork terug pak mes pak vork heb mes heb vork mes vrij vork vrij heb mes heb vork pak mes pak vork eet, geef mes en vork terug Figuur 2.72: Model van twee personen die willen eten met één mes en één vork bepaalde capaciteit van dat register nooit overschreden kan worden. Daarom de Definitie Begrensde markering Een markering M is begrensd indien er een eindige n bestaat zodanig dat bij gelijk welk salvo, geen enkele plaats ooit meer dan n tokens bevat. Een begrensde markering waarvoor n = wordt een veilige markering genoemd. Voorbeelden van Petrinetten met deze eigenschappen worden in de oefeningen gezien. 34

136 eet, geef mes en vork terug pak mes pak vork heb mes heb vork mes vrij vork vrij heb mes heb vork pak mes pak vork eet, geef mes en vork terug Figuur 2.73: Klassiek voorbeeld van een deadlock 35

137 5 Referenties Richard Johnsonbaugh Discrete Mathematics, MacMillan, 984 Shimon Even Graph Algorithms, Pitman, 979 Ralph P. Grimaldi Discrete and Combinatorial Mathematics William Barnier, Jean B. Chan Discrete Mathematics Michael Townsend Discrete Mathematics: Applied combinatorics and graph theory 36

138 6 Oefeningen. Welke van de volgende grafen hebben een Euleriaanse kring? (Welke hebben een Euleriaans pad?) (a) (b) (c) 37

139 2. Hoeveel bogen hebben K n en K m,n? 3. Beschrijf de buurmatrix van K n. 4. Geef de incidentiematrix van K Beschrijf de buurmatrix van K m,n. 6. Geef de incidentiematrix van K 4,2. 7. Wat is het aantal paden van lengte 64 tussen 2 verschillende punten in de graaf K Geef een voorbeeld van twee grafen die evenveel bogen en evenveel knopen hebben en die niet isomorf zijn. 9. Gegeven een enkelvoudig samenhangende graaf G(V,E) met #V = 23 en #E = 364. Toon aan dat G geen vlakke graaf is.. Bewijs dat K 3,3 geen deelgraaf bevat die homeomorf is met K 5, noch omgekeerd.. Is de duale van de duale de oorspronkelijke? 2. Welke eigenschappen hebben een graaf en zijn duale gemeen? 3. Los het postman probleem op. 4. Welke eigenschappen blijven bewaard onder een rijreductie? 5. Wat is de minimale k waarvoor K n,m een k-kleuring heeft? 6. Voor welke n en m heeft K n,m een Euleriaans pad/kring? 7. In de stelling over de 5-kleuring is er een voorwaarde te streng, welke? 8. In de stelling is elke voorwaarde nodig; laat dat zien door tegenvoorbeelden. Geldt de omgekeerde stelling? 9. Noem nog eigenschappen die invariant zijn onder isomorfisme. 2. Als een vlakke graaf (i.e. een graaf die in het vlak kan getekend worden zonder dat de bogen elkaar snijden) op meerdere manieren kan getekend worden in het vlak zijn dan de dualen horende bij die verschillende tekeningen steeds isomorfe grafen? M.a.w. heeft het zin te spreken over de duale van een vlakke graaf? 2. Bewijs dat elke tweeledige graaf een 2-kleuring heeft. 22. Bewijs dat elke graaf die een 2-kleuring heeft, tweeledig is. 23. Voer Dijkstra s algoritme uit op een paar voorbeeldgrafen 24. Beschrijf infix en postfix als een variante op diepte of breedte eerst 38

140 25. Geeft het volgende algoritme een mob T? eindigt het? (G is een samenhangende graaf) init: T = G stop?: indien er (n ) bogen zijn, stop kies boog: verwijder langste boog in een kring; ga naar stop? 26. Bedenk een gulzig algoritme en bewijs of het optimaal is (vb wissel) 27. Bewijs dat er nooit meer dan twee elementen (a,n) S met maximale n kunnen zijn in prefix orde voor binaire bomen 28. Pas diepte-eerst en breedte-eerst aan zodanig dat enkel knopen tot een bepaalde geven diepte d behandeld worden. Je algoritme moet ook eindigen voor oneindige bomen. 29. In de definitie van transportnetwerk, mag daar conditie 4 vervangen worden door: vanuit de bron is elke knoop bereikbaar langs gerichte bogen? of door vanuit de bron is elke knoop bereikbaar langs ongerichte bogen? 3. Construeer een Petrinet met een levende markering. 3. Construeer een Petrinet met een dode markering. 32. Construeer een Petrinet met een onbegrensde markering. 33. Construeer een Petrinet met een begrensde markering die niet veilig is. 34. Construeer een alternatief Petrinet dat het programma van figuur 2.7 voorstelt. 35. Wijzig het Petrinet van figuur 2.72 zodanig dat beide personen alleen afwisselend kunnen eten. 39

141 Hoofdstuk 3 Vastepuntstheorie Inleiding Reeds in het vorige hoofdstuk over grafentheorie meer bepaald waar het over de boolse buurmatrix ging (zie sectie 2.2) hebben we al kennis gemaakt met vaste punten: voor de boolse buurmatrix B van een graaf G, hebben we de afbeelding T B gedefinieerd, die een boolse matrix X afbeeldt op (B + ) X. T B heeft vele vaste punten, maar er was er eentje dat ons vooral interesseerde, namelijk: lim T n n + B(B): dat die limiet bestaat hebben we toen kunnen bewijzen omdat de matrixelementen van T n B (B) voor stijgende n niet dalen (m.a.w. T B is monotoon stijgend) en omdat de waarden van die matrixelementen beperkt zijn tot {true,false} zodat de limiet zelfs bereikt wordt na een eindig aantal stappen n, in het bijzonder zeker voor n = dim(b). We hadden hier dus geluk met de vastepuntsberekening: in een voorspelbaar aantal stappen konden we een vast punt vinden. Bovendien had dat vaste punt een interessante betekenis: het (i, j)- de element van het vaste punt (de limietmatrix) vertelt ons of knoop i verbonden is met knoop j in de graaf G waarvan B de boolse buurmatrix is. De operator T B is speciaal omdat hij vele vaste punten heeft en omdat voor elke matrix X, de lim n + T n B(X) bestaat. Numeriek rekenen leert dat we niet altijd zoveel geluk hebben met vaste punten. Bijvoorbeeld als je een vast punt zoekt van een functie f, dus een x die voldoet aan f(x) = x, dan kan je daarvoor een methode gebruiken gebaseerd op Newton- Raphson en door een bepaalde operator dikwijls genoeg toe te passen, kom je willekeurig dicht bij de oplossing. M.a.w. Newton-Raphson definieert een operator T f, zodanig dat als x = lim T n n + f (startpunt), dan f(x) = x, maar in tegenstelling tot de boolse matrix hierboven, is er geen garantie dat het vaste punt bereikt wordt in een eindig aantal toepassingen van de T f. Bovendien bestaat de limiet niet voor elk startpunt. Desalniettemin hebben we weer een analoge situatie: een operator heeft een interessant object als vast punt. Dat komt meer voor binnen informatica, in het bijzonder binnen de studie van semantiek van programmeertalen. Bijvoorbeeld de betekenis van recursief gedefinieerde types, modeltheorie voor logica, semantiek van recursieve functies, wat een transitieve sluiting is (bijvoorbeeld van een databaserelatie), convergentie van algoritmen.... Al deze zaken steunen op het bestaan van vaste punten en een vast punt zoeken van f is hetzelfde als een nulpunt zoeken van de functie f(x) x 4

142 2 Orderelaties 2. Basisbegrippen de manier waarop die vaste punten kunnen berekend of benaderd worden. Die toepassingen van vaste punten lijken erg formeel, wiskundig en niet praktisch bruikbaar, maar als informatici zijn we geïnteresseerd in correctheid (van implementatie en specificatie) en eenduidigheid van gedefinieerde concepten. Dat moeten we ook formeel bestuderen. Tarski (Alfred Tarski, , pools wiskundige) en Kleene (Stephen C Kleene, , USA) bieden nu juist een nuttig kader waarbinnen algemene stellingen i.v.m. vaste punten kunnen aangetoond worden: Tarski steunt op eigenschappen van de functie en het domein waarop die gedefinieerd is om het bestaan van vaste punten aan te tonen (in het bijzonder een kleinste en een grootste) en is in zekere zin een veralgemening van de stelling van Rolle, of nog meer lapidair: als je van A naar B wil en A en B liggen aan weerszijden van een rivier dan zal je ergens de rivier over moeten. Tarski zegt echter niet hoe die vaste punten kunnen berekend worden. Kleene vertelt ons de voorwaarden waaronder het zin heeft te proberen in een eindig aantal stappen een (het kleinste) vast punt te benaderen. Bij de boolse buurmatrix (en de convergentie van TB n (B)) hebben we gebruik gemaakt van een orderelatie op de matrices (geïnduceerd door de orde op de logische matrixelementen) en op het feit dat T B stijgend is. Zo ook zullen Tarski en Kleene werken binnen het kader van een verzameling met een orderelatie en voor stijgende functies. Van cruciaal belang in de theorie van de vaste punten is het begrip orderelatie. Ter herinnering: een relatie R op een verzameling S is niets anders dan een deelverzameling van de productverzameling S S. Een relatie bestaat dus uit koppels (x,y) met x,y S. We noteren zowel (x,y) R als xry om aan te geven dat het koppel (x,y) behoort tot de relatie R. Definitie 2.. Een partiële orderelatie Een relatie R op een verzameling S is een (partiële) orde(relatie) als en slechts als voldaan is aan de volgende drie voorwaarden: () R is reflexief: x S : xrx (2) R is antisymmetrisch: x,y S : xry en y R x x = y (3) R is transitief: x,y,z S : xry en y R z xrz. Voorbeeld. Het type voorbeeld van een orderelatie is de relatie is kleiner dan op de verzameling N (of Z, Q, R). Vaak duiden we ook een meer algemene 4

143 orderelatie aan met het symbool (i.p.v. R). 2. Ook de relatie is groter dan ( ) op N, Z, Q en R is een orderelatie. 3. Voor een willekeurige verzameling A geldt dat de relatie (is deelverzameling van) op P(A) een orderelatie is. 4. De relatie (is deler van) is eveneens een orderelatie op N. Definitie 2..2 Boven en ondergrens Zij S een verzameling met een partiële orde. () a S is een bovengrens (of majorant) voor een deel X S x X : x a. (2) b S is een ondergrens (of minorant) voor een deel X S x X : b x. Opmerking Met de notatie S, duiden we in het vervolg aan dat S een verzameling is, voorzien van een partiële orderelatie (bv. N, en N, ). Indien S, een partieel geordende verzameling is en x, y S dan noteren we ook x y wanneer we y x bedoelen. Voorbeeld. In N, (a) is 7 een bovengrens voor X = {2,3,4} (b) is 2 een ondergrens voor X = {2,3,4} (c) heeft X = {2,4,6,8,...} geen bovengrens. 2. In N, (a) is 2 een bovengrens voor X = {2,3,4}, maar 7 niet. (b) is de enige ondergrens voor X = {2,3,4} (c) heeft X = {2, 4, 6, 8,...} het getal als bovengrens. 3. In P(A), met A = {a,b,c,d} is (a) {a,b,c} een bovengrens voor X = {{a,b}, {a,c}} (b) {a} een ondergrens voor X = {{a,b}, {a,c}} (c) een ondergrens voor elke X A (d) A een bovengrens voor elke X A 42

144 Wij zullen speciale aandacht hebben voor de kleinst mogelijke bovengrens en de grootst mogelijke ondergrens. Definitie 2..3 Sup en inf Zij S, een geordende verzameling en X S. () a S is een kleinste bovengrens van X of een supremum van X, notatie a = sup(x) (of a = lub(x), Least Upper Bound) als en slechts als a een bovengrens is voor X en voor elke bovengrens a van X geldt dat a a (2) b S is een grootste ondergrens van X of een infimum van X, notatie b = inf(x) (of b = glb(x), Greatest Lower Bound) als en slechts als b een ondergrens is voor X en voor elke ondergrens b van X geldt dat b b Opmerking Indien een supremum (infimum) bestaat, is het uniek (Waarom?). We kunnen dus in het vervolg spreken van het supremum (infimum). Voorbeeld. Beschouw het interval X = [2,3[ in R,. Dan is 2 = inf(x) en 3 = sup(x). 2. In Z, heeft X = {,2,4,6,8,...} wel een infimum, namelijk inf(x) =, maar geen supremum, want X heeft geen bovengrenzen. 3. In Q, heeft X = {q Q 2 < q < Π} =] 2,Π[ Q noch een supremum, noch een infimum ( 2 Q en Π Q). Nochtans bestaan er zowel ondergrenzen als bovengrenzen voor X. Definitie 2..4 Complete tralie Een partieel geordende verzameling L, is een complete tralie als sup(x) en inf(x) bestaan voor elke niet lege deelverzameling X L. Voorbeeld. De geordende verzamelingen N,, Z,, Q, en R, zijn geen complete tralies. (waarom?) 2. Neem het gesloten interval [a,b] R, dan is [a,b], wel een complete tralie. 43

145 3. Voor een willekeurige verzameling A geldt dat de geordende verzameling P(A), een complete tralie is. Inderdaad, neem X P(A) Er geldt dat sup(x) = C en inf(x) = C (Zie oefening 2). C X Aangezien in een complete tralie L, het supremum en het infimum bestaat voor elke X L, kunnen we ook X = L beschouwen. C X Definitie 2..5 Top en bodemelement In een complete tralie L, noemen we = topelement = sup(l) = bodemelement = inf(l) Voorbeeld In de complete tralie P(A) (A een willekeurige verzameling) is 2.2 Monotone en continue afbeeldingen = A en = In elke geordende verzameling L, kunnen we het begrip van een monotone afbeelding invoeren. Merk echter op dat wij met een monotone afbeelding enkel een stijgende afbeelding zullen bedoelen, terwijl men in de wiskundige analyse deze term gebruikt om zowel de stijgende als de dalende afbeeldingen aan te duiden. Definitie 2.2. Monotone afbeelding Zij L, een geordende verzameling. Een afbeelding T : L L noemen we monotoon als uit x y volgt dat T(x) T(y). Voorbeeld. In R, is elke stijgende afbeelding een monotone afbeelding. Vb. de afbeelding T : R R : x x 3 is een monotone afbeelding. Ook de constante afbeelding T : R R : x 4 is monotoon. 2. Neem een willekeurige verzameling A en B A. Dan is T : P(A) P(A) : X X B 44

146 een monotone afbeelding op de geordende verzameling P(A),, want uit X Y volgt dat T(X) = X B Y B = T(Y ). Definitie Een gerichte verzameling Beschouw een willekeurige deelverzameling X van een complete tralie L,. We noemen X gericht elke eindige deelverzameling van X een bovengrens heeft in X. Voorbeeld. Zij L, een complete tralie, dan is L gericht, want elke deelverzameling X van L, dus ook de eindige, hebben een bovengrens, namelijk het topelement, in L. 2. In [a,b], is elke deelverzameling een gerichte verzameling. 3. Zij A een oneindige verzameling en beschouw de verzameling X van alle eindige deelverzamelingen van A: X = {B A B is eindig}. X is gericht, want elke eindige deelverzameling {B,B 2,...,B r } X heeft een bovengrens in X, namelijk B = B B 2 B r. Merk echter op dat X zelf (X is een oneindige deelverzameling van zichzelf) geen bovengrens heeft in X. (Zie oefening 3). Evenals het begrip monotoon, mag ook het volgende begrip niet verward worden met het gelijknamige begrip uit de wiskundige analyse. Definitie Continue afbeelding Een afbeelding T : L L op een complete tralie L, wordt een continue afbeelding genoemd, indien T(sup(X)) = sup(t(x)) voor elke gerichte deelverzameling X van L. (T(X) = {T(x) x X}) Merk op dat wij zelfs het begrip continue afbeelding niet definiëren op R,, daar dit geen complete tralie is. Erger nog, zelfs op de complete tralie [a,b], is het begrip continu uit deze tekst heel wat anders dan het begrip dat we uit de cursus analyse gewoon zijn! (zie oefening 8). 45

147 Voorbeeld De monotone afbeelding T : P(A) P(A) : X X B (A en B zoals hierboven) is continu. Inderdaad, voor elke X P(A) geldt dat (met X = {X i i I}): ( ) T(sup(X)) = X i B i I = i I(X i B) = sup({x i B i I}) = sup({t(x i ) i I}) = sup(t(x)) De volgende eigenschap geeft een verband tussen continue en monotone afbeeldingen. Eigenschap Voor een afbeelding T : L L op een complete tralie L, geldt T is continu T is monotoon Bewijs Veronderstel dat T : L L continu is. Neem twee willekeurige elementen x,y L met x y. We moeten aantonen dat T(x) T(y). Neem X = {x,y}, dan is X een gerichte verzameling van L, want y is een bovengrens voor elke (eindige) deelverzameling van X. Omdat T continu is geldt sup(t(x)) = T(sup(X)) sup{t(x),t(y)} = T(y) T(x) T(y) Het omgekeerde van de bovenstaande eigenschap is niet geldig: Voorbeeld De afbeelding f : [,] [,] : x { 2 x als x < 2 2 x + 2 als 2 x op de complete tralie [,], is een monotone afbeelding die niet continu is. (Zie oefening 5) Wel geldt altijd de volgende 46

148 Eigenschap Zij T : L L een monotone afbeelding op een complete tralie L,, dan geldt voor elke deelverzameling X L dat sup(t(x)) T(sup(X)) Bewijs x X : x x X : T(x) sup(t(x)) sup(x) T(sup(X)) T(sup(X)) 3 De stellingen van Tarski en Kleene 3. De stelling van Tarski Zoals de titel van dit hoofdstuk reeds aangeeft zijn wij sterk geïnteresseerd in de vaste punten van bepaalde afbeeldingen. Definitie 3.. Vaste punten Zij L, een complete tralie en beschouw een afbeelding T : L L () We noemen a L een vast punt voor T als T(a) = a. (2) Een kleinste vast punt voor T is een vast punt a voor T zodat voor elk ander vast punt b voor T geldt dat a b. (3) Een grootste vast punt voor T is een vast punt a voor T zodat voor elk ander vast punt b voor T geldt dat a b. Opmerking Indien een kleinste (grootste) vast punt bestaat, is het uniek (waarom?). We spreken in het vervolg dan ook van het kleinste (grootste) vast punt. Voorbeeld Voor de monotone afbeelding T : P(A) P(A) : X X B die we reeds een aantal keer ontmoet hebben geldt:. X is een vast punt X B = X X B 2. Het kleinste vast punt is 3. Het grootste vast punt is B 47

149 Het blijkt nu dat elke monotone afbeelding op een complete tralie tenminste één vast punt toelaat. Meer nog, er is altijd een kleinste en een grootste vast punt. Stelling 3..2 (Stelling van Tarski) Zij T : L L een monotone afbeelding op een complete tralie L,, dan heeft T een kleinste vast punt a en een grootste vast punt b. Bovendien geldt: a = inf{x T(x) = x} = inf{x T(x) x} b = sup{x T(x) = x} = sup{x T(x) x} Vooraleer we deze stelling bewijzen kijken we nog even terug naar bovenstaand voorbeeld. T(X) X B X X en aan deze laatste voorwaarde is altijd voldaan. Bijgevolg is inf{x T(X) X} = inf(p(a)) = en inf{x T(X) = X} = inf{x X B} = het kleinste vast punt voor T, zoals voorspeld door de stelling van Tarski. T(X) X B X X X B. Dus geldt dat sup{x T(X) X} = sup{x X B} = B = sup{x T(X) = X} het grootste vast punt van T is. Merk op dat indien a = inf{x T(x) = x} een vast punt is voor T, dat dan automatisch a het kleinste vast punt is. Bewijs van de stelling van Tarski: We geven enkel het bewijs voor het kleinste vast punt. Het geval van het grootste vast punt is analoog. Noem G = {x T(x) x} en neem g = inf(g) (Dit infimum bestaat omdat L, een complete tralie is en G niet leeg is (want G)). We delen het bewijs op in verschillende stappen: We tonen eerst aan dat g G: x G geldt g x x G : T(g) T(x) (T is monotoon) x G : T(g) x (T(x) x, x G) T(g) is een ondergrens van G T(g) g (g is de grootste ondergrens van G) g G Vervolgens tonen we aan dat g een vast punt is voor T: we moeten dus bewijzen dat T(g) = g. Aangezien we reeds weten dat T(g) g (want 48

150 g G) is het voldoende te bewijzen dat T(g) g. T(g) g T(T(g)) T(g) (T is monotoon) T(g) G (door de definitie van G) g T(g) (g = inf(g)) Tenslotte tonen we aan dat g het kleinste vast punt is: Hiervoor is het voldoende te bewijzen dat g = g def = inf {x T(x) = x}. Daar g }{{} G def = G geldt zeker dat g g. Anderzijds geldt: x G : g x x G : g x want G G. De bovenstaande regel zegt dus dat g een ondergrens is voor G, maar aangezien g de grootste ondergrens is, kunnen we besluiten met g g. Gevolg 3..3 Zij T : L L een monotone afbeelding op een complete tralie. Veronderstel dat a L en a T(a), dan bestaat er een vast punt a zodat a a. Veronderstel dat b L en b T(b), dan bestaat er een vast punt b zodat b b. 3.2 De stelling van Kleene Bewijs: Het volstaat om voor a het kleinste vast punt van T te nemen en voor b het grootste vast punt. Om de stelling van Kleene te kunnen formuleren, voeren we de volgende notaties in 2 Notatie: Zij T : L L een monotone afbeelding op een complete tralie L. Dan noteren we T = T (n + ) = T(T n), voor elke n N T ω = sup{t n n N} Aangezien T =, het allerkleinste element van L, kan het dus niet anders dan dat T = T(T ) = T( ) = T. 2 Deze notaties zijn eigenlijk speciale gevallen van wat ordinale machten genoemd worden. 49

151 Uit T T volgt dat T(T ) T(T ) of dus T T 2. In het algemeen hebben we dat T T T 2 T n T (n + ) Omdat nu T ω = sup{t n n N}, is T n T ω, zodat we uiteindelijk komen tot: T T T 2 T n T ω. De ingevoerde notaties bepalen bijgevolg een stijgende rij. De elementen van deze rij worden bovendien nooit groter dan het kleinste vaste punt. Stelling 3.2. Zij T : L L een monotone afbeelding op een complete tralie L en zij a het kleinste vast punt van T, dan is T ω a. Bewijs: Daar T ω = sup{t n n N} is het voldoende om aan te tonen dat a een bovengrens is voor de verzameling {T n n N}. We tonen daarom per inductie aan dat T n a, voor alle n N. Voor n =, is T n = a. Onderstel nu dat T n a, voor alle n N, dan volgt uit T N a dat waarmee de inductie voltooid is T (N + ) = T(T N) T(a) = a. De stelling van Kleene zegt nu dat, onder de sterkere voorwaarde dat T continu is, het kleinste vast punt wel degelijk bereikt wordt. Stelling De stelling van Kleene Zij T : L L een continue afbeelding op een complete tralie L,, dan is T ω = het kleinste vast punt van T. Bewijs: Wegens stelling 3.2. is het voldoende om aan te tonen dat T ω een vast punt is. We merken eerst op dat de verzameling X = {T n n N} een gerichte deelverzameling van L is. Inderdaad, elke niet lege eindige deelverzameling van X is te schrijven als {T n, T n 2, T n 3,..., T n k } met k N en n n 2 n 3 n k. Dan geldt eveneens dat T n T n 2 T n 3 T n k. 5

152 Bijgevolg is T n k X een bovengrens voor {T n, T n 2, T n 3,..., T n k }, wat aantoont dat X gericht is. We berekenen nu T(T ω) = T(sup{T n n N}) (definitie T ω) = sup(t {T n n N}) (T is continu) = sup({t(t n) n N}) = sup{t (n + ) n N} = sup{t n n N} (T speelt geen rol voor sup) = T ω wat aantoont dat T ω wel degelijk een vast punt is. In oefening 9 wordt een voorbeeld gegeven waaruit blijkt dat de continuïteitsvoorwaarde uit de stelling van Kleene niet kan weggelaten worden. 3.3 Voorbeeld: de transitieve sluiting van een relatie Reeds in het hoofdstuk over grafentheorie werd het begrip van de transitieve sluiting van een relatie vermeld. Een exacte definitie wordt gegeven als volgt: Definitie 3.3. Zij R A A een relatie op een verzameling A. De transitieve sluiting van R is de kleinste relatie S op A zodat R S A A en S is transitief. Dat deze definitie zin heeft volgt onmiddellijk uit de volgende eigenschap. Eigenschap De transitieve sluiting van een relatie R op een verzameling A bestaat altijd en is gelijk aan S = S τ S, met τ = {S A A R S en S is transitief} Bewijs. Daar A A een transitieve relatie is die R omvat is τ en heeft het zin om de voorgestelde doorsnede te bekijken. 2. Daar R S voor alle S τ is ook R S. De relatie S is bovendien transitief want veronderstel dat xs y en ys z voor bepaalde x,y,z A, dan geldt: xsy en ysz, S τ xsz, S τ xs z 5

153 wat aan te tonen was. 3. S is de kleinste transitieve relatie op A die R omvat. Want onderstel dat S een transitieve relatie is die R omvat, dan geldt dat S = S τ S S. Dit beëindigt het bewijs. De bovenstaande eigenschap toont aan dat zo n transitieve sluiting wel degelijk bestaat, maar niet hoe we in de praktijk de transitieve sluiting van een relatie kunnen construeren. Een constructieve manier om de transitieve sluiting te vinden kan gevonden worden met behulp van een toepassing van de stelling van Kleene. Om ons probleem in het kader van de stelling van Kleene te plaatsen hebben we nood aan een complete tralie. Daarom stellen we vanaf nu L, gelijk aan de partieel geordende verzameling L, = {S A A R S},. Eigenschap Deze L, is een complete tralie. Bewijs: We moeten aantonen dat elke X L een supremum en een infimum heeft dat behoort tot L. Dit is echter evident daar inf(x) = S R (want R S, S X). S X sup(x) = S X S R. Naast de complete tralie hebben we ook nog nood aan een continue afbeelding T op L, waarvan het kleinste vast punt samenvalt met de transitieve sluiting van R. Daarom voeren we de volgende definitie in: Definitie Op L, beschouwen we vanaf nu de afbeelding T : L L : S T(S) met T(S) = S {(a,b) A A c A, (a,c) S en (c,b) S}. Deze functie voldoet inderdaad aan onze wensen zoals blijkt uit de volgende twee eigenschappen. 52

154 Eigenschap De transitieve sluiting van de relatie R is precies het kleinste vast punt van T. Bewijs Daar het bestaan van een kleinste vast punt voor T onmiddellijk volgt uit de eigenschap na deze, nemen we hier direct aan dat de toekenning S = het kleinste vast punt voor T zinvol is. We moeten dus enkel nog argumenteren waarom S de transitieve sluiting is van T. We merken ten eerste op dat elk vast punt voor T een transitieve relatie is die R omvat. Zij S namelijk een relatie met T(S) = S dan geldt dat S = T(S) = S {(a,b) A A c A, (a,c) S en (c,b) S}. Waaruit volgt dat {(a,b) A A c A, (a,c) S en (c,b) S} S. Indien nu echter voor willekeurige a,b,c A geldt dat asc en csb (of dus (a,c) S en (c, b) S), volgt uit het voorgaande dat ook asb, wat aantoont dat S transitief is. Daar elk element uit L de relatie R omvat, omvat ook elk vast punt voor T, de relatie R. Omgekeerd geldt dat indien S een transitieve relatie is die R omvat, dat S een vast punt is voor T. Dit wordt op een analoge manier aangetoond als de vorige opmerking. Hieruit volgt dat de transitieve relaties die R omvatten precies samenvallen met de vaste punten van T. Bijgevolg valt de transitieve sluiting van R precies samen met het kleinste vast punt voor T. Eigenschap De afbeelding T is een continue afbeelding op de complete tralie L,. Bewijs Beschouw een gerichte deelverzameling X L. We moeten aantonen dat T(sup(X)) = sup(t(x)) Enerzijds hebben we dat ( ) T(sup(X)) = T S En anderzijds geldt sup(t(x)) S X = ( S) {(a,b) c A met (a,c) S en (c,b) S} S X S X S X 53

155 ({ }) = sup S {(a,b) c A met (a,c) S en (c,b) S} S X = (S {(a,b) c A met (a,c) S en (c,b) S}) S X = ( S X S) ( ) {(a,b) c A met (a,c) S en (c,b) S}. S X Hieruit volgt dat het voldoende is om aan te tonen dat {(a,b) c A met (a,c) S en (c,b) S} = S X S X {(a,b) c A met (a,c) S en (c,b) S} S X We beschouwen deze gelijkheid als twee inclusies waarvan de inclusie vanzelfsprekend waar is. We hoeven dus nog enkel de inclusie aan te tonen. Neem een willekeurig element (a,b ) {(a,b) c A met (a,c) S X S en (c,b) S X S}. Dan bestaat er een verzameling S X en een verzameling S 2 X, zodat c A met (a,c ) S en (c,b ) S 2. Aangezien echter X een gerichte verzameling is, behoort ook S = sup({s,s 2 }) = S S2 tot X. Hieruit volgt dat er een S X bestaat zodat, (a,c ) S en (c,b ) S. We kunnen bijgevolg besluiten dat (a,b ) {(a,b) c A met (a,c) S en (c,b) S}, S X wat nog te bewijzen was. Als een onmiddellijk gevolg van de stelling van Kleene krijgen we nu Gevolg De transitieve sluiting van de relatie R valt samen met T ω. We merken op dat in vele gevallen de transitieve sluiting van een relatie reeds samenvalt met T n, voor een natuurlijk getal n N. Voorbeeld Beschouw de relatie R op Z die gegeven wordt door het voorschrift xry y = x +. We stellen R = T voor op de volgende tekening: Om de transitieve sluiting van R te vinden berekenen we eerst T. Het resultaat wordt voorgesteld door: Indien we dit proces verder zetten, zien we in dat T ω samenvalt met de relatie < op Z. Het is ook zo dat T n T ω, n N. 54

156 4 Referenties J. W. Lloyd, Foundations of Logic Programming, Springer (Berlin), 993 P. M. Cohn, Algebra, Volume 2, John Wiley & Sons,

157 5 Oefeningen. Onderstel dat R een orderelatie is op een verzameling A. Toon aan dat R ook een orderelatie is. 2. Beschouw een willekeurige verzameling A en neem X P(A). Toon aan dat in de geordende verzameling P(A), geldt dat sup(x) = C en inf(x) = C C X C X 3. Neem een willekeurige oneindige verzameling A en neem X = {B A B is eindig}. Toon aan dat X in P(A) slechts één bovengrens heeft, namelijk A. 4. Geef een voorbeeld van een complete tralie L, en een deelverzameling X L die niet gericht is. 5. Toon aan dat de afbeelding f : [,] [,] : x { 2 x als x < 2 2 x + 2 als 2 x op de complete tralie [,], (uit het voorbeeld op pagina 46) wel monotoon is, maar niet continu. 6. Is de afbeelding T : N N : x x + monotoon op (a) N,? (b) N,? (c) N,? { 2x als x even is 7. Is de afbeelding T : N N : x x als x oneven is monotoon op (a) N,? (b) N,? 8. Hieronder vind je een aantal afdrukken van grafieken op de complete tralie [, ],. Welke grafieken stellen een continue afbeelding op [, ] voor? (Continu in de zin van deze cursus!). Kun je een algemene kenschets geven van de continue afbeeldingen op deze complete tralie (geen bewijzen nodig)? 56

158 9. Beschouw de monotone afbeelding { T(x) = T : [,] [,] : x als x < 2 T(x) = x als 2 x Toon aan dat T ω geen vast punt is. Is T continu?. Toon aan dat voor elke monotone afbeelding op de complete tralie N,, geldt dat T ω het kleinste vast punt is van T. Ken je ook een voorbeeld van een niet continue functie op N,.. Werk de details uit van het voorbeeld dat geschetst wordt op pagina

Fundamenten van de Informatica

Fundamenten van de Informatica Fundamenten van de Informatica Luc De Raedt Academiejaar 2006-2007 naar de cursustekst van Karel Dekimpe en Bart Demoen A.1: Talen en Eindige Automaten 1 Deel 1: Inleiding 2 Motivatie Fundamenten van de

Nadere informatie

Automaten & Complexiteit (X )

Automaten & Complexiteit (X ) Automaten & Complexiteit (X 401049) Inleiding Jeroen Keiren [email protected] VU University Amsterdam Materiaal Peter Linz An Introduction to Formal Languages and Automata (5th edition) Jones and Bartlett

Nadere informatie

Automaten. Informatica, UvA. Yde Venema

Automaten. Informatica, UvA. Yde Venema Automaten Informatica, UvA Yde Venema i Inhoud Inleiding 1 1 Formele talen en reguliere expressies 2 1.1 Formele talen.................................... 2 1.2 Reguliere expressies................................

Nadere informatie

3 De stelling van Kleene

3 De stelling van Kleene 18 3 De stelling van Kleene Definitie 3.1 Een formele taal heet regulier als hij wordt herkend door een deterministische eindige automaat. Talen van de vorm L(r) met r een reguliere expressie noemen we

Nadere informatie

Automaten & Complexiteit (X )

Automaten & Complexiteit (X ) Automaten & Complexiteit (X 401049) Beschrijven van reguliere talen Jeroen Keiren [email protected] VU University Amsterdam 5 Februari 2015 Talen Vorig college: Talen als verzamelingen Eindige automaten:

Nadere informatie

c, X/X a, c/λ a, X/aX b, X/X

c, X/X a, c/λ a, X/aX b, X/X ANTWOORDEN tentamen FUNDAMENTELE INFORMATICA 3 vrijdag 25 januari 2008, 10.00-13.00 uur Opgave 1 L = {x {a,b,c} n a (x) n b (x)} {x {a,b,c} n a (x) n c (x)}. a. Een stapelautomaat die L accepteert: Λ,

Nadere informatie

Talen & Automaten. Wim Hesselink Piter Dykstra Opleidingsinstituut Informatica en Cognitie 9 mei 2008

Talen & Automaten. Wim Hesselink Piter Dykstra Opleidingsinstituut Informatica en Cognitie   9 mei 2008 Talen & Automaten Wim Hesselink Piter Dykstra Opleidingsinstituut Informatica en Cognitie www.cs.rug.nl/~wim 9 mei 2008 Talen & automaten Week 1: Inleiding Dit college Talen Automaten Berekenbaarheid Weekoverzicht

Nadere informatie

opgaven formele structuren deterministische eindige automaten

opgaven formele structuren deterministische eindige automaten opgaven formele structuren deterministische eindige automaten Opgave. De taal L over het alfabet {a, b} bestaat uit alle strings die beginnen met aa en eindigen met ab. Geef een reguliere expressie voor

Nadere informatie

Getallensystemen, verzamelingen en relaties

Getallensystemen, verzamelingen en relaties Hoofdstuk 1 Getallensystemen, verzamelingen en relaties 1.1 Getallensystemen 1.1.1 De natuurlijke getallen N = {0, 1, 2, 3,...} N 0 = {1, 2, 3,...} 1.1.2 De gehele getallen Z = {..., 4, 3, 2, 1, 0, 1,

Nadere informatie

1 Rekenen in eindige precisie

1 Rekenen in eindige precisie Rekenen in eindige precisie Een computer rekent per definitie met een eindige deelverzameling van getallen. In dit hoofdstuk bekijken we hoe dit binnen een computer is ingericht, en wat daarvan de gevolgen

Nadere informatie

Rekenen aan wortels Werkblad =

Rekenen aan wortels Werkblad = Rekenen aan wortels Werkblad 546121 = Vooraf De vragen en opdrachten in dit werkblad die vooraf gegaan worden door, moeten schriftelijk worden beantwoord. Daarbij moet altijd duidelijk zijn hoe de antwoorden

Nadere informatie

Automaten en Berekenbaarheid

Automaten en Berekenbaarheid Automaten en Berekenbaarheid Bart Demoen KU Leuven 2016-2017 Les 8: 118-125 orakels en reducties met orakels Turing-berekenbare functies de bezige bever Orakelmachines I 2/14 we kennen al: een TM die een

Nadere informatie

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c

start -> id (k (f c s) (g s c)) -> k (f c s) (g s c) -> f c s -> s c Een Minimaal Formalisme om te Programmeren We hebben gezien dat Turing machines beschouwd kunnen worden als universele computers. D.w.z. dat iedere berekening met natuurlijke getallen die met een computer

Nadere informatie

We beginnen met de eigenschappen van de gehele getallen.

We beginnen met de eigenschappen van de gehele getallen. II.2 Gehele getallen We beginnen met de eigenschappen van de gehele getallen. Axioma s voor Z De gegevens zijn: (a) een verzameling Z; (b) elementen 0 en 1 in Z; (c) een afbeelding +: Z Z Z, de optelling;

Nadere informatie

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Uitwerking tentamen Analyse van Algoritmen, 29 januari Uitwerking tentamen Analyse van Algoritmen, 29 januari 2007. (a) De buitenste for-lus kent N = 5 iteraties. Na iedere iteratie ziet de rij getallen er als volgt uit: i rij na i e iteratie 2 5 4 6 2 2 4

Nadere informatie

opgaven formele structuren tellen Opgave 1. Zij A een oneindige verzameling en B een eindige. Dat wil zeggen (zie pagina 6 van het dictaat): 2 a 2.

opgaven formele structuren tellen Opgave 1. Zij A een oneindige verzameling en B een eindige. Dat wil zeggen (zie pagina 6 van het dictaat): 2 a 2. opgaven formele structuren tellen Opgave 1. Zij A een oneindige verzameling en B een eindige. Dat wil zeggen (zie pagina 6 van het dictaat): ℵ 0 #A, B = {b 0,..., b n 1 } voor een zeker natuurlijk getal

Nadere informatie

Zomercursus Wiskunde. Katholieke Universiteit Leuven Groep Wetenschap & Technologie. September 2008

Zomercursus Wiskunde. Katholieke Universiteit Leuven Groep Wetenschap & Technologie. September 2008 Katholieke Universiteit Leuven September 008 Algebraïsch rekenen (versie 7 juni 008) Inleiding In deze module worden een aantal basisrekentechnieken herhaald. De nadruk ligt vooral op het symbolisch rekenen.

Nadere informatie

Gödels theorem An Incomplete Guide to Its Use and Abuse, Hoofdstuk 3

Gödels theorem An Incomplete Guide to Its Use and Abuse, Hoofdstuk 3 Gödels theorem An Incomplete Guide to Its Use and Abuse, Hoofdstuk 3 Koen Rutten, Aris van Dijk 30 mei 2007 Inhoudsopgave 1 Verzamelingen 2 1.1 Definitie................................ 2 1.2 Eigenschappen............................

Nadere informatie

2 n 1. OPGAVEN 1 Hoeveel cijfers heeft het grootste bekende Mersenne-priemgetal? Met dit getal vult men 320 krantenpagina s.

2 n 1. OPGAVEN 1 Hoeveel cijfers heeft het grootste bekende Mersenne-priemgetal? Met dit getal vult men 320 krantenpagina s. Hoofdstuk 1 Getallenleer 1.1 Priemgetallen 1.1.1 Definitie en eigenschappen Een priemgetal is een natuurlijk getal groter dan 1 dat slechts deelbaar is door 1 en door zichzelf. Om technische redenen wordt

Nadere informatie

Inhoud eindtoets. Eindtoets. Introductie 2. Opgaven 3. Terugkoppeling 6

Inhoud eindtoets. Eindtoets. Introductie 2. Opgaven 3. Terugkoppeling 6 Inhoud eindtoets Eindtoets Introductie 2 Opgaven 3 Terugkoppeling 6 1 Formele talen en automaten Eindtoets I N T R O D U C T I E Deze eindtoets is bedoeld als voorbereiding op het tentamen van de cursus

Nadere informatie

Vorig college. IN2505-II Berekenbaarheidstheorie College 4. Opsommers versus herkenners (Th. 3.21) Opsommers

Vorig college. IN2505-II Berekenbaarheidstheorie College 4. Opsommers versus herkenners (Th. 3.21) Opsommers Vorig college College 4 Algoritmiekgroep Faculteit EWI TU Delft Vervolg NDTM s Vergelijking rekenkracht TM s en NDTM s Voorbeelden NDTM s 20 april 2009 1 2 Opsommers Opsommers versus herkenners (Th. 3.21)

Nadere informatie

Getallenleer Inleiding op codeertheorie. Cursus voor de vrije ruimte

Getallenleer Inleiding op codeertheorie. Cursus voor de vrije ruimte Getallenleer Inleiding op codeertheorie Liliane Van Maldeghem Hendrik Van Maldeghem Cursus voor de vrije ruimte 2 Hoofdstuk 1 Getallenleer 1.1 Priemgetallen 1.1.1 Definitie en eigenschappen Een priemgetal

Nadere informatie

Oplossingen oefeningen logica en eindige automaten 12 december Het bestand oplnoef12dec.zip bevat de.sen en.fa bestanden met de oplossingen.

Oplossingen oefeningen logica en eindige automaten 12 december Het bestand oplnoef12dec.zip bevat de.sen en.fa bestanden met de oplossingen. Oplossingen oefeningen logica en eindige automaten 12 december 2003 Het bestand oplnoef12dec.zip bevat de.sen en.fa bestanden met de oplossingen. Oefening 1 Deel 1: Logica Vertaal de volgende zinnen in

Nadere informatie

1 Delers 1. 3 Grootste gemene deler en kleinste gemene veelvoud 12

1 Delers 1. 3 Grootste gemene deler en kleinste gemene veelvoud 12 Katern 2 Getaltheorie Inhoudsopgave 1 Delers 1 2 Deelbaarheid door 2, 3, 5, 9 en 11 6 3 Grootste gemene deler en kleinste gemene veelvoud 12 1 Delers In Katern 1 heb je geleerd wat een deler van een getal

Nadere informatie

Het omzetten van reguliere expressies naar eindige automaten, zie de vakken Fundamentele Informatica 1 en 2.

Het omzetten van reguliere expressies naar eindige automaten, zie de vakken Fundamentele Informatica 1 en 2. Datastructuren 2016 Programmeeropdracht 3: Patroonherkenning Deadlines. Woensdag 23 november 23:59, resp. vrijdag 9 december 23:59. Inleiding. Deze opdracht is gebaseerd op Hoofdstuk 13.1.7 in het boek

Nadere informatie

Bijzondere kettingbreuken

Bijzondere kettingbreuken Hoofdstuk 15 Bijzondere kettingbreuken 15.1 Kwadratische getallen In het vorige hoofdstuk hebben we gezien dat 2 = 1, 2, 2, 2, 2, 2, 2,.... Men kan zich afvragen waarom we vanaf zeker moment alleen maar

Nadere informatie

Projectieve Vlakken en Codes

Projectieve Vlakken en Codes Projectieve Vlakken en Codes 1. De Fanocode Foutdetecterende en foutverbeterende codes. Anna en Bart doen mee aan een spelprogramma voor koppels. De ene helft van de deelnemers krijgt elk een kaart waarop

Nadere informatie

Automaten en Berekenbaarheid

Automaten en Berekenbaarheid Automaten en Berekenbaarheid Bart Demoen KU Leuven 2016-2017 Les 2: 20-35 reguliere expressies NFA DFA minimalisatie Van RE naar NFA I 2/11 structureel (als algebra s) zijn RegExp en de NFA s gelijk voor

Nadere informatie

Paradox van zelfreproductie. IN2505-II Berekenbaarheidstheorie. Zelfreproductie? Programma s en zelfreproductie. College 11.

Paradox van zelfreproductie. IN2505-II Berekenbaarheidstheorie. Zelfreproductie? Programma s en zelfreproductie. College 11. Paradox van zelfreproductie College 11 Algoritmiekgroep Faculteit EWI TU Delft 27 mei 2009 1 Levende wezens zijn machines. 2 Levende wezens kunnen zich reproduceren. 3 Machines kunnen zich niet reproduceren.

Nadere informatie

Zomercursus Wiskunde. Module 1 Algebraïsch rekenen (versie 22 augustus 2011)

Zomercursus Wiskunde. Module 1 Algebraïsch rekenen (versie 22 augustus 2011) Katholieke Universiteit Leuven September 011 Module 1 Algebraïsch rekenen (versie augustus 011) Inhoudsopgave 1 Rekenen met haakjes 1.1 Uitwerken van haakjes en ontbinden in factoren............. 1. De

Nadere informatie

Uitwerking Opgaven Formele talen, grammaticas en automaten Week 1

Uitwerking Opgaven Formele talen, grammaticas en automaten Week 1 Uitwerking Opgaven Formele talen, grammaticas en automaten Week 1 Bas Westerbaan [email protected] 24 april 2012 1 Opgave 1.1 Een goed en voldoende antwoord is: L 1 = L 2, want L 1 en L 2 zijn alle woorden

Nadere informatie

Getaltheorie I. c = c 1 = 1 c (1)

Getaltheorie I. c = c 1 = 1 c (1) Lesbrief 1 Getaltheorie I De getaltheorie houdt zich bezig met het onderzoek van eigenschappen van gehele getallen, en meer in het bijzonder, van natuurlijke getallen. In de getaltheorie is het gebruikelijk

Nadere informatie

VERZAMELINGEN EN AFBEELDINGEN

VERZAMELINGEN EN AFBEELDINGEN I VERZAMELINGEN EN AFBEELDINGEN Het begrip verzameling kennen we uit het dagelijks leven: een bibliotheek bevat een verzameling van boeken, een museum een verzameling van kunstvoorwerpen. We kennen verzamelingen

Nadere informatie

Verzamelingen deel 2. Tweede college

Verzamelingen deel 2. Tweede college 1 Verzamelingen deel 2 Tweede college herhaling Deelverzameling: AB wil zeggen dat elk element van A ook in B te vinden is: als x A dan x B Er geldt: A=B AB en BA De lege verzameling {} heeft geen elementen.

Nadere informatie

Uitleg van de Hough transformatie

Uitleg van de Hough transformatie Uitleg van de Hough transformatie Maarten M. Fokkinga, Joeri van Ruth Database groep, Fac. EWI, Universiteit Twente Versie van 17 mei 2005, 10:59 De Hough transformatie is een wiskundige techniek om een

Nadere informatie

Formeel Denken 2014 Uitwerkingen Tentamen

Formeel Denken 2014 Uitwerkingen Tentamen Formeel Denken 2014 Uitwerkingen Tentamen (29/01/15) 1. Benader de betekenis van de volgende Nederlandse zin zo goed mogelijk (6 punten) door een formule van de propositielogica: Als het regent word ik

Nadere informatie

(iii) Enkel deze bundel afgeven; geen bladen toevoegen, deze worden toch niet gelezen!

(iii) Enkel deze bundel afgeven; geen bladen toevoegen, deze worden toch niet gelezen! Examen Wiskundige Basistechniek, reeks A 12 oktober 2013, 13:30 uur Naam en Voornaam: Lees eerst dit: (i) Naam en voornaam hierboven invullen. (ii) Nietje niet losmaken. (iii) Enkel deze bundel afgeven;

Nadere informatie

Lights Out. 1 Inleiding

Lights Out. 1 Inleiding Lights Out 1 Inleiding Het spel Lights Out is een elektronisch spel dat gelanceerd werd in 1995 door Tiger Electronics. Het originele spel heeft een bord met 25 lampjes in een rooster van 5 rijen en 5

Nadere informatie

Je hebt twee uur de tijd voor het oplossen van de vraagstukken. µkw uitwerkingen. 12 juni 2015

Je hebt twee uur de tijd voor het oplossen van de vraagstukken. µkw uitwerkingen. 12 juni 2015 Je hebt twee uur de tijd voor het oplossen van de vraagstukken. Elk vraagstuk is maximaal 10 punten waard. Begin elke opgave op een nieuw vel papier. µkw uitwerkingen 12 juni 2015 Vraagstuk 1. We kunnen

Nadere informatie

Hoofdstuk 3. Equivalentierelaties. 3.1 Modulo Rekenen

Hoofdstuk 3. Equivalentierelaties. 3.1 Modulo Rekenen Hoofdstuk 3 Equivalentierelaties SCHAUM 2.8: Equivalence Relations Twee belangrijke voorbeelden van equivalentierelaties in de informatica: resten (modulo rekenen) en cardinaliteit (aftelbaarheid). 3.1

Nadere informatie

Radboud Universiteit Nijmegen

Radboud Universiteit Nijmegen Radboud Universiteit Nijmegen Faculteit der Natuurwetenschappen, Wiskunde en Informatica L(,1)-labeling van grafen Naam: Studentnummer: Studie: Begeleider: Myrte klein Brink 4166140 Bachelor Wiskunde Dr.

Nadere informatie

Volledige inductie. Hoofdstuk 7. Van een deelverzameling V van de verzameling N van alle natuurlijke getallen veronderstellen.

Volledige inductie. Hoofdstuk 7. Van een deelverzameling V van de verzameling N van alle natuurlijke getallen veronderstellen. Hoofdstuk 7 Volledige inductie Van een deelverzameling V van de verzameling N van alle natuurlijke getallen veronderstellen we het volgende: (i) 0 V (ii) k N k V k + 1 V Dan is V = N. Men ziet dit als

Nadere informatie

Uitwerkingen Rekenen met cijfers en letters

Uitwerkingen Rekenen met cijfers en letters Uitwerkingen Rekenen met cijfers en letters Maerlant College Brielle 5 oktober 2009 c Swier Garst - RGO Middelharnis 2 Inhoudsopgave Rekenen met gehele getallen 7. De gehele getallen.....................................

Nadere informatie

Lab Webdesign: Javascript 3 maart 2008

Lab Webdesign: Javascript 3 maart 2008 H5: OPERATORS In dit hoofdstuk zullen we het hebben over de operators (of ook wel: operatoren) in JavaScript waarmee allerlei rekenkundige en logische bewerkingen kunnen worden uitgevoerd. Daarbij zullen

Nadere informatie

inhoudsopgave januari 2005 handleiding algebra 2

inhoudsopgave januari 2005 handleiding algebra 2 handleiding algebra inhoudsopgave Inhoudsopgave 2 De grote lijn 3 Bespreking per paragraaf 1 Routes in een rooster 4 2 Oppervlakte in een rooster 4 3 Producten 4 4 Onderzoek 5 Tijdpad 9 Materialen voor

Nadere informatie

OPLOSSINGEN VAN DE OEFENINGEN

OPLOSSINGEN VAN DE OEFENINGEN OPLOSSINGEN VAN DE OEFENINGEN 1.3.1. Er zijn 42 mogelijke vercijferingen. 2.3.4. De uitkomsten zijn 0, 4 en 4 1 = 4. 2.3.6. Omdat 10 = 1 in Z 9 vinden we dat x = c 0 +... + c m = c 0 +... + c m. Het getal

Nadere informatie

Examen Datastructuren en Algoritmen II

Examen Datastructuren en Algoritmen II Tweede bachelor Informatica Academiejaar 2012 2013, tweede zittijd Examen Datastructuren en Algoritmen II Naam :.............................................................................. Lees de hele

Nadere informatie

3 Wat is een stelsel lineaire vergelijkingen?

3 Wat is een stelsel lineaire vergelijkingen? In deze les bekijken we de situatie waarin er mogelijk meerdere vergelijkingen zijn ( stelsels ) en meerdere variabelen, maar waarin elke vergelijking er relatief eenvoudig uitziet, namelijk lineair is.

Nadere informatie

TW2020 Optimalisering

TW2020 Optimalisering TW2020 Optimalisering Hoorcollege 11 Leo van Iersel Technische Universiteit Delft 25 november 2015 Leo van Iersel (TUD) TW2020 Optimalisering 25 november 2015 1 / 28 Vandaag Vraag Voor welke problemen

Nadere informatie

Reguliere Expressies

Reguliere Expressies Reguliere Expressies Een reguliere expressie (regexp, regex, regxp) is een string (een woord) die, volgens bepaalde syntaxregels, een verzameling strings (een taal) beschrijft Reguliere expressies worden

Nadere informatie

Memoriseren: Een getal is deelbaar door 10 als het laatste cijfer een 0 is. Of: Een getal is deelbaar door 10 als het eindigt op 0.

Memoriseren: Een getal is deelbaar door 10 als het laatste cijfer een 0 is. Of: Een getal is deelbaar door 10 als het eindigt op 0. REKENEN VIJFDE KLAS en/of ZESDE KLAS Luc Cielen 1. REGELS VAN DEELBAARHEID. Luc Cielen: Regels van deelbaarheid, grootste gemene deler en kleinste gemeen veelvoud 1 Deelbaarheid door 10, 100, 1000. Door

Nadere informatie

Supplement Verzamelingenleer. A.J.M. van Engelen en K. P. Hart

Supplement Verzamelingenleer. A.J.M. van Engelen en K. P. Hart Supplement Verzamelingenleer A.J.M. van Engelen en K. P. Hart 1 Hoofdstuk 1 Het Keuzeaxioma Het fundament van de hedendaagse verzamelingenleer werd in de vorige eeuw gelegd door Georg Cantor. Cantor gebruikte

Nadere informatie

Rekenen met cijfers en letters

Rekenen met cijfers en letters Rekenen met cijfers en letters Maerlant College Brielle 5 oktober 009 c Swier Garst - RGO Middelharnis Inhoudsopgave Rekenen met gehele getallen 7. De gehele getallen.....................................

Nadere informatie

V = {a, b, c, d, e} Computernetwerken: de knopen zijn machines in het netwerk, de kanten zijn communicatiekanalen.

V = {a, b, c, d, e} Computernetwerken: de knopen zijn machines in het netwerk, de kanten zijn communicatiekanalen. WIS14 1 14 Grafen 14.1 Grafen Gerichte grafen Voor een verzameling V is een binaire relatie op V een verzameling geordende paren van elementen van V. Voorbeeld: een binaire relatie op N is de relatie KleinerDan,

Nadere informatie

Automaten en Berekenbaarheid

Automaten en Berekenbaarheid Automaten en Berekenbaarheid Bart Demoen KU Leuven 2016-2017 Les 3: 36-54 Myhill-Nerode relaties; regulier pompen Myhill-Nerode equivalentieklassen in Σ I 2/10 belangrijk te verstaan: een equivalentie-relatie

Nadere informatie

Inleiding Analyse 2009

Inleiding Analyse 2009 Inleiding Analyse 2009 Inleveropgaven A). Stel f(, y) = In (0, 0) is f niet gedefinieerd. We bestuderen y2 2 + y 4. lim f(, y). (,y) (0,0) 1. Bepaal de waarde van f(, y) op een willekeurige rechte lijn

Nadere informatie

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms Giso Dal (0752975) Pagina s 5 7 1 Deelverzameling Representatie

Nadere informatie

Examen Datastructuren en Algoritmen II

Examen Datastructuren en Algoritmen II Tweede bachelor Informatica Academiejaar 2014 2015, eerste zittijd Examen Datastructuren en Algoritmen II Naam :.............................................................................. Lees de hele

Nadere informatie

Aanvullingen bij Hoofdstuk 6

Aanvullingen bij Hoofdstuk 6 Aanvullingen bij Hoofdstuk 6 We veralgemenen eerst Stelling 6.4 tot een willekeurige lineaire transformatie tussen twee vectorruimten en de overgang naar twee nieuwe basissen. Stelling 6.4. Zij A : V W

Nadere informatie

Aanvullingen bij Hoofdstuk 8

Aanvullingen bij Hoofdstuk 8 Aanvullingen bij Hoofdstuk 8 8.5 Definities voor matrices De begrippen eigenwaarde eigenvector eigenruimte karakteristieke veelterm en diagonaliseerbaar worden ook gebruikt voor vierkante matrices los

Nadere informatie

1 Limiet van een rij Het begrip rij Bepaling van een rij Expliciet voorschrift Recursief voorschrift 3

1 Limiet van een rij Het begrip rij Bepaling van een rij Expliciet voorschrift Recursief voorschrift 3 HOOFDSTUK 6: RIJEN 1 Limiet van een rij 2 1.1 Het begrip rij 2 1.2 Bepaling van een rij 2 1.2.1 Expliciet voorschrift 2 1.2.2 Recursief voorschrift 3 1.2.3 Andere gevallen 3 1.2.4 Rijen met de grafische

Nadere informatie

Ruimtemeetkunde deel 1

Ruimtemeetkunde deel 1 Ruimtemeetkunde deel 1 1 Punten We weten reeds dat Π 0 het meetkundig model is voor de vectorruimte R 2. We definiëren nu op dezelfde manier E 0 als meetkundig model voor de vectorruimte R 3. De elementen

Nadere informatie

Hoofdstuk 4 Het schakelen van weerstanden.

Hoofdstuk 4 Het schakelen van weerstanden. Hoofdstuk 4 Het schakelen van weerstanden.. Doel. Het is de bedoeling een grote schakeling met weerstanden te vervangen door één equivalente weerstand. Een equivalente schakeling betekent dat een buitenstaander

Nadere informatie

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

Netwerkdiagram voor een project. AOA: Activities On Arrows - activiteiten op de pijlen. Netwerkdiagram voor een project. AOA: Activities On Arrows - activiteiten op de pijlen. Opmerking vooraf. Een netwerk is een structuur die is opgebouwd met pijlen en knooppunten. Bij het opstellen van

Nadere informatie

Basiskennis lineaire algebra

Basiskennis lineaire algebra Basiskennis lineaire algebra Lineaire algebra is belangrijk als achtergrond voor lineaire programmering, omdat we het probleem kunnen tekenen in de n-dimensionale ruimte, waarbij n gelijk is aan het aantal

Nadere informatie

Tentamen Grondslagen van de Wiskunde A Met beknopte uitwerking

Tentamen Grondslagen van de Wiskunde A Met beknopte uitwerking Tentamen Grondslagen van de Wiskunde A Met beknopte uitwerking 10 december 2013, 09:30 12:30 Dit tentamen bevat 5 opgaven; zie ook de ommezijde. Alle opgaven tellen even zwaar (10 punten); je cijfer is

Nadere informatie

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

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren HOOFDSTUK 3 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. is het stapsgewijs in code omschrijven wat een programma moet

Nadere informatie

3. Structuren in de taal

3. Structuren in de taal 3. Structuren in de taal In dit hoofdstuk behandelen we de belangrijkst econtrolestructuren die in de algoritmiek gebruikt worden. Dit zijn o.a. de opeenvolging, selectie en lussen (herhaling). Vóór we

Nadere informatie

FLIPIT 5. (a i,j + a j,i )d i d j = d j + 0 = e d. i<j

FLIPIT 5. (a i,j + a j,i )d i d j = d j + 0 = e d. i<j FLIPIT JAAP TOP Een netwerk bestaat uit een eindig aantal punten, waarbij voor elk tweetal ervan gegeven is of er wel of niet een verbinding is tussen deze twee. De punten waarmee een gegeven punt van

Nadere informatie

6.1 Kwadraten [1] HERHALING: Volgorde bij berekeningen:

6.1 Kwadraten [1] HERHALING: Volgorde bij berekeningen: 6.1 Kwadraten [1] HERHALING: Volgorde bij berekeningen: 1) Haakjes wegwerken 2) Vermenigvuldigen en delen van links naar rechts 3) Optellen en aftrekken van links naar rechts Schrijf ALLE stappen ONDER

Nadere informatie

Deel 2. Basiskennis wiskunde

Deel 2. Basiskennis wiskunde Deel 2. Basiskennis wiskunde Vraag 26 Definieer de functie f : R R : 7 cos(2 ). Bepaal de afgeleide van de functie f in het punt 2π/2. (A) f 0 ( 2π/2) = π (B) f 0 ( 2π/2) = 2π (C) f 0 ( 2π/2) = 2π (D)

Nadere informatie

I.3 Functies. I.3.2 Voorbeeld. De afbeeldingen f: R R, x x 2 en g: R R, x x 2 zijn dus gelijk, ook al zijn ze gegeven door verschillende formules.

I.3 Functies. I.3.2 Voorbeeld. De afbeeldingen f: R R, x x 2 en g: R R, x x 2 zijn dus gelijk, ook al zijn ze gegeven door verschillende formules. I.3 Functies Iedereen is ongetwijfeld in veel situaties het begrip functie tegengekomen; vaak als een voorschrift dat aan elk getal een ander getal toevoegt, bijvoorbeeld de functie fx = x die aan elk

Nadere informatie

Willem van Ravenstein

Willem van Ravenstein Willem van Ravenstein 1. Variabelen Rekenen is het werken met getallen. Er zijn vier hoofdbewerkingen: optellen, aftrekken, vermenigvuldigen en delen. Verder ken je de bewerkingen machtsverheffen en worteltrekken.

Nadere informatie

Wiskunde klas 3. Vaardigheden. Inhoudsopgave. 1. Breuken 2. 2. Gelijksoortige termen samennemen 3. 3. Rekenen met machten 3. 4. Rekenen met wortels 4

Wiskunde klas 3. Vaardigheden. Inhoudsopgave. 1. Breuken 2. 2. Gelijksoortige termen samennemen 3. 3. Rekenen met machten 3. 4. Rekenen met wortels 4 Vaardigheden Wiskunde klas Inhoudsopgave. Breuken. Gelijksoortige termen samennemen. Rekenen met machten. Rekenen met wortels. Algebraïsche producten 6. Ontbinden in factoren 6 7. Eerstegraads vergelijkingen

Nadere informatie

Examen G0U13 Bewijzen en Redeneren Bachelor 1ste fase Wiskunde. vrijdag 31 januari 2014, 8:30 12:30. Auditorium L.00.07

Examen G0U13 Bewijzen en Redeneren Bachelor 1ste fase Wiskunde. vrijdag 31 januari 2014, 8:30 12:30. Auditorium L.00.07 Examen G0U13 Bewijzen en Redeneren Bachelor 1ste fase Wiskunde vrijdag 31 januari 2014, 8:30 12:30 Auditorium L.00.07 Geef uw antwoorden in volledige, goed lopende zinnen. Het examen bestaat uit 5 vragen.

Nadere informatie

In Vlaanderen bestaat er nog geen leerlijn programmeren! Hierdoor baseren wij ons op de leerlijn die men in Nederland toepast voor basisscholen.

In Vlaanderen bestaat er nog geen leerlijn programmeren! Hierdoor baseren wij ons op de leerlijn die men in Nederland toepast voor basisscholen. Leerlijn programmeren In Vlaanderen bestaat er nog geen leerlijn programmeren! Hierdoor baseren wij ons op de leerlijn die men in Nederland toepast voor basisscholen. Deze leerlijn is opgebouwd aan de

Nadere informatie

Veeltermen. Module 2. 2.1 Definitie en voorbeelden. Een veelterm met reële coëfficiënten in één veranderlijke x is een uitdrukking van de vorm

Veeltermen. Module 2. 2.1 Definitie en voorbeelden. Een veelterm met reële coëfficiënten in één veranderlijke x is een uitdrukking van de vorm Module 2 Veeltermen 2.1 Definitie en voorbeelden Een veelterm met reële coëfficiënten in één veranderlijke x is een uitdrukking van de vorm a 0 +a 1 x+a 2 x 2 + +a n x n met a 0,a 1,a 2,...,a n Ê en n

Nadere informatie

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

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 ) OI 2010 Finale 12 Mei 2010 Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub VOORNAAM :....................................................... NAAM :..............................................................

Nadere informatie

De Minimax-Stelling en Nash-Evenwichten

De Minimax-Stelling en Nash-Evenwichten De Minima-Stelling en Nash-Evenwichten Sebastiaan A. Terwijn Radboud Universiteit Nijmegen Afdeling Wiskunde 20 september 2010 Dit is een bijlage bij het eerstejaars keuzevak Wiskunde, Politiek, en Economie.

Nadere informatie

Verzamelingen deel 3. Derde college

Verzamelingen deel 3. Derde college 1 Verzamelingen deel 3 Derde college rekenregels Een bewerking op A heet commutatief als voor alle x en y in A geldt dat x y = y x. Een bewerking op A heet associatief als voor alle x, y en z in A geldt

Nadere informatie