Open Source im professionellen Einsatz
Linux-Magazin 11/2017
563

1000 Shows aufgezeichnet

Listing 1 zeichnet die Ergebnisse von 1000 Spielshows auf, indem es jeweils den Preis hinter eine zufällige Tür stellt, dann den Moderator eine Tür öffnen lässt, die weder bereits offen ist noch den Hauptpreis enthält, und gibt das Ergebnis im CSV-Format aus (Abbildung 2). Die Türen nummeriert es von 0 bis 2 durch und stellt pro Zeile den Index der folgenden Türen dar: Die vom Spielshow-Kandidaten ausgewählte Tür, die Tür, die der Moderator daraufhin öffnet, die verbleibende Tür sowie jene, hinter der sich der Preis befindet.

Listing 1

monty

01 #!/usr/bin/env python3
02 from random import shuffle, randrange
03
04 class Door(object):
05     def __init__(self,prize):
06         self.prize = prize
07
08 class Show(object):
09     def __init__(self):
10         self.picked    = None
11         self.revealed  = None
12         self.alternate = None
13
14           # hide prize behind random door
15         self.prizes = [1,0,0]
16         shuffle(self.prizes)
17
18         self.doors = []
19         for prize in self.prizes:
20             self.doors.append(Door(prize))
21
22     def pick(self):
23           # candidate picks a door
24         idx = randrange(0,len(self.doors))
25         self.picked = idx
26
27     def reveal(self):
28           # moderator reveals another door
29         for idx,door in \
30                 enumerate(self.doors):
31             if door.prize or \
32                     self.picked == idx:
33                 continue
34             if self.revealed is None:
35                 self.revealed = idx
36           # determine remaining door
37         for idx,door in \
38                 enumerate(self.doors):
39             if self.picked != idx and \
40                     self.revealed != idx:
41                 self.alternate = idx
42
43     def prize_idx (self):
44         for idx,door in \
45                 enumerate(self.doors):
46             if door.prize:
47                 return idx
48
49 print("picked,revealed,alternate,prize");
50
51 for i in range(1000):
52     show = Show()
53     show.pick()
54     show.reveal()
55
56     print("{0},{1},{2},{3}".format(
57         show.picked, show.revealed,
58         show.alternate,show.prize_idx()))

Stößt das neuronale Netzwerk zum Beispiel einmal auf die Kombination [1,2,0,0] wie in der ersten Zeile von Abbildung 2, weiß es, dass der Kandidat die zweite Tür ausgewählt hat (Index 1), der Moderator daraufhin die dritte geöffnet hat (Index 2), dass also die erste noch geschlossen ist (Index 0). Hinter der ersten Tür steht hier der Hauptpreis, sodass sich das neuronale Netzwerk für die erste Tür entscheiden sollte.

Abbildung 2: Ein Zufallsgenerator erzeugt Ausgänge von Spielshows und gibt sie im CSV-Format aus – für das spätere Trainieren des neuronalen Netzwerks.

Dabei definiert es zwei Klassen, »Door« für einzelne Türen und »Show« für alle drei Türen mit den Spielregeln der Fernsehsendung. »Door« -Objekte werden entweder mit oder ohne Hauptpreis initialisiert, Zeile 15 platziert den Preis hinter der ersten Tür und lässt dann Zeile 16 die Türen durchmischen, sodass der Preis zufällig irgendwo landet. Mit der Methode »pick()« ab Zeile 22 wählt der Kandidat mittels »randrange()« eine zufällige Tür, deren Index sich das Objekt in der Instanzvariablen »picked« merkt.

Moderator in der Bredouille

Der Moderator muss dann in »reveal()« ab Zeile 27 eine weitere Tür öffnen, darf aber nicht den Hauptgewinn preisgeben. Im Attribut »revealed« speichert das Objekt den Index dieser Tür. Bleibt noch die letzte Tür, deren Index die Methode im Attribut »alternate« ablegt. Ab Zeile 51 startet die »for« -Schleife mit 1000 Spielshows, für jede legt die »print()« -Anweisung ab Zeile 56 Eckdaten im CSV-Format ab. Dort stehen dann zeilenweise für jede Show die Indices der Kandidatentür, der Moderatortür, der verbleibenden Tür sowie der Tür zum Gewinn.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Snapshot

    2, 5, 7, 10, 12 – und welche Zahl kommt als nächste? Michael Schilli testet, ob sich von Psychologen erdachte Intelligenztests mit modernen KI-Automaten knacken lassen.

  • Tensorflow erreicht Version 1.0

    Tensorflow 1.0 verspricht Stabilität für sein Python API und beschleunigt die aktuelle und zukünftige Arbeit mit der Einführung des domain-spezifischen XLA Compilers.

  • Perl-Snapshot

    Zum Stöbern in vorbeirauschenden Paketen im lokalen Netzwerk leistet Platzhirsch Wireshark gute Dienste. Wer lieber eigene Tools baut, greift auf die Kommandozeilenversion Tshark zurück.

  • Verständnisfrage

    Als Prüfer Programmcode oder Multiple-Choice-Fragen elektronisch auszuwerten ist nicht allzu schwer. Doch das Korrektursystem zur Linux-Vorlesung an der Hochschule Heidelberg versteht nicht nur vorformulierte Textbausteine, sondern auch Freitextantworten.

  • Python asynchron

    Das Python-Modul Asyncio bringt neuen Schwung in vernetzte Anwendungen. Als Alternative zu Threads kann ein Entwickler es geschickt mit bestehenden Python-Bibliotheken kombinieren.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.