|
In letzter Zeit kamen ein paar E-Mails mit Fragen, die wir dann direkt beantwortet haben. Damit sich niemand benachteiligt fühlt, habe ich die Antworten nochmal für alle hierhin kopiert:
> Zunächst einmal, was liefert sense(here, foehome), wenn es sich um ein
> Feld eines Ameisenhügels handelt, der zwar auf dem Spielbrett
> vorhanden ist, der aber keinem Spieler gehört (es ist schließlich
> möglich, dass ein Client nicht die Maximalzahl an Stämmen spielen
> lassen will)?
Das ist eine gute Frage. Sie betrifft aber wohl eher die Spezifikation
der Funktion newMatch im Server. Wenn dort weniger Ameisenstämme
übergeben werden als Hügel zur Verfügung stehen, dann hat der Server
zwei Möglichkeiten: Er könnte die überflüssigen Hügel entfernen oder er
könnte sie als die Ameisenhügel von Ameisenstämmen mit jeweils 0 Ameisen
auffassen. Im ersten Fall müsste sense(here, foehome) false zurückgeben
und im zweiten Fall true.
Da es gute Argumente für beide Möglichkeiten gibt und die Spezifikation
beide Möglichkeiten erlaubt, könnt ihr selbst die Möglichkeit wählen,
die euch am geeignetsten erscheint.
> Wie ist die Bedingung mit den zwölf Variablen gemeint - dürfen zur
> Laufzeit zu jedem Zeitpunkt höchstens 12 Variablen gesetzt sein ("die
> Ameise kann sich nicht mehr als das gleichzeitig merken") oder darf
> der Lexer nur 12 verschiedene Identifier-Strings finden? Ich vermute
> letzteres (sonst könnten potentiell ungültige Programme an den Start
> gelassen werden bzw es wäre sehr schwer, von einem Programm zu testen,
> ob es in jedem Fall gültig ist), richtig?
Richtig, man schaut sich den Syntaxbaum eines Programms an und prüft,
dass darin nicht mehr als 12 verschiedene Variablennamen vorkommen.
> Im Teil 3 der Spezifikation gibt es auf Seite 18, 5.1.2
> Schrittfunktion im Fall E=Empty in der Auswertung der step-Funktion
> einen Druckfehler, es sollte wohl entweder (skip, (ro, E)) oder (skip,
> (leer, E)) statt (skip, E) heißen; natürlich ist klar, was praktisch
> gesehen passieren soll, es wäre höchstens interessant, wie der Fall
> formal behandelt wird
Stimmt, das war ein Tippfehler. Er ist jetzt korrigiert.
> (nur aus Interesse, wenn der Fall spezifiziert wäre und eine der
> beiden Varianten angegeben wäre, müsste die Variante dann umgesetzt
> werden, um die formale Spezifikation zu erfüllen, oder könnten wir es
> uns trotzdem aussuchen, weil es keinen Unterschied macht?)
Im Prinzip könnt ihr AntBrain implementieren wie ihr wollt, solange sich
die Ameisen wie spezifiziert verhalten ;-). Um es euch einfacher zu
machen, haben wir das Verhalten der Ameisen mit der Funktion step
definiert, die man einfach direkt in Java implementieren kann. Das
heißt, die Funktion step ist gleichzeitig Spezifikation und
Implementierungsvorschlag. Wir verlangen jedoch nicht, dass ihr AntBrain
genau so implementiert, sondern nur dass sich die Ameisen gemäß der
Spezifikation verhalten.
> Für unsere Optimierungsarbeiten würden wir gerne wissen, ob es Obergrenzen
> für die Anzahl an Stämmen und die Anzahl der Ameisen pro Stamm gibt. Für
> eine Optimierung müssen wir auch den worst case berücksichtigen und haben
> vorerst für uns Obergrenzen von x Stämmen á y Ameisen (Radius z)
> angesetzt.
>
> Dies erscheint uns aber bereits sehr großzügig, so dass wir uns hier nach
> einer möglichen Vorgabe erkundigen wollten.
An konkrete Obergrenzen hatten wir jetzt nicht gedacht. Es ist aber
natürlich klar, dass mit begrenztem Speicherplatz und begrenzter
Prozessorgeschwindigkeit bestimmte obere Grenzen an die Anzahl der
Stämme, die Anzahl der möglichen Runden oder die Anzahl der Spiele, die
ein Server handhaben kann, geben muss. Und es ist natürlich auch
legitim, die verschiedenen Grenzen gegeneinander abzuwägen, also zum
Beispiel zu fragen, ob man lieber eine große Anzahl von Stämmen oder
viele Spielrunden haben will (wenn man nicht beides haben kann).
Wenn ihr also sagt, dass ihr mit einer Beschränkung an die Anzahl der
Stämme und Ameisen insgesamt besser seid, dann ist es schon in Ordnung
eine Einschränkung zu machen. Eine Einschränkung sollte aber
trotzdem gut begründet sein. Es gibt schließlich mehr als genug
Beispiele, in denen sich Einschränkungen im Nachhinein als hinderlich
herausgestellt haben (640K Speicher, IPv4-Adressen, ...)
> Können Ameisen feindliche Hügel überhaupt betreten? Ich bin bisher
> davon ausgegangen, dass sie es können
Ja, das können sie. Das geht zur Abwechslung auch mal aus der
Spezifikation hervor. In Teil 1, Abschnitt 4.3 steht, dass eine Ameise
mit der Aktion walk in die vor ihr liegende Zelle geht, es sei denn
diese ist ein Hindernis oder dort steht schon eine Ameise. Auch wenn die
Zelle vor ihr zu einem gegnerischen Bau gehört, wird sich die Ameise
also dorthin bewegen.
> Evtl sollte noch spezifiziert werden, was (beim Interpreter) bei der
> Auswertung von arithmetischen Ausdrücken passiert, wenn es sich um
> "a/0" oder "a%0" handelt, oder ist das absichtlich offengehalten? (Ich
> finde es passend, die Ameise ab da nur noch 'skip' liefern zu lassen,
> wie beim Abfragen einer nichtdefinierten Variablen.)
Genau! Division durch 0 ist bekanntermaßen undefiniert. Also ist die
Interpretation || a/b || (die durch || a || / || b || mod 6 gegeben ist)
undefiniert, wenn || b || gleich 0 ist. Das heißt die Ameise muss sich
dann genau so verhalten wie beim Abfragen einer nichtdefinierten
Variable. Das hätten wir vielleicht noch ausdrücklich sagen können, aber
genau genommen ist es schon spezifiziert.
> Und (das bezieht sich jetzt vor allem auf den AI-Wettbewerb, den es in
> einem Monat geben soll), gibt es eine Größenbeschränkung für
> AntBrain-Programme? Es sind Gerüchte über eine 16KByte-Grenze im
> Umlauf, aber ist das eine offizielle Angabe? Wären es dann 16KByte pro
> Ameise oder insgesamt (das wäre aber sehr wenig)?
Die genauen Regeln werden wir noch bekannt geben. Darin wird es aber
wahrscheinlich eine Größenbeschränkung an die Größe der Ameisenprogramme
geben, die sich so in der Größenordnung von 10K-100K pro Ameise bewegen
wird. Der Grund dafür ist einfach, dass man mit langen Programmen
vermutlich die Beschränkung auf 12 Variablen umgehen könnte, indem man
Variablen auf Kosten der Programmlänge herauskompiliert (ich habe jetzt
aber nicht genau überlegt, ob das überhaupt geht). Die Ameisen selbst
sollen eben recht wenig eigenen Programmspeicher haben und sie
sollen schon die Duftmarken benutzen müssen, wenn sie sich mehr
merken sollen. Es soll aber mit Sicherheit nicht so sein, dass man sich
sehr einschränken muss, wenn man Programme per Hand schreibt.
|