De route van de muis
De muis kiest zelf en leert van elke stap. Wat heeft hij na een paar wandelingen geleerd? Nieuw is dat je de muis laat lopen zonder te leren en zonder te ontdekken, zodat je ziet welke route hij kent.
Voorspel
vakje = 2
pad = [vakje]
for actie in ["rechts", "links", "rechts", "rechts"]:
if actie == "rechts":
vakje = vakje + 1
else:
vakje = vakje - 1
pad.append(vakje)
print(pad)
Wat print dit programma?
Antwoord
[2, 3, 2, 3, 4]. pad begint met het startvakje, en na elke actie komt het
nieuwe vakje erachter.
Zo werkt het
In de verborgen code staat de hele klasse Muis uit
ontdekken,
met de gang erbij. Met piep.kies(vakje, 0) vraag je de muis zijn beste
actie, zonder dat hij ontdekt. Roep je daarna alleen stap aan, en niet
piep.leer, dan leert hij onderweg niets bij.
Zo speel je bij CS50 tegen de geleerde computer: hij kiest steeds zijn beste zet, en leert niet meer.
Bouw zelf: de route van de muis
Schrijf een functie route(muis) die de muis vanuit vakje 2 laat lopen met
zijn beste actie, zonder te leren, en de lijst van vakjes teruggeeft. Print de
route na 0, 1, 2, 5 en 10 wandelingen:
0 wandelingen: [2, 1, 0]
1 wandelingen: [2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3]
2 wandelingen: [2, 3, 4]
5 wandelingen: [2, 3, 4]
10 wandelingen: [2, 3, 4]
Begin klein, en breid de code stap voor stap uit:
- Draai de code: de muis leert van 5 wandelingen, en zegt welke kant hij in vakje 2 kiest.
- Laat
piepvanuit vakje 2 lopen totklaar(vakje), metpiep.kies(vakje, 0)enstap. Print na elke stap het vakje. - Maak er een functie
route(muis)van die de lijst van vakjes teruggeeft, zoalspadin Voorspel. Stop ook als de lijst 20 vakjes lang is. - Print de route na 0, 1, 2, 5 en 10 wandelingen, elke keer met
random.seed(1)en een nieuwe muis.
Je schrijft hier een while-loop, en een muis kan heen en weer blijven lopen: na één wandeling doet deze muis dat. Zonder de grens van 20 vakjes stopt de loop dan nooit, en loopt het tabblad vast. Kopieer je code eerst naar een kladblok.
Tip
stap geeft twee dingen terug, het nieuwe vakje en de beloning. Voor de
route heb je alleen het vakje nodig, maar je haalt ze allebei uit elkaar.
Antwoord
Dit vervangt alles in de editor. De gang en de muis blijven in de verborgen code.
import random
def route(muis):
vakje = 2
pad = [vakje]
while not klaar(vakje) and len(pad) < 20:
actie = muis.kies(vakje, 0)
vakje, beloning = stap(vakje, actie)
pad.append(vakje)
return pad
for wandelingen in [0, 1, 2, 5, 10]:
random.seed(1)
piep = Muis()
for keer in range(wandelingen):
wandel(piep, 0.2)
print(wandelingen, "wandelingen:", route(piep))
0 wandelingen: [2, 1, 0]
1 wandelingen: [2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3]
2 wandelingen: [2, 3, 4]
5 wandelingen: [2, 3, 4]
10 wandelingen: [2, 3, 4]
Een nieuwe muis kent niets, kiest links en loopt in de val. Na één wandeling weet hij dat links in vakje 2 slecht afliep, en gaat hij naar rechts. Maar in vakje 3 was hij nog nooit: links en rechts zijn daar allebei 0, en dan kiest hij links. Zo loopt hij heen en weer. Na twee wandelingen kent hij de kortste weg naar de kaas.
Door naar aan de slag met Nim.