Toepen with reasoning agents

Tijs Zwinkels and Jelle Prins

Menu

Home
Toepen applet
Uitleg van het spel
Agents
Experiment
Source code
De Agents:

Random Player: De Random Agent is de 'domste' speler die er bij zit. Deze speler bekijkt slechts welke kaarten hij mag spelen, en speelt hier een willekeurige kaart van. Doordat het toepspel nog een belangrijk kansaspect bezit, komt het nogsteeds regelmatig voor dat deze speler toch een rondje weet te winnen.

FeebleMind Player: Feeblemind bevat al wat meer intelligentie over de kaarten die hij speelt, maar lijkt nog steeds veel op de randomplayer. Het enige dat de 'FeebleMind' player doet, is het weggooien van zijn laagste kaart als hij geen kleur kan bekennen. Als de speler wel kleur kan bekennen, is hij identiek aan de 'Random Agent'.

Reasoning Player: De reasoning-player bevat een aantal handmatige geprogrammeerde heuristieken, die bedacht zijn op grond van eigen ervaring met het toepspel. Deze bevat de volgende regels:
- Als er geen kleur bekend kan worden, wordt de laagste kaart weggegooid.
- Als er kleur bekend kan worden, maar niet gewonnen kan worden, wordt de laagste kaart van die kleur weggegooid.
- Als er nog gewonnen kan worden met een van de kaarten, speel dan de laagste kaart waar nog mee gewonnen kan worden. (en hoop dat er niemand nog overheen gaat deze ronde)
- Als de kleur zelf bepaald mag worden, dan wordt de eerste 2 rondes de laagste kaart weggegooid (om de goede kaarten over te houden voor het eind). De laatste 2 rondes wordt de hoogste kaart opgegooid (om de kans om de ronden te winnen te maximaliseren). Deze speler presteert aanmerkelijk beter dan de 2 vorige spelers, en hij bleek tijdens het ontwikkelproces in staat om sommige aanmerkelijk geavanceerdere, maar niet getweakte, spelers te verslaan.

Greedy Player: De Greedy Player is een stuk geavanceerder. Hij probeert een aantal beslissingen te baseren op kansberekeningen. Om te begrijpen hoe deze speler tot zijn spel komt, zullen we eerst kijken welke berekeningen deze agent tot zijn beschikking heeft, en hoe hij tot deze berekeningen komt. De Greedy-player heeft de beschikking over 2 verschillende berekeningen. Ten eerste, voor kaarten die op het moment van spelen winnend zouden zijn (omdat hij de eerste speler in de ronde is, of omdat hij de kaart van een andere speler verslaat), kan hij berekenen wat de kans is dat zijn kaart nog verslagen gaat worden in deze ronde. Dit doet hij door van zijn kaart te berekenen welke kaarten zijn kaart zouden kunnen verslaan, en alle kaarten die al gespeeld zijn, of die hij zelf nog in zijn bezit heeft, er van af te trekken. Met deze gegevens, de hoeveelheid kaarten in het spel, en de hoeveelheid spelers die nog na hem komen deze ronde, berekend hij de kans dat zijn kaart 'gekraakt' wordt met behulp van de volgende formules: 

  • P(BeatPerCardLeftInGame) = possibleBeatCards / totalCards
  • cardsInHandPerPlayer = ((playerCount*4) - (((round-1)*playerCount) + playersleftinround)) / playerCount
    (oftewel: (Het aantal gedeelde kaarten - het aantal gespeelde kaarten) / het aantal spelers)
  • P(NOTBeatPerRemainingPlayer) = (((1-P(BeatPerCardLeftInGame))^cardsInHandPerPlayer)
  • P(BeatWinningCard) = 1-(NOTBeatPerRemainingPlayer^playersLeftInRound)

    Ten tweede, als hij op dit moment de beurt niet kan winnen, wil hij van elk van zijn kaarten de kans weten dat deze de volgende ronde de beurt 'terug' kunnen winnen. Eerst bekijkt hij welke kaarten zijn huidige kaart allemaal zou kunnen verslaan. Vervolgens worden uit deze lijst kaarten, net als de vorige keer, de kaarten die reeds gespeeld zijn of die hij zelf nog in zijn bezit heeft af gehaald. Vervolgens wordt voor elke kaart die verslagen kan worden de kans dat die verschijnt als winnende kaart voor onze speler berekend:

  • P(CardAppearsWithInitiative)=P(PerCard)*P(RightSuit)*P(NOTBeatWinningCard) 
  • P(PerCard)= 1 / totalcards
  • P(RightSuit) = 1/4
  • P(NOTBeatWinningCard) = 1-P(BeatWinningCard)

    Waarbij de berekening uit de vorige paragraaf toegepast wordt om de kans te berekenen dat de kaart waarmee we de ronde terug willen winnen alsnog overwonnen wordt door een volgende kaart in die ronde. Vervolgens worden de waarschijnlijkheden dat deze kaarten verschijnen als winnende kaart als we zelf aan de beurt zijn (en dus de kans dat we de ronde kunnen winnen) als volgt gecombineerd:
  • P(RegainInitiative) = 1-((1-P(Card1AppearsWithInitiative))*(1-P(Card2AppearsWithInitiative))*...*(1-P(CardNAppearsWithInitiative)))

    Waarbij dus de kansen dat een kaart niet verschijnt met elkaar vermenigvuldigd en daarna geïnverteerd worden, om op die manier de gezamenlijke kans te krijgen dat een van de kaarten waarvan we kunnen winnen wel verschijnt. De agent hanteert, met behulp van deze regels, de volgende strategie:
    - Als we geen kleur kunnen bekennen, gooi de kaart met de laagste kans dat we de beurt er mee terug kunnen winnen weg.
    - Als we wel kleur kunnen bekennen, maar niet kunnen winnen, gooi van de kaarten met de juiste kleur de kaart met de laagste kans dat we de beurt er mee terug kunnen winnen weg.
    - Als we de ronde kunnen winnen, maar we zitten in de eerste of 2e ronde, gooi dan een legale kaart met de laagste kans dat we de beurt er mee terug kunnen winnen weg.
    - Als we de ronde kunnen winnen, en we zitten in de 3e of 4e ronde, speel dan de kaart met de grootste kans dat hij niet verslagen wordt.
    Met deze berekeningen en deze regels blijkt dat deze agent het beste presteert van alle agents.