CoMa

Computerorientierte Mathematik

TU logo

Inhalt
.

Institut
 .  Vorlesungen
 .  .  CoMa
 .  .  .  ehemalige Zyklen
 .  .  .  .  CoMaI WS00/01
 .  .  .  .  .  Literatur
 .  .  .  .  .  Programmierregeln
 .  .  .  .  .  Mailarchiv
 .  .  .  .  .  Programm 5
 .  .  .  .  .  Programm 6
 .  .  .  .  .  Programm 7
 .  .  .  .  .  Programm 8
 .  .  .  .  . 0/1 Challenge

back zurück

Computerorientierte Mathematik I (WS00/01)
- 0/1 Challenge -


Übersicht

Achtung! Eine ausdruckbare Version dieser Seite findet ihr hier.

Hintergrund

In der Übung am 25.02.2001 wurde behauptet, dass Menschen nicht in der Lage sind, eine zufällige Folge von Nullen und Einsen zu erzeugen.
Um diese Behauptung zu untermauern wurde folgendes Experiment vorgeschlagen:

Mehrere Studenten der CoMa tippen jeweils eine Folge von 1000 Nullen und Einsen hintereinander ein und versuchen dabei, so zufällig wie möglich zu sein.
Vor dem Eintippen der nächsten Zahl erhält ein Algorithmus jeweils die bis dahin eingegebene Zahlenfolge und "errät" die nächste Zahl.

Vermutung: Mit einfachen Algorithmen können durchschnittlich 70% der Zahlen richtig vorhergesagt werden.

Bemerkung: Bei tatsächlich zufälligen Zahlenfolgen kann jeder Algorithmus durchschnittlich nur 50% der Zahlen vorhersagen.


Wettbewerb

Wir wollen den oben beschriebenen Versuch in Form eines kleinen Wettbewerbs durchführen, um die Erkenntnis zu gewinnen gibt, wie durschaubar Menschen sein können.
Damit das Experiment auch richtig fair abläuft, gibt es bei dem Wettbewerb zwei Kategorien:

  1. Wer entwickelt den besten Algorithmus zum Vorhersagen von Zahlen?

    Jeder von Euch kann einen Algorithmus in Java schreiben, der zu einer gegebenen 0/1-Folge die nächste Zahl vorhersagt. Dazu müßt ihr nur eine Klasse PredictVornameNachname schreiben, die das unten beschriebene Interface Predictor implementiert.

    Jeder Teilnehmer schickt bitte bis spätestens 14.02.2001 10.00 Uhr seiner Algorithmus in Form einer compilierfähigen Java-Datei (Name: PredictVornameNachname.java) an Andreas. Sollte Euer Algorithmus Hilfklassen benötigen, so implementiert diese bitte als private innere Klassen.

    Jeder Algorithmus wird auf allen dann eingetippten 0/1-Folgen getestet. Der Algorithmus mit der höchsten Trefferquote, berechnet auf allen teilnehmenden Folgen, gewinnt den Wettbewerb.

    Bitte habt Verständnis, dass wir aus Fairness-Gründen keinerlei Betreuung, weder per Email noch während der betreuten Rechnerzeiten, zu dieser Aufgabe bieten können.

  2. Wer kann die "zufälligste" 0/1-Folge eintippen?

    Jeder von Euch kann eine 0/1-Folge eintippen, von der er denkt, sie sei sehr zufällig. Diese Folge wird dann mit allen am Wettbewerb teilnehmenden Algorithmen getestet. Die 0/1-Folge, die gemittelt über alle Algorithmen die geringste Trefferquote verursacht hat, gewinnt den Wettbewerb.

    Damit es bei diesem Wettbewerb wirklich fair zu geht, werden wir hier keine per Email eingesendeten 0/1-Folgen zulassen. Stattdessen könnt ihr am 14.02. (evtl. auch früher) bei Andreas Eure Folge direkt am Rechner eingeben. Eingabe Schluß ist dabei jedenfalls am 14.02. um 17.00 Uhr.

Die Auswertung des Wettbewerbs erfolgt dann am 14.02. ab 18.00 Uhr während des CoMa-Umtrunks.

