Nützliche LISP-Referenzen

Nützliche Java-Referenzen

Blatt 4

Blatt 5

Aufgabe 3

Zum Berechnen des effektiven Verzweigungsfaktor kann natülich auf Hilfsmittel wie z.B. Wolfram Alpha zurückgegriffen werden.

Blatt 6

Aufgabe 1

  • Die Methode, die hier implementiert werden muss, benötigt so gut wie keine Objekt-orientierten Konstrukte und sollte daher auch für Java-Neulinge nicht zu schwer sein. Da aber wie bei vielen Programmiersprachen zu der Grammatik auch das Vokabular wichtig ist, hier ein paar Befehle, die hoffentlich hilfreich sind:
    System.out.println(String s)
    Gibt den String s auf der Konsole aus. String kann man mit + konkatenieren, z.B. gibt "x0 = " + x0 den String "x0 = " plus die zum String konvertierte Variabe x0 aus.
    Math.abs(double d)
    Gibt den Absolut-Wert von d zurück, entspricht bei numerischen Variablen also dem mathematischen Betrag. Diese Funktion gibt es auch für andere Variablentypen wie int oder float.
    Double.MIN_VALUE, Double.MAX_VALUE
    Diese Konstanten, entsprechen dem kleinstmöglichen bzw. größtmöglichen darstellbaren positiven Wert, den eine Variable vom Typ double annehmen kann.
    Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY
    Diese Konstanten, entsprechen dem negativen bzw. positiven Unendlichen, also ±∞; konstante Werte, die nicht als echte Zahlen interpretiert werden können, aber Variablen vom Typ double zugewiesen werden können.

    Java 7 SE API Dokumentation

  • Da Vector in Java eine Klasse ist, können wir nicht einfach Operatoren wie * oder + darauf anwenden. Hierfür gibt es aber implementierte Methoden. Bis auf die Norm (die wir leider vergessen hatten und im nächsten Punkt angegeben ist), sind alle benötigten Methoden schon vorgegeben. Beispielsweise schreibt man die Subtraktion zweier Vektoren x und y als x.minus(y), usw.

  • Die Norm in Aufgabe 1a) ist natürlich die euklidische Norm, also die Wurzel aus der Summe der Quadrate der Elemente. Obwohl wir eigentlich extra darauf geachtet hatten, dass wir diese Methode mitliefern, ging sie beim vorbereit trotzdem irgendwie verloren. Folgende Methode müsst ihr also noch in die Vector.java einfügen:
    
          /**
          * Return the euclidian norm for this vector, i.e., the "length" of the vector
          * calculated as the square root of the sum of the squares of all elements.
          */
          @Override
          public double normF() {
            return super.normF();
          }
        


  • Es kann passieren, dass der Gradient g, den man durch den Aufruf der Funktion func.gradient(x) erhält, nicht klein genug wird, um die Abbruchbedingung zu erfüllen, aber so klein ist, dass er multipliziert mit alpha keine Änderung mehr an x verursacht.
    Um dieses Problem zu umgehen, ändern Sie die Abbruchbedingung von ||g||2 < δ zu α||g||2 < δ, also brechen Sie ab, wenn der Gradient g(x) mal der letzten Schrittweite alpha zu klein wird.


Blatt 8

Aufgabe 1

  • Die Spielsituation von Drei Gewinnt ist natürlich entstanden, als zwei MinMax-Spieler das Drei Gewinnt aus Übungsblatt 7 gespielt haben. Die Utility-Funktion und die Reihenfolge, in der die möglichen Züge vom Spiel erzeugt werden, ist also dort bereits genau definiert.
    Wer es nicht glaubt, kann gerne die für Blatt 8 gegebene Musterlösung für den MinMax-Spieler auf dem entsprechenden Spielfeld gegen einen anderen MinMax-Spieler spielen lassen.
  • Wir haben beim ersten Mal die falsche VierGewinnt.java mitgegeben, was die Verwirrung erklärt. Der Unterschied liegt in der Utility-Funktion, die für diese Aufgabe natürlich nur +1 und -1 zurückgibt. Außerdem ist getInitialStateMedium() nun genau das Spielfeld, welches in Aufgabe 1 verwendet wird. Ignoriert also bitte die alte Version der Datei.


Blatt 12

  • Generell gilt (wenn nichts anderes gesagt wird) die Konvention: Großbuchstaben stehen für Konstanten, Kleinbuchstaben für Variablen.
    A ist also eine Konstante, während x eine Variable ist. Dementsprechend ist a auch eine Variable. Mehrere Buchstaben sind eigentlich auch immer Konstanten, z.B. Jerry, aber das fängt auch mit einem Großbuchstaben an, ist also eindeutig.

Aufgabe 4a(iv)

  • Bei dieser Aufgabe ist mir ein Übersetzungsfehler unterlaufen. Ich habe "substitute A for B" als "substitute A with B" übersetzt, was das genaue Gegenteil ist. Die Subsitution {x|y} ist also genau wie auf den Folien: x wird durch y ersetzt.
    Der erste Satz muss also richtig heißen: Ein häufiger Fehler von Studenten ist es, anzunehmen, dass es bei der Unifikation erlaubt ist, statt einer Variable eine Skolem-Konstante durch einen Term zu ersetzen