Dag 5

Op dag 5 is het de bedoeling om de laatste aspecten van onze simulatie te controleren en wellicht te verbeteren waar dat nodig is. Een voorbeeld van een verbeter punt is het ijken van parameters, zodat de simulatie zo realistisch mogelijk wordt.

Docent Visser komt deze dag langs om een demonstratie te aanschouwen van deze simulatie. Voordat de docent komt moet er dus eerst goed getest worden. We beschouwen 3 situaties die wij van plan zijn te demonstreren:

  1. Situatie met standaard parameters
  2. Situatie meet veel mensen en weinig zombies
  3. Situaties met veel zombies en weinig mensen

Elk situatie geeft geen probleem bij het testen. De resultaten van de situaties worden besproken in de resultaten. Er zijn parameters die niet door de gebruiker aan te passen zijn, maar we gaan er van uit dat deze goed zijn ingesteld.

Er was het idee aan het begin om ook zee aan te maken in deze wereld. Na overleg hebben we besloten om geen zee te maken. Argument hiervoor is dat dit geen toegevoegde waarde zal zijn voor de simulatie en hierdoor schrappen wij de eis om zee te maken.

De simulator creëert dus nu een wereld waarin zombies en mensen leven. Zombies kunnen mensen infecteren en deze zombies zoeken deze mensen ook op. Hierdoor is er intelligentie geïmplementeerd bij de zombie. De mensen daarentegen hebben overlevingsstrategieën. Deze probeert namelijk de zombie te ontwijken en andere mensen te zoeken om een sterke groep te vormen. Deze groep kan dan een zombie doden waardoor de simulatie heel realistisch is. Mensen hebben in een groep betere overlevingskansen dan alleen. Hoewel de intelligentie voor beide partijen simpel van aard is, blijkt het wel effectief.

Er hoeft dus niets meer aan de code veranderd worden. Alleen de volgende opdrachten moeten nog gedaan worden voor vandaag:

  • Code netjes maken en van comments voorzien
  • Website met labboek afronden
  • Programma van eisen bijwerken naar aanleiding van de resultaten

Nu deze opdrachten zijn voltooid is het project afgerond. De resultaten en discussie zijn opgesteld en kunnen gevonden worden op deze website.


Programma van eisen

Wereld Voldaan?
Wereld bevat mensen Ja
Wereld bevat zombies Ja
Wereld bevat land Ja
Wereld bevat zee Nee
Eigenschappen Zombie
Moet kunnen bewegen Ja
Moet mensen kunnen infecteren Ja
Moet kunnen doodgaan Ja
Moet een sensor range hebben Ja
Heeft een beperkt zicht Ja
Eigenschappen Mens
Moet kunnen bewegen Ja
Moet een zombie kunnen worden Ja
Moet slimmer zijn dan zombie Ja
Moet een directie hebben Ja
Eigenschappen land
Mens en zombie kunnen over land Ja
Eigenschappen Zee
Mens en zombie kunnen niet over zee Nee
Collision
Groepen hebben andere acties dan individuen Ja
Extra
Interface waarin parameters kunnen worden veranderd Ja

Dag 4

Op dag 3 is het gelukt om alle objecten te laten bewegen. Ook kan de zombie nu een mens infecteren. Hierdoor verandert de mens in een zombie. Daarnaast is het gelukt om intelligentie te implementeren bij de mens en zombie. Zo zoekt de mens medemensen om te overleven en probeert hij zombies te ontwijken. De zombie daarentegen zoekt de mens en kan deze volgen.

Voor vandaag hebben wij de volgende doelstellingen bepaald:

  • Een betere infectie methode creëren
  • Een methode implementeren waardoor grotere groepen mensen winnen van een aanvallende zombie. (Dit kan wellicht al opgelost worden met de implementatie van de eerste doelstelling.)
  • Meer intelligentie te implementeren in de mens en de zombie

Om een betere infectie methode te creëren hebben we het volgende principe bedacht. Als er twee objecten naast elkaar staan dan moeten deze kijken hoeveel van zijn soort om zich heen staan. Dus beschouw het volgende voorbeeld: stel als er 1 zombie tegenover 1 mens staat dan wint de zombie. Stel er is 1 zombie tegenover 1 mens, maar er staan 3 andere mensen om de ene mens heen dan wint de mens en verdwijnt de zombie van de wereld. Het tegenovergestelde principe geldt dus ook: stel 1 zombie tegen 1 mens maar er staan nog 3 zombies om de ene zombie heen dan wint de zombie. Dit principe hebben wij geïmplementeerd in onze code. Hierdoor ontstaat er een infectie methode die er ook voor zorgt dat groepen bijeengekomen mensen de zombie kunnen doden.

