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?