Opgave #308
Forfatter:IOAI 2026 Organizing Team
Sværhedsgrad
Din bedste score
N/A
Forestil jer et Distinktionernes kabinet, hvis skuffer indeholder skjulte dyr. I kan ikke åbne en skuffe, men I kan ask et orakel spørgsmål med svarene “yes” eller “no” og derefter prøve at guess navnet på det animal.
Målet er at identificere hvert animal med så få kald som muligt. Dette er et interaktivt identifikationsproblem, der ligner spillet ”Tyve spørgsmål”: hvert svar skal reducere mængden af plausible dyr, og den bedste næste question vil generelt afhænge af de hidtil modtagne svar.
To komplette sæt udgives:
animals_pool.txt: 1,472 dyr, der kan foreslås;questions_pool.txt: 559 spørgsmål med "yes" eller "no" svar.For en skjult animal afslører det oprindelige problem følgende handlinger:
| Betjening | Returneret værdi | Betydning |
|---|---|---|
ask(question) | "yes" eller "no" | Spørger en question fra questions_pool.txt. |
guess(animal) | "correct" eller "wrong" | Foreslår en animal fra animals_pool.txt. Et correct-forslag afslutter runden. |
Begge operationer bruger ét kald. Det samlede budget er 15 kald for hvert skjult animal, inklusive den endelige guess. En værdi, der ikke hører til det tilsvarende sæt, afvises uden at bruge et kald.
På MLCompete-platformen er den adaptive strategi udtrykt som en endelig beslutningsgraf i policy.json. En ask-knude forgrener sig i henhold til oraklets yes/no-svar. En guess-node afslutter runden, hvis forslaget er correct; ellers følges wrong-kanten. En stop node afslutter runden uden at løse den.
Denne deklarative repræsentation svarer til en deterministisk adaptiv solve-politik for ét animal: enhver beslutning kan afhænge af hele svarhistorien. For en randomiseret strategi skal I fastlægge det tilfældige frø, før I eksporterer den. Ingen kode indsendt af deltagerne udføres under evalueringen.
Oraklet er baseret på Qwen/Qwen2.5-3B-Instruct, fastgjort til revision aa8e72537993ba99e69dfaafa59ed015b17504d1. For hvert animal–question-par fra den private evaluering, der kræves af evaluatoren, bruger arrangørerne den nøjagtige officielle prompt:
You are answering a question about one specific animal.The animal is: {animal}.Answer with a single word, yes or no.Question: {question}Den officielle interactor.py-fil inkluderet i pakken bevares uændret og fastgør ikke en Hugging Face-revision. For at gengive platformoraklet så trofast som muligt skal I videregive ovenstående revision til både AutoTokenizer.from_pretrained og AutoModelForCausalLM.from_pretrained og bruge det registrerede miljø.
Forskellig hardware eller forskellige numeriske biblioteker kan stadig ændre en greedy-bit nær et ligepunkt; platformens frosne matrix forbliver autoritativ, mens lokal inferens kun er en forudsigelse af denne matrix.
En højtydende tilgang er at forudberegne en animal–question-tabel, beholde kandidaterne kompatible med de observerede svar og vælge question, der deler det resterende kandidatsæt så ligeligt som muligt.
Den offentlige pakke indeholder:
animals_pool.txt og questions_pool.txt;dev.csv, der indeholder 150 offentligt mærkede dyr;test1.csv, der indeholder 500 offentligt mærkede dyr;interactor.py og evaluate.py filer til lokale eksperimenter;validate_submission.py, en selvstændig ZIP og politikvalidator;dev.csv og test1.csv er disjunkte offentlige sæt til lokal evaluering, ikke hemmelige ranglistedata. Det private MLCompete-sæt trækkes kun fra de 822 dyr i animals_pool.txt, der ikke forekommer i nogen af de to offentlige CSV-filer. Det indeholder 128 unikke dyr: 32 udgør det løbende/delvise sæt, mens yderligere 96, disjunkte fra den første gruppe, udgør det endelige/fuldstændige sæt. Deres nøjagtige sammensætning og evalueringsrækkefølge oplyses ikke.
Den officielle evaluate.py-fil kører en Python MySolution-implementering i det originale format; den læser eller validerer ikke arkivet, der indeholder policy.json. Brug validate_submission.py før upload.
Indsend et ZIP-arkiv indeholdende præcis én fil på root i arkivet:
policy.jsonMapper, symbolske links, duplikerede stier og yderligere filer er ikke tilladt. policy.json skal være et UTF-8 JSON dokument med følgende schema:
ioai-2026-animal-policy-v1Mens konkurrencen er aktiv, kræver platformen også en separat kildekodevedhæftning. I det felt skal I uploade kildefilen, notebooken eller kildearkivet, der bruges til at konstruere policy.json. Arrangørerne opbevarer det til verifikation; evaluatoren udfører det ikke, og det må ikke medtages i indsendelsens ZIP-arkiv.
Identifikatorer er nul-baserede linjeindekser i de officielle normaliserede sæt:
question: et heltal mellem 0 og 558;animal: et heltal mellem 0 og 1471;nodes-listen;null-kant: stop uden at bruge endnu et kald.De nøjagtige nodeformater er:
{"type":"ask","question":17,"yes":4,"no":5}{"type":"guess","animal":903,"wrong":8}{"type":"stop"}Et arkiv kan højst definere 32,767 nodes. Hver reference skal pege på en eksisterende node. Ukendte nøgler, dublet JSON nøgler, ugyldige numre og forkerte sæt hashes gør indsendelsen ugyldig.
{ "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ørger den først offentliggjorte question. Efter yes foreslår den den første offentliggjorte animal; efter no stopper den.
For hver private animal starter evaluatoren ved root med nul kald og krydser grafen iterativt:
ask: bruger ét kald, læser den frosne orakelbit og følger derefter yes eller no;guess: bruger ét kald; slutter med succes, hvis forslaget er correct, ellers følges wrong;stop eller null: afslutter uden at løse runden og uden at bruge et kald.Gennemgangen stopper efter 15 brugte kald, selv om grafen indeholder endnu en udgående kant. Cykler afgrænses sikkert af dette budget.
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å metrics beregnes uafhængigt:
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 konkurrencen er aktiv, ser almindelige deltagere kun den delvise score. Den fulde score forbliver skjult og bliver det endelige mål for ranglisten, når konkurrencen er slut. Det er gennemsnittet af de 96 rækker i det fulde sæt, ikke et kombineret gennemsnit af alle 128 rækker. Den maksimalt mulige værdi for hver af de viste scorer er 98.00, fordi selv en første correct guess bruger ét kald.
Byg og test strategien lokalt med de officielle sæt og det frosne orakel. Eksporter hver beslutning som en ask-, guess- eller stop-node, erstat grene, der overskrider horisonten på 15 kald, med null eller stop, og sammenflet om nødvendigt identiske undergrafer for at overholde nodegrænsen.
Placer kun policy.json i det evaluerede ZIP-arkiv. Upload separat kildekoden for det program, der konstruerer politikken, eller den tilsvarende notesbog, i det obligatoriske kildekodefelt. Upload ikke modelvægte eller forudberegnede orakeltabeller.
Kør følgende, før I uploader:
python3 validate_submission.py submission.zipTilpasset med tilladelse fra “Det analytiske sprog (John Wilkins)” (IOAI 2026 Home Task 3). Se den officielle notebook.
Det deklarative politikarkiv, platformens private sæt og det frosne forudberegnede orakel er MLCompete-tilpasninger. Opgavekravene, prompten, de tilladte værdisæt, budgettet på 15 kald og evalueringsformlen følger de officielle materialer.