Herr Möhring hat für den besten Algorithmus einen Buchpreis gestiftet. Allerdings wollen wir den Preis nicht allein für den Algorithmus mit der höchsten Trefferquote vergeben, sondern in erster Linie für den besten Algorithmus, der unsere Programmierrichtlinien einhält und so effizient wie möglich programmiert ist.


Hilfsmittel

Alles, was ihr eigentlich braucht, ist das interface Predictor, das wie folgt aussieht:


/** A predictor can predict the next number of a 0/1-sequence */
public interface Predictor {
    /** Predicts the next number.
	An array of arbitrary length is given, of wich the first numbers are used.
	So the first numbers are 0 or 1. All later positions of the array are undefined.
	@param numbers An array of already known numbers.
	@param digits The number of used positions of the array. 
	@returns 0 or 1.
    */
    public int predictNext(int[] numbers, int digits);

    /** A short description.*/
    public String toString();
}
    
Euer Algorithmus muss dieses Interface implementieren.

Eure Hauptaufgabe besteht darin, die Methode predictNext zu implementieren, die die eigentliche Rate-Methode ist. Diese Methode erhält zwei Parameter:

  • int[] numbers: In diesem Array stehen die jeweils bisher bekannten Zahlen der Zahlenfolge.
    Achtung! Dieses Array ist zu lang und nicht bis zum letzten Element mit sinnvollen Zahlen gefüllt, sondern nur die ersten Stellen entsprechen der Folge.
  • int digits: Dieser Parameter gibt die Zahl der sinnvollen Einträge des Arrays an. Die bisherige Zahlenfolge besteht also nur aus den Werten numbers[0] bis numbers[digits-1]. Die übrigen Stellen von numbers enthalten keine sinnvollen Werte (sollten eigentlich mit 0 initialisiert sein).
Der Rückgabewert der Methode sollte 0 oder 1 sein.

Außerdem müßt ihr in der Methode toString einen kurzen (max. 8 Zeichen) String zurückgeben, der Euren Algorithmus eindeutig identifiziert, z.B. Anfangsbuchstabe des Vornamens + erste 7 Buchstaben des Nachnamens.

Eure Predictor-Klasse darf darüber hinaus weitere Methoden haben, die allerdings private sein sollten.
Falls ihr einen Konstruktor benötigt, so darf dieser keine Parameter erwarten.

Nun wollt ihr ja sicherlich Euren Algorithmus testen. Dazu findet ihr hier (Unix/Linux: .tar.gz, Win: .zip) eine kleine Anwendung, in die ihr nur noch Euren Algorthimus einbauen müßt. Dazu fügt ihr ihn einfach in der Methode startPrediction() bei folgenden Zeilen ein:

	/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	   Add your own algorithm here
	   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
	Predictor[] predictors = new Predictor[5];
	predictors[0] = new Predict0();
	predictors[1] = new Predict1();
	predictors[2] = new PredictAlter();
	predictors[3] = new PredictRandom();
	predictors[4] = new PredictOpposite();
    
Und schon wird er mit verwendet!

Damit ihr auch genug 0/1-Folgen zum testen habt, gibt es das Vezeichnis sequences, in dem ihr verschiedene mehr oder weniger zufällige Folgen findet (Referenzmenge):

  • human: Diese Folgen sind wirklich von verschiedenen Leuten eingegeben!
  • binary: Hier sind die binären Zahlen verschiedener Länge versteckt. Insbesondere bei den ersten Folgen sollte eine Trefferquote von über 95% erreichbar sein!
  • monoton und repeat: auch diese Folgen sind alles andere als zufällig!
  • rand und random: Diese Folgen wurden mit guten (Pseudo-)Zufallszahlengeneratoren erzeugt. Hier sind nur durchschnittliche Trefferquoten von 50% zu erwarten.
Ihr findet außerdem fünf kleine Rate-Algorithmen als Beispiele, wie man das Predictor-interface verwenden kann:

So, nun aber viel Spaß und viel Erfolg beim Zahlen-Raten!

top top
zuletzt bearbeitet: Tue Aug 7 2001, zuletzt erstellt: Wed Sep 29 2004
Andreas Fest <fest@math.tu-berlin.de>
Validate HTML