Zu Anfang jeder Simulation steht natürlich die Problembeschreibung. Für das Beispiel habe ich das Ziegenproblem ausgewählt, da es zum einen relativ leicht verständlich und zum anderen auch sehr leicht zu simulieren ist. Eigentlich wäre es zwar kein üblicher Kandidat für eine Simulation, aber die Prinzipien lassen sich daran sehr gut veranschaulichen.
Der Kern des Ziegenproblems ist der folgende: in einer Spielshow hat ein Kandidat die Wahl zwischen drei verschiedenen Toren. Hinter einem Tor befindet sich der eigentliche Preis, hinter den anderen beiden Toren jeweils eine Ziege (daher der Name des Problems) als Nicht-Preis. Der Kandidat wählt eines der Tore, woraufhin der Moderator des Spiels eines der anderen Tore öffnet, hinter dem sich eine Ziege befindet. Anschließend wird der Kandidat vor die Wahl gestellt: möchte er bei seinem gewählten Tor bleiben oder zum noch verschlossenen Tor wechseln. Die Frage ist: was ist die beste Strategie, um die Gewinnchancen zu maximieren? Sollte das Tor gewechselt werden oder eher nicht? (Das eigentliche Problem ist etwas komplexer als hier beschrieben, soll aber für die Simulation nicht weiter von Interesse sein; bei Interesse kann im entsprechenden Wikipedia-Artikel nachgelesen werden, und falls nach der Lektüre die Frage aufkommt: wir betrachten allein den Fall des ausgeglichenen Moderators).
Bildlich dargestellt also:
Die intuitive Antwort bei dieser Frage ist meist: es ist egal, ob man wechselt oder nicht. Zum Zeitpunkt der Frage sind noch 2 Tore geschlossen – hinter einem davon befindet sich eine Ziege, hinter dem anderen der Preis. Egal, welches Tor man wählt, man hat eine Chance von 50%, den Preis zu gewinnen. Richtig? Falsch. Es kann mathematisch gezeigt werden, dass es günstiger ist, das gewählte Tor in jedem Fall zu wechseln, da die Gewinnchancen damit auf 2/3, also etwa 66% steigen. Wer am mathematischen Beweis dafür interessiert ist, möge in der Wikipedia lesen – wir wollen dieses Problem hier aber per Simulation lösen.
Das Modell der Simulation ist denkbar einfach: der Zustand der Welt besteht aus den Informationen darüber, hinter welchem Tor sich der Preis befindet, welches Tor durch den Kandidaten initial gewählt wurde und theoretisch auch noch, welches Tor durch den Moderator geöffnet wurde (diese Information können wir sogar verwerfen – dazu gleich mehr). Die Regeln der Simulation sind ebenso einfach: haben wir durch unsere Wahl (Tor wechseln oder nicht wechseln) das Tor mit dem Preis erwischt, erhalten wir einen (imaginären) Punkt. Führen wir diesen Versuch n
mal aus und zählen dabei, wie oft der Wechsel des Tores (bzw. der Nicht-Wechsel) zum Erfolg geführt hat, erhalten wir damit eine Einschätzung der Gewinnchancen. Je öfter wir den Versuch wiederholen, desto genauer wird natürlich die Abschätzung. Mit diesen sehr einfachen Grundlagen können wir das Problem auch schon simulieren.
Da das Problem mit Hilfe von JavaScript und HTML simuliert werden soll, müssen vorher noch einige technische Details geklärt werden; so benötigen wir ein Eingabefeld für die Anzahl der Versuche und Ausgabefelder für die gemessenen Ergebnisse; zusätzlich noch einige Hilfsfunktionen. Der folgende Code baut diese Testumgebung auf; für die eigentliche Simulation ist er nicht erforderlich, soll hier aber der Vollständigkeit halber aufgeführt werden (wer sich nicht dafür interessiert, kann ihn also einfach überspringen):
<!–
function getRandom( min, max ) {
var r;
do {
r = Math.random();
} while( r == 1.0 );
return min + parseInt( r * ( max-min+1 ) );
}
function getTries() {
var tries = parseInt( document.form.tries.value, 10 );
if ( isNaN( tries ) ) {
alert(“Bitte eine Zahl eingeben.”);
document.form.tries.focus();
return 0;
}
return tries;
}
// Hier folgt gleich die eigentliche Funktion “run”.
//–>
</script>
<form name=”form” action=””>
<table border=”0″ cellpadding=”0″ cellspacing=”4″>
<tr>
<td align=”right”>Anzahl Versuche: </td>
<td><input name=”tries” type=”text” size=”12″
maxlength=”8″></td>
</tr>
<tr>
<td><input type=”button” value=”Simulieren”
onclick=”run()”></td>
</tr>
<tr>
<td align=”right”>Nicht wechseln:</td>
<td><input name=”stay” type=”text” size=”12″
maxlength=”12″ readonly></td>
</tr>
<tr>
<td align=”right”>Immer wechseln:</td>
<td><input name=”switch” type=”text” size=”12″
maxlength=”12″ readonly></td>
</tr>
</table>
</form>
Kommentare (22)