
5 minute read
BOMEN EN DOOLHOVEN
HET MAKEN VAN DOOLHOVEN IS IETS WAT SOMMIGE LEERLINGEN
AANSPREEKT. DE MEESTEN HEBBEN DIT REEDS UIT ZICHZELF OP
PAPIER GEDAAN. MAAR EEN ECHTE METHODIEK IS MEESTAL AFWEZIG.
WIJ ZULLEN HIER EEN ALGORITMISCHE METHODE UIT DE DOEKEN
DOEN DIE CONCEPTEN GEBRUIKT UIT DE GRAFENTHEORIE EN UIT
HET COMPUTATIONEEL DENKEN. WE ZULLEN IMMERS EEN DOOLHOF GENEREREN AAN DE HAND VAN EEN GERANDOMISEERDE VERSIE VAN
HET ALGORITME VAN PRIM DOOR HET ZOEKEN NAAR EEN OPSPANNENDE BOOM IN EEN GRIDGRAAF. GEEN PANIEK, WE BEGINNEN BIJ HET BEGIN.
DR. DIDIER DESES IS LERAAR WISKUNDE AAN HET KA KOEKELBERG EN VERBONDEN AAN DE VUB WAAR HIJ EEN SEMINARIE MATLAB DOCEERT. HIJ IS OOK LID VAN T 3-VLAANDEREN, DAT ICT BINNEN DE LESSEN WISKUNDE PROMOOT. DAARNAAST GEEFT HIJ NASCHOLINGEN VOOR LEERKRACHTEN EN HEEFT HIJ DE AFGELOPEN JAREN OOK VEELVULDIG GEPUBLICEERD IN WISKUNDE EN ONDERWIJS, WAAR HIJ OOK LID IS VAN DE REDACTIERAAD. E-MAIL: DIDDESEN@GMAIL.COM.
GRAFEN EN GRIDGRAFEN
We starten met het begrip ongerichte graaf waarbij we geen lussen toelaten. Een ongerichte graaf bestaat uit een verzameling van knopen (vertices en een verzameling van bogen (edges) tussen twee verschillende knopen van : richte graaf genoemd. Een knoop die verbonden is met een andere, noemt men een buur van die knoop. Een pad is een rij na elkaar aansluitende knopen via bogen, waarbij alle knopen verschillend zijn. Een cykel is een gesloten pad. Een graaf heet samenhangend als er tussen elke twee knopen een pad bestaat.
We merken hier op dat de terminologie in de grafentheorie niet standaard is, vandaar dat we de definities geven die wij zullen hanteren. Soms wordt dit type graaf ook een simpele onge-
Een gridgraaf is een voorbeeld van een graaf, die als volgt kan worden voorgesteld: de knopen worden op een raster geplaatst en de bogen verbinden horizontaal of verticaal twee aangrenzende knopen.
Deze gridgraaf is een voorbeeld van een samenhangende graaf, waarbij
0, 1, 4, 5, 8 een pad is van de knoop 0 naar de knoop 8. De gridgraaf bezit een aantal cykels waaronder 1, 4, 5, 2, 1. (figuur 1)




BOMEN EN OPSPANNENDE BOMEN
Een boom is een samenhangende graaf zonder cykels. Een bekende stelling over bomen zegt dat er in een boom tussen elke twee verschillende knopen altijd een uniek pad is. De omgekeerde stelling is ook geldig: elke graaf waarbij tussen elke twee verschillende knopen een uniek pad bestaat, is een boom. In een boom noemen we een knoop met slechts één boog een blad
Een opspannende boom van een graaf is een boom die bestaat uit bogen van de graaf en die alle knopen van de graaf bereikt. Elke samenhangende graaf bezit een opspannende boom. Die is echter niet uniek.
Bovenstaand voorbeeld van een gridgraaf is geen boom, het beschreven pad van 0 naar 8 is niet uniek en er bestaan cykels in de gridgraaf. We kunnen wel een opspannende boom vinden. (figuur 2)
Eén manier om een opspannende boom te vinden is het algoritme van Prim. Je vertrekt vanuit een willekeurige knoop en bouwt van daaruit een opspannende boom door telkens willekeurige buren toe te voegen, op zodanige wijze dat er geen cykels ontstaan. (figuur 3)
We werken het algoritme van Prim stapsgewijs uit op onze gridgraaf om zo een opspannende boom te vinden. In elke stap wordt het reeds gevonden deel van de boom getoond, de gekleurde bolletjes zijn de toegankelijke buren, in het rood wordt er telkens willekeurig een buur gekozen om toe te voegen in de volgende stap. (figuur 4)
Merk op dat dit een opspannende boom geeft voor onze gridgraaf, die verschillend is van de opspannende boom die we als eerder voorbeeld hebben gegeven. Dat toont dat opspannende bomen niet uniek zijn. (figuur 5)
Doolhoven
De opspannende boom van een grotere gridgraaf kan gezien worden als een doolhof. Je vertrekt vanuit een blad en zoekt de weg naar een ander blad door op de bogen te wandelen. Leerlingen kunnen volgende oefening maken.
Bepaal met het algoritme van Prim voor de gridgraaf hieronder een opspannende boom. Kleur hierna een willekeurig blad groen (begin) en een ander rood (einde). Laat een vriend het unieke pad zoeken tussen beide doorheen dat doolhof! (figuur 6)
Wanneer we dit algoritme toepassen op een nog grotere gridgraaf, krijgen we een ingewikkeld doolhof. Tussen elke twee knopen van deze doolhof is er een uniek pad (want het is een boom). Probeer zelf maar de weg te vinden tussen de twee aangeduide punten. Je kan ook de weg zoeken van linksboven naar rechtsonder, of nog van linksonder naar rechtsboven, of nog … (figuur 7)
HET PROGRAMMA IN PYTHON




Onderstaand doolhof is gemaakt met een eenvoudig Python-programma. Dat maakt gebruik van het setdatatype dat verzamelingen in Python implementeert. Met a={1,2,3} maak je een verzameling aan. De doorsnede tussen twee verzamelingen a en b wordt bepaald door a | b, de unie door a|b en het verschil door a-b. Het programma ziet er als volgt uit:




• Eerst laden we de modules random en graphics. Deze laatste is een kleine module om op eenvoudige wijze grafieken te maken. Je kan ze downloaden en in dezelfde map zetten als het programma. (J. M. Zelle, graphics.py, https:// mcsp.wartburg.edu/zelle/python/)
• De variabele bepaalt de grootte van een -gridgraaf. De knopen worden genummerd van tot zoals in het voorbeeld uit de eerste paragraaf en worden in de verzameling geplaatst. Daarna wordt een grafisch venster win met relatieve coördinaten linksonder en rechtsboven gemaakt.

• De gridgraaf wordt voorgesteld door een procedure die de buren van de knoop teruggeeft. Het resultaat bevat aanvankelijk de knopen (linker-, rechter-, onder- en boven- buur). Door de doorsnede te nemen met sluiten we boven- en onderburen uit van de bovenste resp. onderste rij knopen. Wanneer modulo nul is, en dus in de eerst kolom knopen zit, halen we de linkerbuur weg. Indien in de laatste kolom knopen zit ( modulo ), halen we de rechterbuur weg.
• Hierna volgen twee procedures om het tekenen te vereenvoudigen: plotv voor een knoop en plote voor een boog tussen twee knopen. De coördinaten van knoop zijn waarbij de gehele deling door is en de rest bij deling door . De eerste procedure tekent een cirkeltje met straal 0,3 rond het punt met deze coördinaten en kleurt het zwart. De tweede procedure trekt een lijntje tussen de twee opgegeven knopen.
• Het eigenlijke algoritme begint nu. Er wordt een willekeurig knoop gekozen en de voorlopige boom bestaat uit deze knoop. De toegankelijke buren van de boom bestaan uit nb(u). Verder tekenen we de gekozen knoop
• We starten nu een while-lus zolang er bereikbare buren van zijn. Telkens kiezen we willekeurig een toegankelijke buur uit en een hechtingspunt uit onze voorlopige boom.
• De boog wordt getekend en wordt met een unie toegevoegd aan . De buren van worden bij de toegankelijke buren gevoegd, maar knopen die reeds in zitten, worden afgetrokken.
• Wanneer de lus afgelopen is en dus alle knopen bereikt zijn, is een opspannende boom. We duiden nu de laatst toegevoegde knoop aan.
We krijgen zo een doolhof met aangeduid begin- (de eerst gekozen knoop) en eindpunt (de laatst toegevoegde knoop). Natuurlijk kunnen elke twee knopen gebruikt worden. Die doolhoven zijn relatief gemakkelijk op te lossen. Om moeilijkere doolhoven te maken kan je het algoritme ietwat aanpassen. Vervang de regel u=choice(list(B)) in de while-lus door
Nu wordt de voorkeur gegeven aan een buur van de laatst toegevoegde knoop. Dat zorgt voor langere gangen in de doolhof. Om het verschil te zien, laat je de computer voor een grote beide methoden gebruiken en kijk je op welke manier de doolhoven groeien.
LEGO

We kunnen dat toepassen om een doolhof van Lego te bouwen. Begin met een grid te maken op een basisplaat (32×32 of 48×48). Gebruik dan het algoritme om willekeurige verbindingen te maken (groen) en zorg dat je geen lussen hebt (rood mag niet). Versier ten slotte een aantal bladeren van de boom met een boot, huisjes, een toren … Vind dan de weg van het huis met zwart dak naar de toren of van de boot naar de boom. Met een dobbelsteen en een aantal Lego-pionnen maak je er een gezelschapsspel van! (figuur 8)



