Ga naar hoofdinhoud

Speel tegen de geleerde strategie

De computer heeft geleerd welke zet bij elke stapel de beste is. Speelt hij nu ook echt goed? Nieuw is dat de geleerde strategie de plek van slim inneemt: beste_zet(score, stapel) geeft een aantal lucifers, net als slim(stapel).

info

Je gebruikt hier speel en willekeurig uit tegen het toeval.

Voorspel​

score = {(3, 1): -2, (3, 2): 5, (3, 3): -1}
stapel = 3
beste = 1
for pak in [1, 2, 3]:
if score[(stapel, pak)] > score[(stapel, beste)]:
beste = pak
stapel = stapel - beste
print(stapel)

Wat print dit programma? En wie moet daarna de laatste lucifer pakken?

Antwoord

1. De zet met de hoogste score bij 3 lucifers is pak 2, en dan blijft er 1 liggen. De ander moet die pakken, en verliest.

Zo werkt het​

beste_zet in de verborgen code doet wat de loop in Voorspel doet: hij zoekt bij een stapel de zet met de hoogste score, en geeft het aantal lucifers terug. Een zet die nog niet in score staat, telt daarbij als 0.

In speel uit tegen het toeval stond slim(stapel). Zet je daar beste_zet(score, stapel) neer, dan speelt de geleerde strategie. De score uit het leren blijft daarvoor bestaan.

Opdracht: speel tegen de geleerde strategie​

Laat de geleerde strategie 100 keer spelen tegen willekeurig, met 10 lucifers, waarbij de geleerde strategie begint. Hoe vaak wint hij?

Begin klein, en breid de code stap voor stap uit:

  1. Draai de code: hij leert, en print wat hij bij 10 lucifers pakt.
  2. Schrijf een functie speel(stapel) zoals in het vorige project, met beste_zet(score, stapel) in plaats van slim(stapel).
  3. Laat hem 100 keer spelen, en tel hoe vaak de geleerde strategie wint.

In de editor staan het leren en willekeurig.

pas op

Je speel heeft een while-loop. Wordt de stapel niet in elke beurt kleiner, dan stopt hij nooit en loopt het tabblad vast, net als bij een zet. Kopieer je code eerst naar een kladblok.

Python
Code-omgeving wordt voorbereid…
Tip

Laat score staan: daar zit in wat de computer leerde. Wint hij bijna nooit, kijk dan of speel de stapel na de zet van de geleerde strategie wel kleiner maakt: beste_zet geeft alleen het aantal lucifers terug.

Antwoord

Dit komt onder de code van de editor:

def speel(stapel):
beurt = "geleerd"
while stapel > 0:
if beurt == "geleerd":
stapel = stapel - beste_zet(score, stapel)
beurt = "willekeurig"
else:
stapel = stapel - willekeurig(stapel)
beurt = "geleerd"
return beurt

gewonnen = 0
for spel in range(100):
if speel(10) == "geleerd":
gewonnen = gewonnen + 1
print("geleerd wint", gewonnen, "van de 100") # geleerd wint 100 van de 100

Hij wint ze alle 100, net als slim. Bij 10 lucifers pakt hij 1, en daarna laat hij steeds een viervoud plus 1 over.

Door naar hoeveel spellen.