Spillteori med Python
**NB: Dette dokumentet blir brukt som utgangspunkt til felles oppgavel?sing i gruppetimen, og vil ogs? det vil ogs? bli gitt ut en video med "livekoding" av dette dokumentet etter gruppetimen.
Introduksjon
Denne uken er temaet Spillteori, og vi skal bruke Python til ? simulere og spille enkle spill. Spillteori er teorien om hvordan ulike akt?rer kan gj?re valg i et gitt spill, og er et ganske komplisert fagfelt som blant annet bruker matematikk for ? finne optimale strategier. Denne uken skal vi bare gi en ganske enkel introduksjon til hva spillteori er, og i stedet for ? bruke matematikk skal vi skrive enkle Python-programmer som skal hjelpe oss med ? utforske ulike strategier i ulike spill.
For spesielt interesserte, les gjerne mer om spillteori her.
Et eksempel med Python
I obligen denne uken skal man implementere spillet Fangens dilemma. For ? f? litt trening og en introduksjon f?r obligen skal vi i gruppetimen sammen implementere et annet enkelt spill i Python. Spillet vi skal implementere er troskapstesten i reality-serien Paradise Hotell.
Troskapstesten er et spill med to deltakere der m?let er ? komme unna med s? mye penger som mulig. De to deltakerne st?r med hver sin kule mens et pengebel?p gradvis ?ker fra 0 kr til 300 000 kr. N?r en av deltakerne slipper kulen avsluttes spillet og den deltakeren f?r pengebel?pet, mens den andre deltakeren f?r ingenting. Hvis ingen av deltakerne slipper kulen f?r bel?pet n?r 300 000, deler begge deltakerne bel?pet.
Representere en spiller ved hjelp av en funksjon
Vi gj?r noen forenklinger og antar at spillet foreg?r i 30 runder der bel?pet ?ker med 10 000 kr hver runde. I hver runde kan hver spiller bestemme om han/hun vil slippe kulen eller beholde kulen.
Hver spiller f?r alts? "input" om hva bel?pet er p? n?, og m? bestemme seg for om kulen skal beholdes eller slippes.
Dette kan vi enkelt modellere med en funksjon som returnerer True
hvis spilleren skal beholde kulen eller False
hvis spilleren skal slippe kulen:
def spiller_optimistisk(belop):
return True
Dette er et eksempel p? en spiller som aldri slipper kulen (og h?per at bel?pet skal komme til 300 000 kr uten at motspilleren har sluppet).
Oppgave: Implementer en funksjon spiller_halvveis
for en spiller som planlegger ? slippe kulen p? 150 000 kr.
Slippe kulen tilfeldig
Man kan se for seg at noen spillere ikke har noen klar plan, men kan impulsivt komme til ? slippe kulen p? et hvert tidspunkt. Hvis vi ?nsker ? implementere en slik spiller kan vi bruke tilfeldige tall for ? "simulere" valg som skjer tilfeldig.
I Python kan man trekke et tilfeldig tall mellom 1 og 100 slik:
from random import randint
tilfeldig_tall = randint(1, 100)
Man kan utf?re Python-kode med en viss sannsynlighet ved ? sjekke det tilfeldige tallet slik:
if tilfeldig_tall <= 30:
print("Det er 30% sjanse for at dette printes")
else:
print("Det er 70% sjanse for at dette printes")
Oppgave: Skriv en funksjon usikker_spiller
som tar bel?p som parameter og som representerer en spiller ved hver runde
- har 10% sannsynlighet for ? slippe kulen hvis bel?pet er under 150 000 kr
- har 30% sannsynlighet for ? slippe kulen hvis bel?pet er over eller lik 150 000 kr
Kj?re spillet med en for-l?kke
For ? finne ut hvilke strategier som er best i et spill kan det l?nne seg ? kj?re spillet. Hvis det er tilfeldige faktorer som kan avgj?re hvem som vinner et enkelt spill, m? man typisk kj?re spillet mange ganger og se p? gjennomsnittlig gevinst i hvert spill for ? kunne si noe om hvilken strategi som er best.
Vi vil f?rst skrive kode for ? kj?re spillet én gang, og deretter skrive kode for ? kj?re spillet mange ganger.
Skriv en funksjon spill
som ikke tar noen parametere, men som utf?rer et spill som best?r av 30 runder.
- Funksjonen skal returnere en liste som best?r av to tall, gevinstene til de to spillerne.
- For hver runde kaller du funksjonene
spiller_halvveis
ogusikker_spiller
for ? finne ut hva de gj?r den gitte runden - Hvis den ene spilleren slipper kulen og den andre ikke gj?r det, skal spillet avsluttes, og du kan returnere gevinstene til de to spillerne
- Ettersom vi har forenklet spillet til ? g? i runder (og ikke "real-time"),
kan det oppst? en situasjon der begge spillerne slipper kulen p? likt i samme runde.
- Hvis dette skjer skal du la det v?re 50/50 hvilken kule som treffer bakken f?rst. Dette kan du f? til ved ? trekke et tilfeldig tall mellom 0 og 1 og sjekke om tallet er 0.
- Hvis alle de 15 rundene er utf?rt uten at noen har sluppet kulen, skal bel?pet deles og funksjonen m? returnere
[150000, 150000]
Kall funksjonen noen ganger. Ettersom den ene spilleren har en tilfeldig faktor som avgj?r valget, vil resultatet variere litt.
Kj?r spillet mange ganger
Bruk en for-l?kke til ? kj?re spillet 100 ganger. Legg sammen gevinsten til de to spillerne. Hvem gj?r det best i det lange l?p?
Test gjerne andre strategier enn usikker_spiller
og spiller_halvveis
. Hvilken strategi tror du vil gi h?yest gevinst i det lange l?p?