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).
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:
- Draai de code: hij leert, en print wat hij bij 10 lucifers pakt.
- Schrijf een functie
speel(stapel)zoals in het vorige project, metbeste_zet(score, stapel)in plaats vanslim(stapel). - Laat hem 100 keer spelen, en tel hoe vaak de geleerde strategie wint.
In de editor staan het leren en willekeurig.
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.
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.