Nu de infectie methode goed is proberen we meer intelligentie te implementeren in zowel de mens als de zombie. Door het meermaals testen van de simulatie zijn we erachter gekomen dat mensen door het zoeken naar andere mensen en hierdoor groepen vormen veel sterker en slimmer zijn dan de zombie. Een eindsituatie die zich vaak voordoet bij het simuleren is het volgende:

Eindsituatie met vaststaande groepen mensen

Hier zien we dus dat er clusters mensen ontstaan die altijd winnen van de zombie. De mens ontwijkt immers ook de zombie en de zombie heeft nog niet de intelligentie om samen een cluster van mensen te infecteren. Wij proberen dus eerst de zombie slimmer te maken om tegenstand te bieden aan de mens.

Het probleem is dus als de mensen eenmaal een cluster heeft gevormd dat deze niet meer te verslaan is ook als is deze zeer klein. Dit komt omdat het zeer onwaarschijnlijk is dat de zombies met een meerderen om één cluster gaan staan. De intelligentie die wij willen implementeren bij de zombie is dat deze wel de intelligentie moet hebben om samen zo’n cluster mensen aan te vallen.

Ons inspiratie voor een oplossing voor dit probleem hebben wij genomen uit een doorsnee zombiefilm. Als één zombie eenmaal een mens heeft gezien gaan alle andere zombies achter deze zombie aan. Dit verschijnsel wordt ook wel swarming(“zwermen”) genoemd. Dit proberen wij te implementeren in de code. Dit hebben wij als volgt gedaan. Als een zombie een mens ziet dan wordt deze grijs, andere zombies in de buurt zien dat en volgen dan deze grijze zombie. Aangezien er al is geïmplementeerd dat de zombie deze mens volgt ontstaat er een zwerm van zombies die dan naar de gevolgde mens gaan. Hierdoor wordt de kans groter dat er meer zombies om één cluster mensen gaan staan en hierdoor wint, doordat de aantallen zombies in de radius groter is dan het aantal mensen. Zie hieronder een voorbeeld van een zwerm zombies die ontstaat.

Zwerm zombies

Het idee om het obstakel zee erbij te implementeren is voor ons nu geen prioriteit meer. Wellicht laten wij dit idee dan ook los. Wij willen ons meer bezig om de intelligentie van beide groepen te verbeteren. Hier zullen wij ons op de laatste dag vooral nog op richten.

Dag 3

Op dag 2 is het gelukt om de zombie te laten bewegen. Voor dag 3 hebben wij de volgende doelstellingen gemaakt:

  • De mens laten bewegen
  • Zombie moet mensen kunnen infecteren. Deze mensen veranderen dan in zombies
  • Intelligentie toevoegen aan mens en zombie

In eerste instantie was het de bedoeling om de mens alleen vooruit te laten bewegen. Een probleem wat we ondervonden met deze benadering is dat de mens dan altijd naar de rand van de wereld gaat en deze rand dan volgt. Hierdoor ontstaat er een opeenstapeling rechts beneden in de wereld aangezien dit gebied als laatste wordt geüpdatet.

Opeenstapeling van objecten rechstonderin van het scherm

Uiteindelijk hebben wij besloten om de mens willekeurig te laten bewegen in een richting om zo verdere problemen te voorkomen. De eerste doelstelling voor deze dag is daarmee behaald. Daarnaast hebben we het update systeem van de wereld aangepast. De update functie werkt nu door de eerste keer links boven te beginnen met updaten en de volgende keer rechts beneden te beginnen, dit voorkomt het probleem van de ophoping van mensen of zombies in een hoek. De eerste doelstelling voor deze dag is hiermee behaald.

De implementatie van het kunnen infecteren van een mens door een zombie werkt door wanneer er een zombie op het vakje van de mens komt te staan, deze ook veranderd in een zombie vakje. Dit systeem werkt echter nog niet optimaal want een zombie is alleen nog in staat op een mensen vakje te gaan staan wanneer de betrefende mens is ingesloten door andere mensen. We zoeken dus nog naar een betere soort manier om de infectie methode te implementeren. Dit zullen we de volgende dag worden gaan proberen.

Wat vandaag ook toegevoegd is, is de Menu.java class in de datastructuur. Hierin wordt de interface aangemaakt waarme de gebruiker zelf de parameters kan veranderen.

