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 .
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?