Autor: Mihai Nan
În orașul Algorithmia, livrările rapide nu mai sunt făcute de curieri umani, ci de roboți autonomi. Un astfel de robot, numit RoboCourier, trebuie să transporte pachete între diferite puncte ale orașului.
Orașul este însă plin de situații dificile: drumuri blocate, semafoare, zone alunecoase, vânt lateral și baterii care se descarcă. RoboCourier trebuie să decidă nu doar drumul cel mai scurt, ci drumul cu cea mai bună recompensă obținută în urma simulării.
Pentru fiecare scenariu, robotul primește o hartă, poziția inițială, energia disponibilă și lista pachetelor. Programul concurentului trebuie să producă o secvență de acțiuni pe care evaluatorul o va simula automat.
Orașul este reprezentat ca o matrice cu N linii și M coloane.
Fiecare celulă conține unul dintre următoarele simboluri:
| Simbol | Semnificație |
|---|---|
. | drum normal |
# | obstacol; robotul nu poate intra în această celulă |
C | stație de încărcare |
S | zonă alunecoasă |
W | zonă cu vânt lateral |
T | semafor |
Pachetele nu sunt marcate direct în hartă. Ele sunt date separat prin coordonatele sursei și destinației.
Coordonatele sunt indexate de la 0.
La fiecare pas, RoboCourier poate executa una dintre acțiunile:
UP DOWN LEFT RIGHT WAIT PICK DROP CHARGESemnificație:
| Acțiune | Efect |
|---|---|
UP | deplasare cu o linie în sus |
DOWN | deplasare cu o linie în jos |
LEFT | deplasare cu o coloană la stânga |
RIGHT | deplasare cu o coloană la dreapta |
WAIT | robotul așteaptă o unitate de timp |
PICK | robotul ridică un pachet aflat în celula curentă |
DROP | robotul livrează pachetul transportat, dacă se află la destinația lui |
CHARGE | robotul se încarcă dacă se află pe o celulă C |
Robotul poate transporta cel mult un pachet la un moment dat.
O acțiune de deplasare consumă 1 unitate de energie și produce o penalizare de -1 în scor.
Dacă robotul încearcă să intre într-un obstacol sau în afara hărții, rămâne pe loc și primește o penalizare suplimentară.
Acțiunea WAIT consumă 1 unitate de energie și produce o penalizare de -1 în scor.
Acțiunile PICK și DROP consumă o unitate de timp, dar nu consumă energie.
Acțiunea CHARGE consumă o unitate de timp și crește energia robotului cu 5 unități, fără a depăși energy_cap, dacă robotul se află pe o celulă C. Dacă robotul nu se află pe o celulă C, acțiunea este considerată invalidă.
Dacă energia robotului ajunge la 0, episodul se termină.
Dacă numărul de pași executați ajunge la max_steps, episodul se termină.
În unele subtask-uri apar celule cu efect aleatoriu.
SDacă robotul ajunge pe o celulă S după o acțiune de deplasare, atunci cu probabilitatea p_slide este mutat automat încă o celulă în aceeași direcție.
Dacă a doua celulă este invalidă, alunecarea nu se produce.
WDacă robotul ajunge pe o celulă W după o acțiune de deplasare, atunci cu probabilitatea p_wind este mutat automat într-una dintre cele două direcții perpendiculare pe direcția deplasării inițiale, aleasă uniform aleator.
Dacă celula rezultată este invalidă, robotul rămâne pe loc.
TO celulă T poate fi traversată doar atunci când semaforul este deschis.
La momentul t, semaforul este deschis dacă:
t mod traffic_period este 0 sau 1În restul timpului, semaforul este închis.
Dacă robotul încearcă să intre într-o celulă T când semaforul este închis, mutarea este blocată, robotul rămâne pe loc și primește penalizarea pentru acțiune invalidă.
Fiecare pachet are:
id, sursă, destinație, recompensă, deadlineUn pachet poate fi ridicat doar din celula sa sursă, prin acțiunea PICK.
Un pachet poate fi livrat doar în celula sa destinație, prin acțiunea DROP.
Dacă pachetul este livrat până la deadline, se acordă recompensa completă.
Dacă pachetul este livrat după deadline, recompensa este diminuată proporțional cu întârzierea, conform regulilor implementate în evaluator.
Un pachet poate fi livrat cel mult o dată.
Datasetul este format din trei fișiere CSV:
train.csvval.csvtest.csvToate scenariile sunt stocate în același tip de fișier tabelar.
Coloanele principale sunt:
| Coloană | Descriere |
|---|---|
datapointID | identificatorul scenariului |
subtaskID | subtask-ul din care face parte scenariul |
rows | numărul de linii ale hărții |
cols | numărul de coloane ale hărții |
grid | harta codificată ca șir; liniile sunt separate prin / |
start_r | linia inițială a robotului |
start_c | coloana inițială a robotului |
energy | energia inițială |
energy_cap | energia maximă permisă |
max_steps | numărul maxim de pași simulați |
packages | lista pachetelor, în format JSON compact |
p_slide | probabilitatea de alunecare |
p_wind | probabilitatea de deviere din cauza vântului |
traffic_period | perioada semafoarelor |
În train.csv și val.csv există și coloanele:
| Coloană | Descriere |
|---|---|
target_actions | o secvență demonstrativă de acțiuni |
oracle_score | scorul mediu al secvenței demonstrative |
În test.csv, coloanele target_actions și oracle_score nu sunt disponibile.
Secvența target_actions nu este garantată ca fiind optimă. Ea este oferită doar ca exemplu de soluție validă.
Exemplu de hartă:
..#..C/.S..T./..W.../C..#..Aceasta reprezintă harta:
..#..C.S..T...W...C..#..Coloana packages conține o listă JSON.
Exemplu:
[{"id":0,"sr":1,"sc":0,"dr":3,"dc":5,"reward":100,"deadline":25}]Aici există un pachet:
0;(1, 0);(3, 5);100;25.Participanții trebuie să trimită un fișier submission.csv cu următoarele coloane:
datapointID,subtaskID,answertest_000000,1,DOWN;LEFT;LEFT;PICK;DOWN;RIGHT;RIGHT;DROPtest_000001,2,UP;UP;RIGHT;WAIT;RIGHT;PICK;LEFT;DROPColoana datapointID trebuie să corespundă identificatorului scenariului din test.csv.
Coloana subtaskID trebuie să conțină subtask-ul scenariului.
Coloana answer conține acțiunile separate prin caracterul ;.
Pentru fiecare scenariu din test.csv trebuie să existe exact o linie în submission.csv.
Dacă secvența este mai scurtă decât max_steps, evaluatorul consideră că robotul execută WAIT pentru restul pașilor.
Dacă secvența este mai lungă decât max_steps, acțiunile suplimentare sunt ignorate.
În coloana answer sunt permise doar acțiunile:
UP DOWN LEFT RIGHT WAIT PICK DROP CHARGEAcțiunile trebuie scrise cu majuscule și separate prin ;.
Exemple valide:
RIGHT;PICK;DOWN;DROPWAIT;WAIT;RIGHT;CHARGEExemple invalide:
RIGHT PICK DOWN DROPright;pick;down;dropRIGHT, PICK, DOWN, DROPEvaluatorul simulează acțiunile trimise de concurent.
Pentru fiecare scenariu se calculează un scor brut, compus din:
Pentru scenariile stochastice, aceeași secvență de acțiuni este simulată pe mai multe seed-uri ascunse, iar scorul final al scenariului este media scorurilor obținute.
Scorul brut este normalizat folosind valori de referință precalculate pentru fiecare scenariu. Aceste valori nu sunt disponibile în test.csv, dar sunt folosite de evaluator pentru a face scenariile comparabile între ele.
Punctajul total este suma punctajelor obținute pe cele patru subtask-uri:
| Subtask | Punctaj |
|---|---|
| Subtask 1 | 20 puncte |
| Subtask 2 | 25 puncte |
| Subtask 3 | 25 puncte |
| Subtask 4 | 30 puncte |
Pentru leaderboard-ul public, punctajul este calculat doar pe o parte dintre scenariile de test.
Pentru evaluarea finală, punctajul este calculat pe toate scenariile de test.
Pentru acest subtask, sunt garantate următoarele constrângeri:
Pentru acest subtask, sunt garantate următoarele constrângeri:
C;Pentru acest subtask, sunt garantate următoarele constrângeri:
S;W;T;Pentru acest subtask, sunt garantate următoarele constrângeri:
Rând din test.csv:
datapointID,subtaskID,rows,cols,grid,start_r,start_c,energy,energy_cap,max_steps,packages,p_slide,p_wind,traffic_periodtest_000000,1,3,4,...#/..../....,0,0,20,20,30,"[{""id"":0,""sr"":0,""sc"":1,""dr"":2,""dc"":3,""reward"":100,""deadline"":12}]",0,0,4O ieșire posibilă în submission.csv:
datapointID,subtaskID,answertest_000000,1,RIGHT;PICK;DOWN;DOWN;RIGHT;RIGHT;DROP