Nu het mogelijk is dat zombies mensen kunnen infecteren willen wij een strategie bedenken voor de mensen om toch iets tegen de zombie te kunnen doen. Anders wint de zombie immers altijd en dit is niet realistisch. De bedoeling is dus om de mens slimmer te maken. Een realistische strategie daarvoor is om andere mensen te zoeken en samen een sterkere groep te vormen welke wel een zombie kan verslaan. We zijn dus van plan om een algoritme te creëren voor een mens zodat het andere mensen zoekt in de omgeving.Een tweede andere strategie om mensen slimmer te maken is om mensen weg te laten lopen van een zombie wanneer deze in de buurt is.

De eerste strategie is dat mensen zoeken naar andere mensen om zo een sterke groep te vormen. Het basis principe is dat als een mens een ander mens tegenkomt dat hij dan kijkt of er nog meer mensen zijn in de buurt. Als dit aantal van omringende mensen groter is dan de door ons ingestelde parameter dan stopt deze groep met bewegen en wacht de groep op andere mensen. De volgende stap die wij willen implementeren is dat als een zombie een grote groep tegenkomt dat deze zombie dan doodgaat. Dit zullen wij morgen proberen te implementeren.

De tweede strategie voor de mensen is de strategie om te vluchten. Hiervoor moet er dus een functie geschreven worden waar de mens mee kan weten wanneer er een zombie in de buurt is. Deze functie noemen we objectSpotted, deze functie wordt ook gebruikt om andere mensen waar te nemen. Als het object dat wordt gespot gelijk staat aan een zombie dan moet een mens deze ontwijken door een andere richting op te gaan. Deze implementatie is gelukt en hiermee is er een strategie ontwikkelt zodat mensen kunnen vluchten.

Om voor de zombie een intelligentie te creëren willen we dat de zombie altijd het pad van een mens probeert te volgen als deze dichtbij is. Het principe is dat een zombie op een bepaalde range van zichzelf zoekt naar mensen. Dit wordt gedaan door relatief van zichzelf een tile grid af te zoeken. Vervolgens wordt de dichtstbijzijnde tile bepaald, waarna hieruit de beste richting voor een move wordt afgeleid.

De doelstellingen voor dag 3 zijn min of meer behaald. Een van de verbeterpunten is de infecteer methode, hier willen we een andere methode voor vinden. Ook willen we implementeren dat een groep mensen een zombie kan doden. Dit hopen we de volgende dagen te kunnen bewerkstelligen.

Dag 2

Op dag 1 is de basis voor de gesimuleerde zombie wereld gedefinieerd. Hierin zijn al de objecten geplaatst in de wereld. De objecten (“Tiles”) kunnen echter nog niet bewegen. Vandaag willen we dit werkend krijgen. Het bewegen van de mensen en zombies willen wordt gedaan in de main class (World.java) door de update functie.

De werking van de update functie is als volgt. Zoals gezien in het labboek van dag 1 hebben zijn er verschillende klassen aangemaakt. In de klasse world.java gaat het programma elke tile langs, van links boven tot aan rechts beneden. Bij het langsgaan van de wereld wordt er bij elke tile een update uitgevoerd. Dit wordt gedaan in een tijdelijke grid. Pas zodra alle tiles geupdatet zijn wordt de hele wereld grafisch opnieuw gerenderd.

Een probleem waar wij tegen aanliepen is dat de tiles aan het begin van de grid altijd voorrang hebben op de tiles aan het einde van de grid. Dit komt doordat bij een update altijd links boven wordt begonnen met updaten. Door het gebruiken maken van een temporary grid verhelpen we dit probleem enigszins. Dit is volgens ons het meest eerlijke update systeem dat wij konden creëren.

Nu elk tile kan worden geüpdatet, moet bepaald worden hoe de tiles precies moeten worden geupdate. De specifieke update functie is afhankelijk van de variabele of de tile een mens, zombie, land of zee is. Een mens en zombie moeten immers kunnen bewegen. Maar wanneer een tile land of zee is moet deze niet verplaatst worden. De mens en zombie wordt naast een locatie ook een oriëntatie meegeven. Dit is gedaan zodat we ook kunnen implementeren of een mens een zombie ziet en/of andersom.

De implementatie voor de beweging van de zombie is vandaag gelukt. De zombie beweegt nu random, maar we willen graag ook intelligentie meegeven aan de zombie door middel van sensory range. Dit gaan we de volgende dagen uit proberen te voeren.

Dag 1

