Introductie tot Complexiteit,
huiswerkopdracht 1, optie vergevorderde.
Dit is een instructievideo waarin we door de huiswerkopdracht
voor de vergevorderde zullen lopen.
Open alstublieft het Netlogo model
gelabelled 'multiple_ants.nlogo', die te vinden is
in de 'course materials' sectie van de website.
Wanneer het opent, zou de interface er zo uit moeten zien.
We hebben in de eerste twee onderdelen van het huiswerk
een aantal wijzigingen doorgevoerd
en die hebben wij niet weggehaald.
Het eerste wat wij nu gaan doen,
is de mieren een ander kleurtje geven
zodat ze altijd rood blijven.
Ik ga nu deze regels met codes weghalen.
Dat zal het minder verwarrend maken.
Ga terug naar de Interface.
Het huiswerk vraagt ons een feromoonspoor te maken, die door de mieren
wordt achterlaten zodra ze eten hebben gevonden
en die dan door de andere mieren gevolgd kan worden.
En bij wijze van te test, om te zien of het sneller gaat dan de huidige methode
Dus laten wij dat gaan doen. Ga naar de code sectie.
Creëer eerst een 'patch' variabele en
noem dat 'feromoon'. Doe dat hier.
Scroll daarna naar de 'setup'
en je moet de 'patches' opzetten om niet alleen een nest te hebben,
om feromoon te hebben.
Dus ik ga dit 'setup nest' veranderen in 'setup patches',
we zullen 'patches' vragen om het 'feromoon' te initialiseren om 0 te zijn,
dus zet 'feromoon' op 0.
En laten we dat gaan controleren.
Nu willen wij dat de mieren een feromoonspoor achter zich laten
nadat zij het voedsel hebben gegeten en teruggaan naar het nest.
En dan willen wij dat andere mieren dit feromoonspoor gaan volgen.
Om dit te doen zal ik naar beneden scrollen,
naar onze 'return to nest' procedure, die we eerder hebben geschreven.
En we zullen een regel toevoegen om het feromoon gehalte
gelijk te maken aan 'patch',
dus laat het gehalte aan feromoon gelijk zijn
aan het huidige gehalte aan feromoon + 1.
Om te visualiseren hoeveel feromoon er op elke patch zit
ga ik de door de patch label, de p-label,
eenvoudig gelijk stellen aan de numerieke waarde van dit feromoon.
Je kunt altijd een andere kleur gebruiken als je wilt,
maar ik denk dat het interessant is om het label te gebruiken.
Dus laten wij dat controleren en zien of het werkt.
Zo te zien wel!
De mieren verzamelen eten en keren ermee terug naar het nest
en wanneer ze dat doen, leggen ze een spoor van feromoon neer
dat daarmee numeriek toeneemt.
Nu willen wij graag dat feromoon verdampt in de tijd.
Dus laten we teruggaan naar de code en dat nu gaan doen.
Dus laten we een nieuwe regel maken in de 'go' procedure.
We zullen het 'evaporate pheremone' noemen.
Laten wij nu dan die procedure beschrijven.
''to evaporate pheromone"
Wij willen graag dat het feromoon een waarschijnlijkheid heeft om te verdampen,
dat betekent een getal tussen de 0 en de 1.
Dus laten wij een tijdelijke variabele opstellen en die "x" noemen.
Dat zal een willekeurig decimaal getal tussen de 0 en de 1 zijn.
Dus ''random float 1'' aan.
En daarna ''ask patches' met [pheromone > 0],
dus voor elke patch dat feromoon heeft,
[if x < ] is dan de waarde waarover wij beslissen dat een 'slider' zal zijn,
die wij op de interface zullen zetten en we zullen die slider
''probability to evaporate'' noemen.
Daarna zetten we het feromoon op haar huidige waarde
en dat is [set pheromone -1], dus het feromoon zal geleidelijke verdampen.
En we willen dat ook zien, dus we zetten de ''p-label'' op de nieuwe waarde.
En we moeten die 'slider' -die ik noemde- ook toevoegen.
Om dat te doen, ga je naar de Interface, naar deze knop, kies ''Slider" en
we zullen het hier even neerzetten en we noemen het:
''probability to evaporate''.
En dat zal een waarde worden tussen 0 en 1.
''Increment'' met waarde ' .01'
En we zetten de initiële waarde op ' .1'
Daar ben ik trouwens een 'a' verloren, maar dat is OK.
Nu wil ik graag dat deze 'slider' bewegen zodat het onder de andere 'sliders' komt,
dus ga ik dit plotraam naar beneden verplaatsen
en het op dezelfde hoogte brengen als de 'wereld'
zodat het er allemaal mooi uitziet.
En deze 'slider' verplaatst ik hier naartoe.
En ik geef het dezelfde breedte als alle andere 'sliders'.
Dus, we zitten wellicht al goed.
Ik zal het controleren terug op de Interface.
Laten we het model nog een keer lopen.
En de feromoon gehalten zouden naar beneden moeten gaan
en het ziet er naar uit dat dit ook het geval is.
Dus dat is goed nieuws!
Het laatste probleem is nu om de andere mieren het feromoonspoor te laten volgen,
dus laten we dat nu doen.
Trouwens, een manier om verschillende schermen in de Interface te selecteren
is door met de cursor op een open plek te klikken
daarna te slepen over de knop of de 'slider'' of wat dan ook.
En je kunt er ook op 'klik' schrijven, nadat je een knop hebt geselecteerd
om het daarna op verschillende manieren te kunnen wijzigen.
Dus, laten we nu dan naar de code gaan en
we zullen de manier waarop de mieren zich gedragen in hun wereld veranderen.
We gaan naar '' to look for food'' en hier gaan wij een code aan toevoegen.
Dus we zullen een aantal nieuwe variabelen toevoegen
onder ''to look for food'', dus laat
''let pheromone ahead' zijn 'scent at angle'' met waarde 0.
en ik zal zometeen vertellen wat dit allemaal betekent
"let pheromone right'' zijn ''scent at angle'' met waarde 45.
"let pheromone left'' zijn ''scent at angle'' met waarde -45.
Deze code lijkt heel veel op de Ant.netlogo model
uit de modellen bibliotheek van Netlogo.
Dus we vragen eigenlijk elke mier om vooruit te kijken,
een beetje naar rechts en een beetje naar links,
om te bepalen of daar iets van feromoon is,
en om wanneer dat er is het feromoon te volgen
en wanneer dat niet zo is om willekeurig rond te lopen.
We laten deze code hetzelfde hier beneden.
Hierna gaan wij een aantal ''if else'' beweringen formuleren.
if else [pheromone right > pheromone ahead
or pheromone left > pheromone ahead]
[if else pheromone- right > pheromone-left]
dan gaan we rechts, 45 graden
en zo niet, dan gaan we links, 45 graden.
En wanneer geen van beide waar is,
wat betekent dat er of feromoon recht vooruit te vinden is,
of er is helemaal geen feromoon,
laten we dan zeggen [if pheromone- ahead = 0]
dan gaan we uit van de rest van wat hieronder staat....
laat ik hier een haakje zetten..... en hier nog een haakje om te sluiten.
Laten we dat controleren.
En het zegt ons dat er niets benoemd is als ''scent-at- angle'' en
dat is waar want we hebben nog geen ''scent-at- angle'' opgesteld.
Dus laten we naar beneden, naar het einde van de code scrollen
''to report'' scent-at-angle en daarna voegen wij de ''angle'' in.
''let p patch-right-and- ahead'' zijn.
En dit zijn 'Primitives' die in Netlogo zijn ingebouwd.
Als je ooit wil weten wat een 'Primitive' omhelst, dan kun je het highlighten
en met een rechtermuisklik naar Quickhelp gaan en dan
vind je daar een korte beschrijving van wat dat 'Primitive' inhoudt.
Dus, right-and-ahead en we gebruiken de 'angles''
die wij er al eerder in hadden gezet
en dan de distance- ahead die ik op 1 zet.
Wanneer p gelijk is aan niks, dus als er geen feromoon is
dan [[report = 0], anders
report [pheromone] van p
En dat zou het moeten zijn.
OK, laten we nu de code controleren...
Geen sluitend haakje voor dit open haakje..
Dus wij hebben een foutmelding.....
het ziet er naar uit dat ik dit sluitend haakje ben vergeten.
Ik zie nog meer haakjes die missen. Die voeg ik ook toe.
Nu controleren of alles in orde is. Terug naar de Interface.
En het ziet er naar uit dat dit gedrag behoorlijk goed is.
We kunnen dit een beetje meer analyseren om wat betere uitspraken te kunnen doen
over hoe dit precies werkt, maar dat laat ik aan jou over.
Hoewel, je ziet vast wel dat er veel mieren zijn
die eten verzamelen aan de randen van de 'wereld'.
Je kunt dit aanpassen door naar 'Settings' te gaan en te klikken op
'World Wraps Horizontally' en World Wraps Vertically'.
En nu ziet het er naar uit dat de mieren heel snel zijn
met het eten van het al het voedsel,
al na 73 ticks, terwijl we in het eerdere model,
voordat we het feromoon werd toegevoegd, grofweg 128 ticks hadden.
Dus, dit is het wat betreft huiswerkopdracht 1.
Ik hoop dat je genoten hebt van deze instructievideo.
En ik zie uit naar de volgende keer!