Aufgabe #308
Autor:IOAI 2026 Organizing Team
Schwierigkeit
Dein bestes Ergebnis
N/V
Stellen Sie sich ein Kabinett der Unterscheidungen vor, dessen Schubladen verborgene Tiere enthalten. Sie können keine Schublade öffnen, aber Sie dürfen einem Orakel eine question ask, die mit „yes“ oder „no“ beantwortet wird, und dann versuchen, den Namen des animal zu guess.
Ziel ist es, jedes animal mit möglichst wenigen Aufrufen zu identifizieren. Dies ist ein interaktives Identifikationsproblem, ähnlich dem Spiel „Zwanzig Fragen“: Jede Antwort sollte die Menge der plausiblen Tiere verkleinern, und die beste nächste question hängt im Allgemeinen von den bisher erhaltenen Antworten ab.
Zwei vollständige Mengen werden veröffentlicht:
animals_pool.txt: 1,472 Tiere, die geraten werden dürfen;questions_pool.txt: 559 Fragen mit den Antworten „yes“ oder „no“.Für ein verborgenes animal stellt die ursprüngliche Aufgabe die folgenden Operationen bereit:
| Operation | Rückgabewert | Bedeutung |
|---|---|---|
ask(question) | "yes" oder "no" | Stellt eine question aus questions_pool.txt. |
guess(animal) | "correct" oder "wrong" | Schlägt ein animal aus animals_pool.txt vor. Ein als correct bewerteter Vorschlag beendet die Runde. |
Beide Operationen verbrauchen jeweils einen Aufruf. Das Gesamtbudget beträgt 15 Aufrufe für jedes verborgene animal, einschließlich des abschließenden guess. Ein Wert, der nicht zur entsprechenden Menge gehört, wird zurückgewiesen, ohne einen Aufruf zu verbrauchen.
Auf der MLCompete-Plattform wird die adaptive Strategie als endlicher Entscheidungsgraph in policy.json dargestellt. Ein ask-Knoten verzweigt entsprechend der yes/no-Antwort des Orakels. Ein guess-Knoten beendet die Runde, wenn der Vorschlag correct ist; andernfalls wird der Kante wrong gefolgt. Ein stop-Knoten beendet die Runde, ohne sie zu lösen.
Diese deklarative Darstellung entspricht einer deterministischen adaptiven solve-Strategie für ein animal: Jede Entscheidung kann von der gesamten Historie der Antworten abhängen. Legen Sie bei einer randomisierten Strategie den Zufallsstartwert vor dem Export fest. Während der Auswertung wird kein von Teilnehmenden eingereichter Code ausgeführt.
Das Orakel basiert auf Qwen/Qwen2.5-3B-Instruct und ist auf die Revision aa8e72537993ba99e69dfaafa59ed015b17504d1 festgelegt. Für jedes von der Auswertung benötigte animal–question-Paar aus der privaten Bewertung verwenden die Organisatoren den exakten offiziellen Prompt:
You are answering a question about one specific animal.The animal is: {animal}.Answer with a single word, yes or no.Question: {question}Die im Paket enthaltene offizielle Datei interactor.py bleibt unverändert und legt keine Hugging Face-Revision fest. Um das Plattform-Orakel so originalgetreu wie möglich zu reproduzieren, übergeben Sie die obige Revision sowohl an AutoTokenizer.from_pretrained als auch an AutoModelForCausalLM.from_pretrained und verwenden Sie die aufgezeichnete Umgebung.
Andere Hardware oder andere numerische Bibliotheken können ein Greedy-Bit in der Nähe eines Gleichstands dennoch verändern; die eingefrorene Matrix der Plattform bleibt maßgeblich, während die lokale Inferenz lediglich eine Vorhersage dieser Matrix ist.
Ein leistungsstarker Ansatz besteht darin, eine animal–question-Tabelle vorab zu berechnen, die mit den beobachteten Antworten kompatiblen Kandidaten beizubehalten und die question auszuwählen, die die verbleibende Kandidatenmenge möglichst gleichmäßig aufteilt.
Das öffentliche Paket enthält:
animals_pool.txt und questions_pool.txt;dev.csv, mit 150 öffentlich gekennzeichneten Tieren;test1.csv, mit 500 öffentlich gekennzeichneten Tieren;interactor.py und evaluate.py für lokale Experimente;validate_submission.py, ein eigenständiger Validator für ZIP-Archive und Strategien;dev.csv und test1.csv sind disjunkte öffentliche Mengen für die lokale Auswertung und keine geheimen Bestenlistendaten. Die private MLCompete-Menge wird ausschließlich aus den 822 Tieren in animals_pool.txt gebildet, die in keiner der beiden öffentlichen CSV-Dateien vorkommen. Sie enthält 128 unterschiedliche Tiere: 32 bilden die laufende/partielle Menge, während weitere 96, die von der ersten Gruppe disjunkt sind, die finale/vollständige Menge bilden. Ihre genaue Zusammensetzung und Auswertungsreihenfolge werden nicht offengelegt.
Die offizielle Datei evaluate.py führt eine Python-Implementierung von MySolution im ursprünglichen Format aus; sie liest oder validiert das Archiv mit policy.json nicht. Verwenden Sie vor dem Hochladen validate_submission.py.
Reichen Sie ein ZIP-Archiv ein, das genau eine Datei im root des Archivs enthält:
policy.jsonVerzeichnisse, symbolische Links, doppelte Pfade und zusätzliche Dateien sind nicht zulässig. policy.json muss ein UTF-8-JSON-Dokument sein, das das folgende schema verwendet:
ioai-2026-animal-policy-v1Während der Wettbewerb aktiv ist, verlangt die Plattform außerdem einen separaten Quellcode-Anhang. Laden Sie in diesem Feld die Quelldatei, das Notebook oder das Quellarchiv hoch, mit dem policy.json erstellt wurde. Die Organisatoren bewahren den Anhang zur Überprüfung auf; der Evaluator führt ihn nicht aus, und er darf nicht im ZIP-Einreichungsarchiv enthalten sein.
Bezeichner sind nullbasierte Zeilenindizes in den offiziellen normalisierten Mengen:
question: eine Ganzzahl zwischen 0 und 558;animal: eine Ganzzahl zwischen 0 und 1471;nodes-Liste;null-Kante: stop, ohne einen weiteren Aufruf zu verbrauchen.Die genauen Knotenformate sind:
{"type":"ask","question":17,"yes":4,"no":5}{"type":"guess","animal":903,"wrong":8}{"type":"stop"}Ein Archiv darf höchstens 32,767 nodes definieren. Jede Referenz muss auf einen vorhandenen Knoten verweisen. Unbekannte Schlüssel, doppelte JSON-Schlüssel, ungültige Zahlen und falsche Hashwerte der Mengen machen die Einreichung ungültig.
{ "schema": "ioai-2026-animal-policy-v1", "animals_sha256": "87eb93cc5d2a238a38daaeb201c394db935153cc17b03a44a7642f0db9ff35dc", "questions_sha256": "d2bd060866382f3dd1329112e73fbd6bf2397352d02469434b7b3d199bd2ca62", "root": 0, "nodes": [ {"type": "ask", "question": 0, "yes": 1, "no": 2}, {"type": "guess", "animal": 0, "wrong": null}, {"type": "stop"} ]}Das Beispiel stellt die erste veröffentlichte question. Nach yes schlägt es das erste veröffentlichte animal vor; nach no beendet es die Ausführung.
Für jedes private animal beginnt der Evaluator bei root mit null Aufrufen und durchläuft den Graphen iterativ:
ask: verbraucht einen Aufruf, liest das eingefrorene Oracle-Bit und folgt dann yes oder no;guess: verbraucht einen Aufruf; endet erfolgreich, wenn der Vorschlag correct ist, andernfalls folgt es wrong;stop oder null: beendet die Runde ohne Lösung und ohne einen Aufruf zu verbrauchen.Der Durchlauf endet nach 15 verbrauchten Aufrufen, auch wenn der Graph eine weitere ausgehende Kante enthält. Zyklen werden durch dieses Budget sicher begrenzt.
Für ein verstecktes animal:
round_score = max(0, (1 if the animal was found, otherwise 0) - 0.02 × number_of_calls)Beispiele:
0.98;0.90;0.70;0.Die beiden Rohmetriken werden unabhängig voneinander berechnet:
partial_metric = mean(round_score for the 32 live animals)full_metric = mean(round_score for the 96 final animals)partial_score = 100 × partial_metricfull_score = 100 × full_metricWährend der Wettbewerb aktiv ist, sehen reguläre Teilnehmende nur die Teilpunktzahl. Die vollständige Punktzahl bleibt verborgen und wird nach Ende des Wettbewerbs zur endgültigen Bestenlistenmetrik. Sie ist der Mittelwert über die 96 Zeilen der vollständigen Menge und kein kombinierter Mittelwert über alle 128 Zeilen. Der maximal mögliche Wert jeder der beiden angezeigten Punktzahlen ist 98.00, da selbst ein erster correct guess einen Aufruf verbraucht.
Erstellen und testen Sie die Strategie lokal mit den offiziellen Mengen und dem eingefrorenen Orakel. Exportieren Sie jede Entscheidung als ask-, guess- oder stop-Knoten, ersetzen Sie Zweige, die den Horizont von 15 Aufrufen überschreiten, durch null oder stop, und führen Sie bei Bedarf identische Untergraphen zusammen, um die Knotengrenze einzuhalten.
Legen Sie ausschließlich policy.json in das ausgewertete ZIP-Archiv. Laden Sie den Quellcode des Programms, das die Strategie erstellt, oder das entsprechende Notebook separat im Pflichtfeld für den Quellcode hoch. Laden Sie keine Modellgewichte oder vorberechneten Orakeltabellen hoch.
Führen Sie vor dem Hochladen Folgendes aus:
python3 validate_submission.py submission.zipMit Genehmigung nach „Die analytische Sprache von John Wilkins“ (IOAI 2026 Home Task 3) adaptiert. Siehe das offizielle Notebook.
Das deklarative Strategiearchiv, die private Menge der Plattform und das eingefrorene vorab berechnete Orakel sind MLCompete-Anpassungen. Die Aufgabenanforderungen, der Prompt, die zulässigen Wertemengen, das Budget von 15 Aufrufen und die Bewertungsformel folgen den offiziellen Materialien.