בעיה #308
מחבר:IOAI 2026 Organizing Team
רמת קושי
הציון הטוב ביותר שלך
לא זמין
דמיינו קבינט הבחנות שבמגירותיו נמצאים בעלי חיים מוסתרים. אינכם יכולים לפתוח מגירה, אך אתם יכולים להשתמש בפעולת ask כדי לשאול את האורקל שאלות שהתשובות עליהן הן “yes” או “no”, ולאחר מכן להשתמש בפעולת guess כדי לנסות לנחש את שם בעל החיים (animal).
המטרה היא לזהות כל animal באמצעות מספר הקריאות הקטן ביותר האפשרי. זוהי בעיית זיהוי אינטראקטיבית הדומה למשחק „עשרים שאלות”: כל תשובה אמורה לצמצם את קבוצת בעלי החיים הסבירים, וה-question הבא הטוב ביותר יהיה תלוי בדרך כלל בתשובות שהתקבלו עד כה.
שתי קבוצות מלאות מתפרסמות:
animals_pool.txt: 1,472 בעלי חיים שניתן להציע;questions_pool.txt: 559 שאלות שהתשובות עליהן הן “yes” או “no”.עבור animal מוסתר, הבעיה המקורית חושפת את הפעולות הבאות:
| פעולה | ערך מוחזר | משמעות |
|---|---|---|
ask(question) | "yes" או "no" | מציגה question מתוך questions_pool.txt. |
guess(animal) | "correct" או "wrong" | מציעה animal מתוך animals_pool.txt. הצעה correct מסיימת את הסיבוב. |
שתי הפעולות צורכות קריאה אחת. התקציב הכולל הוא 15 קריאות לכל animal מוסתר, כולל ה-guess הסופי. ערך שאינו שייך לקבוצה המתאימה נדחה בלי לצרוך קריאה.
בפלטפורמת MLCompete, האסטרטגיה המסתגלת מיוצגת כגרף החלטות סופי ב-policy.json. צומת ask מסתעף לפי תשובת ה-yes/no של האורקל. צומת guess מסיים את הסיבוב אם ההצעה correct; אחרת עוקבים אחר הקשת wrong. צומת stop מסיים את הסיבוב בלי לפתור אותו.
ייצוג הצהרתי זה שקול למדיניות solve מסתגלת ודטרמיניסטית עבור animal אחד: כל החלטה יכולה להיות תלויה בכל היסטוריית התשובות. עבור אסטרטגיה אקראית, קבעו את הזרע האקראי לפני הייצוא. במהלך ההערכה לא מורץ קוד שהגישו המשתתפים.
האורקל מבוסס על Qwen/Qwen2.5-3B-Instruct, המקובע לגרסה aa8e72537993ba99e69dfaafa59ed015b17504d1. עבור כל זוג animal–question מן ההערכה הפרטית שנדרש למעריך, המארגנים משתמשים בהנחיה הרשמית המדויקת:
You are answering a question about one specific animal.The animal is: {animal}.Answer with a single word, yes or no.Question: {question}הקובץ הרשמי interactor.py הכלול בחבילה נשמר ללא שינוי ואינו מקבע גרסת Hugging Face. כדי לשחזר את אורקל הפלטפורמה בנאמנות המרבית, העבירו את הגרסה שלעיל גם אל AutoTokenizer.from_pretrained וגם אל AutoModelForCausalLM.from_pretrained, והשתמשו בסביבה המתועדת.
חומרה או ספריות נומריות שונות עדיין עשויות לשנות ביט חמדני סמוך לתיקו; המטריצה הקפואה של הפלטפורמה נותרת הסמכות הקובעת, ואילו הסקה מקומית היא רק חיזוי של מטריצה זו.
גישה בעלת ביצועים גבוהים היא לחשב מראש טבלת animal–question, לשמור את המועמדים התואמים לתשובות שנצפו ולבחור question שמחלק את קבוצת המועמדים הנותרת באופן שווה ככל האפשר.
החבילה הציבורית מכילה:
animals_pool.txt ו-questions_pool.txt;dev.csv, המכיל 150 בעלי חיים מתויגים בפומבי;test1.csv, המכיל 500 בעלי חיים מתויגים בפומבי;interactor.py ו-evaluate.py לניסויים מקומיים;validate_submission.py, מאמת עצמאי של ZIP ומדיניות;dev.csv ו-test1.csv הן קבוצות ציבוריות זרות זו לזו המיועדות להערכה מקומית, ולא נתונים סודיים של טבלת המובילים. הקבוצה הפרטית של MLCompete נדגמת רק מתוך 822 בעלי החיים ב-animals_pool.txt שאינם מופיעים באף אחד משני קובצי ה-CSV הציבוריים. היא מכילה 128 בעלי חיים ייחודיים: 32 מהווים את הקבוצה הפעילה/החלקית, ואילו 96 נוספים, הזרים לקבוצה הראשונה, מהווים את הקבוצה הסופית/המלאה. ההרכב המדויק וסדר ההערכה שלהם אינם נחשפים.
הקובץ הרשמי evaluate.py מריץ מימוש Python של MySolution בתבנית המקורית; הוא אינו קורא או מאמת את הארכיון המכיל את policy.json. השתמשו ב-validate_submission.py לפני ההעלאה.
הגישו ארכיון ZIP המכיל בדיוק קובץ אחד ב-root של הארכיון:
policy.jsonאסור לכלול ספריות, קישורים סמליים, נתיבים כפולים וקבצים נוספים. policy.json חייב להיות מסמך JSON בקידוד UTF-8 המשתמש ב-schema הבא:
ioai-2026-animal-policy-v1כל עוד התחרות פעילה, הפלטפורמה דורשת גם קובץ מצורף נפרד של קוד המקור. בשדה זה, העלו את קובץ המקור, המחברת או ארכיון המקור ששימשו לבניית policy.json. המארגנים שומרים אותו לצורך אימות; המעריך אינו מריץ אותו, ואסור לכלול אותו בארכיון ZIP של ההגשה.
המזהים הם אינדקסים של שורות המתחילים באפס בקבוצות הרשמיות המנורמלות:
question: מספר שלם בין 0 ל-558;animal: מספר שלם בין 0 ל-1471;nodes;null: stop בלי לצרוך קריאה נוספת.התבניות המדויקות של הצמתים הן:
{"type":"ask","question":17,"yes":4,"no":5}{"type":"guess","animal":903,"wrong":8}{"type":"stop"}ארכיון רשאי להגדיר לכל היותר 32,767 nodes. כל הפניה חייבת להצביע על צומת קיים. מפתחות לא מוכרים, מפתחות JSON כפולים, מספרים לא תקינים וגיבובים שגויים של הקבוצות פוסלים את ההגשה.
{ "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"} ]}הדוגמה מציגה את ה-question הראשון שפורסם. אחרי yes, היא מציעה את ה-animal הראשון שפורסם; אחרי no, היא נעצרת.
עבור כל animal פרטי, המעריך מתחיל ב-root עם אפס קריאות ועובר בגרף באופן איטרטיבי:
ask: צורך קריאה אחת, קורא את ביט האורקל הקפוא ולאחר מכן עוקב אחר yes או no;guess: צורך קריאה אחת; מסתיים בהצלחה אם ההצעה correct, ואחרת עוקב אחר wrong;stop או null: מסתיים בלי לפתור את הסיבוב ובלי לצרוך קריאה.המעבר נעצר לאחר 15 קריאות שנצרכו, גם אם הגרף מכיל קשת יוצאת נוספת. מחזורים מוגבלים בבטחה באמצעות תקציב זה.
עבור animal מוסתר אחד:
round_score = max(0, (1 if the animal was found, otherwise 0) - 0.02 × number_of_calls)דוגמאות:
0.98;0.90;0.70;0.שני המדדים הגולמיים מחושבים בנפרד:
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_metricכל עוד התחרות פעילה, משתתפים רגילים רואים רק את הציון החלקי. הציון המלא נשאר מוסתר והופך למדד הסופי של טבלת המובילים לאחר סיום התחרות. זהו הממוצע של 96 שורות הקבוצה המלאה, ולא ממוצע משולב של כל 128 השורות. הערך המרבי האפשרי של כל אחד מהציונים המוצגים הוא 98.00, מפני שגם guess בקריאה הראשונה, אם הוא correct, צורך קריאה אחת.
בנו ובדקו את האסטרטגיה באופן מקומי באמצעות הקבוצות הרשמיות והאורקל הקפוא. יצאו כל החלטה כצומת ask, guess או stop, החליפו ענפים שחורגים מאופק 15 הקריאות ב-null או stop, ומזגו תתי-גרפים זהים במידת הצורך כדי להישאר במסגרת מגבלת הצמתים.
מקמו רק את policy.json בארכיון ZIP המוערך. העלו בנפרד את קוד המקור של התוכנית שבונה את המדיניות, או את המחברת המתאימה, בשדה החובה של קוד המקור. אל תעלו משקלי מודל או טבלאות אורקל שחושבו מראש.
לפני ההעלאה, הריצו:
python3 validate_submission.py submission.zipעובד ברשות מתוך „השפה האנליטית של John Wilkins” (משימת בית 3 של IOAI 2026). ראו את המחברת הרשמית.
ארכיון המדיניות ההצהרתי, הקבוצה הפרטית של הפלטפורמה והאורקל הקפוא שחושב מראש הם עיבודים של MLCompete. דרישות המשימה, ההנחיה, קבוצות הערכים המותרים, תקציב 15 הקריאות ונוסחת ההערכה תואמים לחומרים הרשמיים.