Op dag 1 was het voornaamste doel om een geschikt onderwerp voor het project te vinden. Geïnspireerd door het spel Game of Life kwamen we op het idee om een simulator te maken van een situatie in een gesloten wereld. Verschillende ideeën passeerden de revue. Uiteindelijk hadden we vijf hoofdonderwerpen: dieren, planten, genen, bestuursvormen en ziektes. Ieder mocht 6 stemmen verdelen over de onderwerpen en uiteindelijk kreeg de simulatie over ziekte verspreiding de meeste stemmen. Mede doordat het een actueel onderwerp is met betrekking tot het MERS virus dat onlangs is uitgebroken in Zuid-Korea.

Gezien het thema van het het vak waar dit onderzoek bij hoort, is het van belang dat robotica in de simulatie betrokken wordt. Dit wordt gedaan door de ziekte een sensor range te geven. Aangezien de meeste normale ziekten niet zo'n eigenschap bezitten werd er voor gekozen een zombie uitbraak te simuleren. Hierin kunnen zowel mensen als zombies een bepaalde range bezitten. Daarnaast willen we proberen om de mensen een soort intelligentie mee te geven waarome bepaalde strategieën uitgevoerd kunnen worden waarmee er aan gevaarlijke zombies ontkomen kan worden.

Voordat wij beginnen met het opbouwen van een datastructuur hebben we een voorwaardelijke lijst gemaakt waar ons simulatie aan moet voldoen, deze zijn opgesteld in het programma van eisen. Hierna zijn we verder begonnen met opstellen van de data structuur van het te programmeren programma welke in Java zal worden geschreven. Het idee is dat we een wereld die bestaat uit tegels (“Tiles”) in een rooster. Elk tile moet een mens, zombie, water of land voorstellen. Het basis principe is dat wanneer een zombie in contact komt met de mens dat deze geïnfecteerd raakt en dus ook een zombie wordt.

Door telkens elke zombie en mens te laten bewegen creëren wij dus simulatie. Bij elke beweging moet de mens en de zombie een bepaald doel hebben. Een mogelijk doel van de zombie zou bijvoorbeeld kunnen zijn om een mens te volgen zodra deze in de buurt is. Deze zombie heeft dus een soort sensor voor mensen.

Nu het basis idee is uitgewerkt hebben wij als doel gesteld om vandaag de wereld met de tiles erin te maken. Uiteindelijk is het gelukt om een wereld te creëren met mensen en zombies erin. De structuur voor deze wereld is hieronder gegeven.

Ons programma is tot nu toe opgebouwd in 5 classes: World, Zombiesimulator, Tile, Human en Zombie.

In zombie simulator world het programma opgestart, hier world de class world.java aangeroepen om een nieuwe wereld te maken.

In de world wordt de gesimuleerde wereld opgebouwd. Alle tiles wordt geplaatst en ook wordt er aan elke tile een object, human of zombie meegeven. Voor het grafisch opbouwen van de wereld gebruiken we de Java package swing.

In de tile class definiëren we wat een tile is en ook of het een human of zombie moet worden. Daarnaast zal hierin aangegen worden of een tile zee of land is. Om te bepalen hoeveel zombies en hoeveel mensen in de wereld moeten komen gebruiken we parameters die uiteindelijk de gebruiker zelf kan aanpassen. Het verschil in human, zombie, zee of land is de kleur van de tile. Dit wordt ook hier in de class tile bepaald.

Voor de class human en zombie extenden wij de class tile. Hierdoor kunnen wij aanpassingen maken aan de tile die gemaakt wordt.

We kunnen dus zeggen dat voor dag 1 ons doel behaald is. Het onderwerp voor het project is bepaald en de basis voor de gesimuleerde wereld is opgezet.


Programma van eisen

Aan de hand van het programma van eisen wordt het resultaat controleerbaar gemaakt.

Wereld Voldaan?
Wereld bevat mensen
Wereld bevat zombies
Wereld bevat land
Wereld bevat zee
Eigenschappen Zombie
Moet kunnen bewegen
Moet mensen kunnen infecteren
Moet kunnen doodgaan
Moet een sensor range hebben
Heeft een beperkt zicht
Eigenschappen Mens
Moet kunnen bewegen
Moet een zombie kunnen worden
Moet slimmer zijn dan zombie
Moet een directie hebben
Eigenschappen land
Mens en zombie kunnen over land
Eigenschappen Zee
Mens en zombie kunnen niet over zee
Collision
Groepen hebben andere acties dan individuen
Extra
Interface waarin parameters kunnen worden veranderd