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

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.

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?