Oppgave #308
Forfatter:IOAI 2026 Organizing Team
Vanskelighetsgrad
Din beste poengsum
N/A
Forestill dere et Distinksjonenes kabinett der skuffene inneholder skjulte dyr. Dere kan ikke åpne en skuff, men Dere kan ask et orakel spørsmål med svarene “yes” eller “no” og deretter prøve å guess navnet på det animal.
Målet er å identifisere hver animal ved å bruke så få anrop som mulig. Dette er et interaktivt identifiseringsproblem som ligner på spillet "Twenty Questions": hvert svar skal redusere settet med plausible dyr, og det beste neste question vil generelt avhenge av svarene som er mottatt så langt.
To komplette sett er publisert:
animals_pool.txt: 1,472 dyr som kan foreslås;questions_pool.txt: 559 spørsmål med "yes" eller "no" svar.For en skjult animal avslører det opprinnelige problemet følgende operasjoner:
| Drift | Returnert verdi | Mening |
|---|---|---|
ask(question) | "yes" eller "no" | Spør en question fra questions_pool.txt. |
guess(animal) | "correct" eller "wrong" | Foreslår en animal fra animals_pool.txt. Et correct-forslag avslutter runden. |
Begge operasjonene bruker ett anrop. Det totale budsjettet er 15 anrop for hvert skjult animal, inkludert den endelige guess. En verdi som ikke tilhører det tilsvarende settet, avvises uten å bruke et anrop.
På MLCompete-plattformen uttrykkes den adaptive strategien som en endelig beslutningsgraf i policy.json. En ask-node forgrener seg i henhold til oraklets yes/no-svar. En guess-node avslutter runden hvis forslaget er correct; ellers følges wrong-kanten. En stop-node avslutter runden uten å løse den.
Denne deklarative representasjonen tilsvarer en deterministisk adaptiv solve-strategi for ett animal: hver avgjørelse kan avhenge av hele svarhistorikken. For en randomisert strategi må Dere fastsette det tilfeldige frøet før Dere eksporterer den. Ingen kode innsendt av deltakerne blir utført under evalueringen.
Oraklet er basert på Qwen/Qwen2.5-3B-Instruct, festet til revisjon aa8e72537993ba99e69dfaafa59ed015b17504d1. For hvert animal–question-par fra den private evalueringen som kreves av evaluatoren, bruker arrangørene den eksakte offisielle ledeteksten:
You are answering a question about one specific animal.The animal is: {animal}.Answer with a single word, yes or no.Question: {question}Den offisielle interactor.py-filen som er inkludert i pakken er bevart uendret og fester ikke en Hugging Face-revisjon. For å reprodusere plattformoraklet så trofast som mulig, send revisjonen ovenfor til både AutoTokenizer.from_pretrained og AutoModelForCausalLM.from_pretrained, og bruk det innspilte miljøet.
Ulik maskinvare eller ulike numeriske biblioteker kan fortsatt endre en greedy-bit nær uavgjort; plattformens frosne matrise forblir autoritativ, mens lokal inferens bare er en prediksjon av den matrisen.
En tilnærming med høy ytelse er å forhåndsberegne en animal–question-tabell, beholde kandidatene som er kompatible med de observerte svarene, og velge question som deler gjenværende kandidatsett så jevnt som mulig.
Den offentlige pakken inneholder:
animals_pool.txt og questions_pool.txt;dev.csv, som inneholder 150 offentlig merkede dyr;test1.csv, som inneholder 500 offentlig merkede dyr;interactor.py og evaluate.py filene for lokale eksperimenter;validate_submission.py, en frittstående validator for ZIP-arkivet og strategien;dev.csv og test1.csv er disjunkte offentlige sett for lokal evaluering, ikke hemmelige resultatlistedata. Det private MLCompete-settet trekkes bare fra de 822 dyrene i animals_pool.txt som ikke forekommer i noen av de to offentlige CSV-filene. Det inneholder 128 unike dyr: 32 utgjør det løpende/delvise settet, mens ytterligere 96, disjunkte fra den første gruppen, utgjør det endelige/fullstendige settet. Deres nøyaktige sammensetning og evalueringsrekkefølge avsløres ikke.
Den offisielle evaluate.py-filen kjører en Python MySolution-implementering i originalformatet; den leser eller validerer ikke arkivet som inneholder policy.json. Bruk validate_submission.py før Dere laster opp.
Send inn et ZIP-arkiv som inneholder nøyaktig én fil på root i arkivet:
policy.jsonKataloger, symbolske lenker, dupliserte baner og tilleggsfiler er ikke tillatt. policy.json må være et UTF-8 JSON-dokument med følgende schema:
ioai-2026-animal-policy-v1Mens konkurransen er aktiv, krever plattformen også et eget kildekodevedlegg. I det feltet laster Dere opp kildefilen, notebooken eller kildearkivet som ble brukt til å konstruere policy.json. Arrangørene beholder det for verifisering; evaluatoren utfører det ikke, og det må ikke inkluderes i innsendingens ZIP-arkiv.
Identifikatorer er nullbaserte linjeindekser i de offisielle normaliserte settene:
question: et heltall mellom 0 og 558;animal: et heltall mellom 0 og 1471;nodes-listen;null-kant: stop uten å bruke et nytt anrop.De eksakte nodeformatene er:
{"type":"ask","question":17,"yes":4,"no":5}{"type":"guess","animal":903,"wrong":8}{"type":"stop"}Et arkiv kan maksimalt definere 32,767 nodes. Hver referanse må peke til en eksisterende node. Ukjente nøkler, dupliserte JSON-nøkler, ugyldige tall og feil angitte hashes ugyldiggjør innsendingen.
{ "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"} ]}Eksemplet spør den første publiserte question. Etter yes, foreslår den den første publiserte animal; etter no stopper den.
For hver private animal starter evaluatoren på root med null anrop og krysser grafen iterativt:
ask: bruker ett anrop, leser den frosne orakelbiten og følger deretter yes eller no;guess: bruker ett anrop; avsluttes vellykket hvis forslaget er correct, ellers følger wrong;stop eller null: avsluttes uten å løse runden og uten å bruke et anrop.Traversering stopper etter 15 forbrukte anrop, selv om grafen inneholder en annen utgående kant. Sykluser er trygt avgrenset av dette budsjettet.
For en skjult animal:
round_score = max(0, (1 if the animal was found, otherwise 0) - 0.02 × number_of_calls)Eksempler:
0.98;0.90;0.70;0.De to råverdiene beregnes uavhengig:
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_metricMens konkurransen er aktiv, ser vanlige deltakere bare den delvise poengsummen. Den fullstendige poengsummen forblir skjult og blir det endelige målet for resultatlisten etter konkurransen. Det er gjennomsnittet av de 96 radene i det fullstendige settet, ikke et kombinert gjennomsnitt av alle 128 radene. Maksimal mulig verdi for hver av de viste poengsummene er 98.00, fordi selv en første correct guess bruker ett anrop.
Bygg og test strategien lokalt med de offisielle settene og det frosne oraklet. Eksporter hver avgjørelse som en ask-, guess- eller stop-node, erstatt grener som overskrider horisonten på 15 anrop, med null eller stop, og slå om nødvendig sammen identiske undergrafer for å holde Dere innenfor nodegrensen.
Plasser kun policy.json i det evaluerte ZIP-arkivet. Last opp separat kildekoden til programmet som konstruerer strategien, eller den tilsvarende notebooken, i det obligatoriske kildekodefeltet. Ikke last opp modellvekter eller forhåndsberegnede orakeltabeller.
Kjør følgende før Dere laster opp:
python3 validate_submission.py submission.zipTilpasset med tillatelse fra “Det analytiske språket (John Wilkins)” (IOAI 2026 Home Task 3). Se den offisielle notebooken.
Det deklarative strategiarkivet, plattformens private sett og det frosne forhåndsberegnede oraklet er MLCompete-tilpasninger. Oppgavekravene, prompten, de tillatte verdisettene, budsjettet på 15 anrop og evalueringsformelen følger det offisielle materialet.