Problemă #308
Autor:IOAI 2026 Organizing Team
Dificultate
Maximul tău
N/A
Imaginați-vă un Cabinet al Distincțiilor ale cărui sertare conțin animale ascunse. Nu puteți deschide un sertar, dar puteți utiliza operația ask pentru a adresa unui oracol întrebări cu răspunsuri „yes” sau „no”, apoi puteți încerca un guess pentru numele acelui animal.
Scopul este să identificați fiecare animal folosind cât mai puține apeluri posibil. Aceasta este o problemă de identificare interactivă, asemănătoare jocului „Twenty Questions”: fiecare răspuns ar trebui să reducă mulțimea animalelor plauzibile, iar următoarea întrebare optimă (question) va depinde, în general, de răspunsurile primite până atunci.
Sunt publicate două mulțimi complete:
animals_pool.txt: 1,472 de animale care pot fi propuse;questions_pool.txt: 559 de întrebări cu răspunsuri „yes” sau „no”.Pentru un animal ascuns, problema originală pune la dispoziție următoarele operații:
| Operație | Valoare returnată | Semnificație |
|---|---|---|
ask(question) | "yes" sau "no" | Adresează o întrebare (question) din questions_pool.txt. |
guess(animal) | "correct" sau "wrong" | Propune un animal din animals_pool.txt. Dacă propunerea este correct, runda se încheie. |
Ambele operații consumă câte un apel. Bugetul total este de 15 apeluri pentru fiecare animal ascuns, inclusiv ultimul guess. O valoare care nu aparține mulțimii corespunzătoare este respinsă fără a consuma un apel.
Pe platforma MLCompete, strategia adaptivă este exprimată ca un graf finit de decizie în policy.json. Un nod ask se ramifică în funcție de răspunsul yes/no al oracolului. Un nod guess încheie runda dacă propunerea este correct; în caz contrar, este urmată muchia wrong. Un nod stop încheie runda fără rezolvarea acesteia.
Această reprezentare declarativă este echivalentă cu o politică solve adaptivă și deterministă pentru un animal: fiecare decizie poate depinde de întregul istoric al răspunsurilor. Pentru o strategie aleatorie, fixați valoarea inițială a generatorului de numere aleatoare înainte de export. În timpul evaluării nu este executat niciun cod trimis de participanți.
Oracolul se bazează pe Qwen/Qwen2.5-3B-Instruct, fixat la revizia aa8e72537993ba99e69dfaafa59ed015b17504d1. Pentru fiecare pereche animal–question din evaluarea privată necesară evaluatorului, organizatorii folosesc exact promptul oficial:
You are answering a question about one specific animal.The animal is: {animal}.Answer with a single word, yes or no.Question: {question}Fișierul oficial interactor.py inclus în pachet este păstrat neschimbat și nu fixează o revizie Hugging Face. Pentru a reproduce cât mai fidel oracolul platformei, transmiteți revizia de mai sus atât către AutoTokenizer.from_pretrained, cât și către AutoModelForCausalLM.from_pretrained și folosiți mediul înregistrat.
Un hardware diferit sau biblioteci numerice diferite pot modifica totuși un bit greedy în apropierea unei egalități; matricea înghețată a platformei rămâne autoritară, iar inferența locală este doar o predicție a acestei matrice.
O abordare performantă constă în precalcularea unui tabel animal–question, păstrarea candidaților compatibili cu răspunsurile observate și alegerea acelei întrebări (question) care împarte cât mai uniform mulțimea candidaților rămași.
Pachetul public conține:
animals_pool.txt și questions_pool.txt;dev.csv, care conține 150 de animale etichetate public;test1.csv, care conține 500 de animale etichetate public;interactor.py și evaluate.py pentru experimente locale;validate_submission.py, un validator autonom pentru ZIP și politică;dev.csv și test1.csv sunt mulțimi publice disjuncte destinate evaluării locale, nu date secrete ale clasamentului. Mulțimea privată MLCompete este extrasă numai dintre cele 822 de animale din animals_pool.txt care nu apar în niciunul dintre cele două fișiere CSV publice. Aceasta conține 128 de animale unice: 32 formează mulțimea live/partial, iar alte 96, disjuncte de primul grup, formează mulțimea final/full. Componența lor exactă și ordinea evaluării nu sunt dezvăluite.
Fișierul oficial evaluate.py rulează o implementare Python MySolution în formatul original; acesta nu citește și nu validează arhiva care conține policy.json. Folosiți validate_submission.py înainte de încărcare.
Trimiteți o arhivă ZIP care conține exact un singur fișier la nivelul root al arhivei:
policy.jsonNu sunt permise directoare, legături simbolice, căi duplicate sau fișiere suplimentare. policy.json trebuie să fie un document JSON UTF-8 în conformitate cu schema de mai jos:
ioai-2026-animal-policy-v1Cât timp competiția este activă, platforma necesită și un atașament separat cu codul-sursă. În acel câmp, încărcați fișierul-sursă, notebook-ul sau arhiva-sursă utilizată pentru construirea policy.json. Organizatorii păstrează atașamentul pentru verificare; evaluatorul nu îl execută, iar acesta nu trebuie inclus în arhiva ZIP a trimiterii.
Identificatorii sunt indici de linie numerotați de la zero în mulțimile oficiale normalizate:
question: un număr întreg între 0 și 558;animal: un număr întreg între 0 și 1471;nodes;null: stop fără consumarea unui alt apel.Formatele exacte ale nodurilor sunt:
{"type":"ask","question":17,"yes":4,"no":5}{"type":"guess","animal":903,"wrong":8}{"type":"stop"}O arhivă poate defini în lista nodes cel mult 32,767 de noduri. Fiecare referință trebuie să indice un nod existent. Cheile necunoscute, cheile JSON duplicate, numerele nevalide și hashurile incorecte ale mulțimilor invalidează trimiterea.
{ "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"} ]}Exemplul adresează prima întrebare publicată (question). După yes, propune primul animal publicat; după no, se oprește.
Pentru fiecare animal privat, evaluatorul pornește de la root cu zero apeluri și parcurge iterativ graful:
ask: consumă un apel, citește bitul înghețat al oracolului, apoi urmează yes sau no;guess: consumă un apel; încheie cu succes dacă propunerea este correct, iar în caz contrar urmează wrong;stop sau null: încheie fără rezolvarea rundei și fără a consuma un apel.Parcurgerea se oprește după 15 apeluri consumate, chiar dacă graful conține încă o muchie de ieșire. Ciclurile sunt limitate în siguranță de acest buget.
Pentru un animal ascuns:
round_score = max(0, (1 if the animal was found, otherwise 0) - 0.02 × number_of_calls)Exemple:
0.98;0.90;0.70;0.Cele două metrici brute sunt calculate independent:
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_metricCât timp competiția este activă, participanții obișnuiți văd numai punctajul parțial. Punctajul complet rămâne ascuns și devine metrica finală a clasamentului după încheierea competiției. Acesta este media celor 96 de rânduri din mulțimea completă, nu o medie combinată a tuturor celor 128 de rânduri. Valoarea maximă posibilă pentru oricare dintre punctajele afișate este 98.00, deoarece chiar și un guess correct din prima consumă un apel.
Construiți și testați strategia local folosind mulțimile oficiale și oracolul înghețat. Exportați fiecare decizie ca nod ask, guess sau stop, înlocuiți ramurile care depășesc orizontul de 15 apeluri cu null sau stop și îmbinați subgrafurile identice, dacă este necesar, pentru a respecta limita de noduri.
Plasați numai policy.json în arhiva ZIP evaluată. Încărcați separat codul-sursă al programului care construiește politica sau notebook-ul corespunzător în câmpul obligatoriu pentru cod-sursă. Nu încărcați ponderile modelului sau tabelele precalculate ale oracolului.
Înainte de încărcare, rulați:
python3 validate_submission.py submission.zipAdaptare realizată cu permisiune după „The Analytical Language of John Wilkins” (IOAI 2026 Home Task 3). Consultați notebook-ul oficial.
Arhiva declarativă a politicii, mulțimea privată a platformei și oracolul precalculat și înghețat sunt adaptări MLCompete. Cerințele problemei, promptul, mulțimile de valori permise, bugetul de 15 apeluri și formula de evaluare urmează materialele oficiale.