This is an old revision of the document!
În acest an vă propunem realizarea unui program care să joace cât mai bine jocul Halite.
Regulile jocului sunt explicate în detaliu aici.
Aveți la dispoziție starter kits, disponibile pentru multe limbaje de programare, aici. Acestea au deja implementată comunicarea cu engine-ul jocului, precum și câteva funcții elementare de navigare/analiză a stării jocului. Funcționalitățile existente sunt descrise aici.
Proiectul va cuprinde 5 etape, după cum este prezentat în continuare. Fiecare etapă presupune dezvoltarea unui bot care va juca Halite din ce în ce mai inteligent, iar ultima etapă reprezintă un concurs la nivel de serie, iar apoi la nivel de an pentru a stabili marele câștigător al proiectului de PA din anul 2019. Fiecare echipă poate să își schimbe complet strategia de joc între etape dacă membrii săi consideră acest lucru oportun.
Reguli de upload: La fiecare etapă (în afară de etapa 0) veți salva în repository-ul vostru (cel specificat la înscriere) o arhivă zip, numită “EtapaX.zip” (unde X reprezintă numărul etapei: e.g. “Etapa1.zip”)
Arhiva va conține:
Pentru notare, toate arhivele vor fi descărcate automat - asigurați-vă că arhiva există în repository, este numită corect și este completă.
Makefile:
Boții vor fi evaluați pe un sistem Linux/GNU pe 64 biți, deci este foarte important să verificați că aveți un makefile care funcționează corect pe Linux, chiar dacă lucrați pe Windows sau Mac OS X. Scriptul de testare va apela “cmake .” (daca ati trimis un fisier CMakeLists.txt), respectiv “make”.
Asigurați-vă că fișierul Makefile nu conține path-uri absolute (să poată fi rulat și pe alt sistem). Este util sa aveti o regula “clean”, pentru a sterge executabilul si fisierele obiect/log-urile generate (daca este cazul).
Fișierul Readme va respecta următoarea structură:
Atenție! Deadline-urile la proiect sunt hard, deci nu se permit întârzieri. Dacă s-a ratat deadline-ul la o etapă, se poate lucra în continuare pentru celelalte etape, dar punctajul se va pierde pentru respectiva etapă.
Pentru a vă încuraja să lucrați din timp, dupa Etapa 1 vom organiza săptămânal o competiție între boții voștri.
Rezultatele pot fi observate aici: https://paresources.github.io/haliteweekly.github.io/
Etapa 0 presupune formarea unor echipe de câte 3-4 persoane. Echipele se pot forma între oricare 3-4 studenţi din aceeaşi serie. Se permit echipe cu oameni din serii diferite atat timp cât 3 din 4 membri (sau 2 din 3) sunt din aceeasi serie. Studenții restanțieri pot participa cu colegi de la orice serie.
Fiecare echipă va desemna un membru al acesteia cu rolul de căpitan. Căpitanul va avea, printre altele, sarcina de a trimite în numele echipei sale soluţiile pentru fiecare din etapele rămase. Ceilalţi membri ai echipei nu vor trimite soluţii, decât in cazul in care căpitanul nu poate face acest lucru din motive obiective.
Un obiectiv al acestui proiect este lucrul in echipa. Recomandăm să citiți cu atenție regulile jocului și să vă alegeți fiecare rolul in echipă, rol pe care să îl mentionați în momentul inscrierii. De exemplu, o echipă de 4 studenți poate fi formată dintr-o persoană care să scrie codul, 2 persoane care să faca cercetare (tactici, algoritmi, optimizari) și un tester. Rolurile se pot schimba pe parcurs.
Pentru a ajuta colaborarea în echipă, veți folosi un sistem de versionare a surselor numit git. Mai multe indicații aici.
Pentru înscriere, accesați acest link.
Această etapă va avea 1 săptămână. Punctajul alocat acestei etape este de 0 puncte.
Deadline-ul acestei etape este duminică, 3 martie 2019, ora 23:55.
Pentru prima etapă veți dezvolta un bot simplu, capabil să extragă eficient resursele disponibile pe o hartă, fără a se întâlni cu un adversar.
Obiectivele etapei:
Puteți modifica/imbunătăți cum doriți codul din starter pack.
Punctele vor fi acordate, pe următoarele configurații de hărți, în felul următor:
Lungime hartă | Înălțime hartă | Seed | Halite Minim Acumulat |
32 | 32 | 42 | 8000 |
32 | 32 | 1673031865 | 12000 |
40 | 40 | 1773807367 | 20000 |
48 | 48 | 1942373999 | 13000 |
56 | 56 | 142342898 | 12000 |
Dacă botul înmagazinează, până la finalul jocului, cantitatea specificată de Halite (sau mai mult), va primi intregul punctaj asociat configurației respective. Altfel, va primi un punctaj parțial, în funcție de cât de aproape se află de limita.
Seed-ul este specificat pentru a înlătura orice ambiguitate sau variabilă aleatorie din evaluare, nu pentru a permite hardcodarea de paşi. Orice soluţie care hardcodează paşii pentru a obţine rezultatul dorit nu va primi punctajul pe etapă. Dacă folosiți un generator de numere random in programul vostru, folosiți seedul 42 pentru inițializarea acestuia.
Punctajul va fi calculat in felul urmator:
Scriptul pe care il vom folosi pentru evaluare se găsește la adresa: resources.zip (Minor Update 7.03.2019)
Pentru a-l folosi:
Această etapă va dura 2 săptămâni. Punctajul alocat acestei etape este de 0.5 puncte.
Deadline-ul acestei etape este duminică, 17 martie 2019, ora 23:55.
Pentru a doua etapă, dorim să implementați câteva tactici simple care să coordoneze navele mai bine, să aleagă locații optime pentru “dropoffs” și să țină cont în general de prezența adversarului.
Punctele vor fi acordate, pe următoarele configurații de hărți, în felul următor:
Lungime hartă | Înălțime hartă | Seed | Nume Bot Adversar |
32 | 32 | 20596 | Odysseus |
32 | 32 | 75273 | Dragon |
32 | 32 | 58900 | Joker |
40 | 40 | 93689 | Odysseus |
40 | 40 | 98091 | Dragon |
56 | 56 | 1234 | Odysseus |
56 | 56 | 42 | Odysseus |
56 | 56 | 1024 | Dragon |
Odysseus este un bot simplu, care caută greedy pentru fiecare navă o destinație cu multe resurse, la o distantă f. mică de poziția curentă.
Joker exploateaza o anumită vulnerabilitate care poate sa apară în soluțiile voastre.
Dragon este un bot mai complex, care combină mai multe strategii.
Pentru punctaj maxim trebuie sa invingeti pe 5 harti din cele 8 mentionate mai sus.
Scriptul pe care il vom folosi pentru evaluare se găsește la adresa: resources.zip
Această etapă va dura 4 săptămâni. Punctajul alocat acestei etape este de 0.5 puncte.
Deadline-ul acestei etape este duminică, 14 aprilie 2019, ora 23:55.
Etapa 3 va avea ca tinta jocurile cu 4 oponenti. La aceasta etapa veti avea de luptat impotriva Odysseus, Dragon (botii de la etapa 2) si Rhaegal, un varianta putin imbunatatita a lui Odysseus care foloseste dropoff-uri. Obiectul vostru este sa va clasati cat mai sus in cele 8 meciuri.
Punctajul maxim pentru aceasta etapa este obtinut daca media clasarilor voastre este minim 2.
Punctele vor fi acordate, pe următoarele configurații de hărți, în felul următor:
Lungime hartă | Înălțime hartă | Seed | Adversari |
56 | 56 | 1423 | Odysseus, Odysseus, Odysseus |
56 | 56 | 1312 | Rhaegal, Odysseus, Dragon |
32 | 32 | 5231 | Dragon, Dragon, Dragon |
56 | 56 | 3908 | Rhaegal, Rhaegal, Rhaegal |
56 | 56 | 1423 | Rhaegal, Odysseus, Rhaegal |
40 | 56 | 8762 | Rhaegal, Dragon, Dragon |
56 | 40 | 1931 | Dragon, Dragon, Dragon |
40 | 40 | 5421 | Dragon, Rhaegal, Rhaegal |
Scriptul pe care il vom folosi pentru evaluare se găsește la adresa: resources.zip
Această etapă va dura ~4 săptămâni. Punctajul alocat acestei etape este de 0.4 puncte.
Deadline-ul acestei etape este miercuri, 15 Mai 2019, ora 23:55.
În ultima etapă vom organiza un concurs live la care vor participa toate echipele. Concursul se va organiza mai întai pe serii, iar câstigătorii (top 3) vor concura apoi separat pentru a stabili cea mai bună echipă din an.
Deadline-ul pentru submisii (“Etapa4.zip”) este 22 Mai 2019, ora 23:55. Dupa această dată competiția în cadrul seriilor va fi resetată (clasamentul nu va mai fi disponibil live).
Punctajul aferent acestei etape este de 0.6 puncte și se va acorda dupa următorul algoritm (pentru fiecare serie in parte):
Restul proiectelor vor primi in funcție de locul în clasament între 0 si 0.35 puncte, marja intre doua proiecte consecutive fiind de 0.35/(numar_proiecte_finaliste-3).
Program Finală, 24 mai 2019, EC101:
16:10 - 16:30 Prezentare Softwire - Raul Tabacu
16:30 - 16:55 Halite Journey - where we talk about training dragons
16:55 - 17:05 Pizza Break
17:05 - 18:15 Premierea celor mai bune echipe
Vă asteptăm!
Clasamentul final al competitiei se afla aici: https://tinyurl.com/y2wnjqzh
În principiu, puteți să lucrați în orice limbaj doriți. Într-un limbaj high-level (Python, Julia) va fi mai ușor să implementați/testați versiuni noi de boți dar botul va fi mai lent față de unul echivalent scris într-un limbaj precum C++/Java. Top 25 boți din competiția originală au fost scriși în foarte multe limbaje: C++, Java, C#, Python, Clojure, Rust, Go, Javascript.
Indiferent de limbajul în care lucrați veți avea aceleași restricții de timp.
Proiectul va fi evaluat pe un sistem Linux/GNU, 64 biți, prin urmare ar fi bine să verificați că aveți un makefile care funcționează corect pe Linux, chiar dacă lucrați pe Windows sau Mac OS X.
Nu sunt necesare noțiuni de învățare automată pentru proiect. De altfel, majoritatea participanților de la competiția originală nu au folosit ML. Bineințeles, nu este interzis, dar dacă încercați o astfel de abordare trebuie să aveți în vedere că la competiția finală nu aveți avea la dispoziție un GPU dedicat. De asemeni, nu veți putea apela biblioteci specializate de ML.
Sigur că da, inspirarea după ideile descoperite online nu se penalizează. Este important însă să precizați sursa în Readme. Copierea codului sursă (sau reproducerea integrală a ideii de rezolvare dintr-o altă sursă) se sancţionează cu pierderea punctajului pentru întregul proiect.
Pentru acestă etapa vom folosi TrueSkill pentru a departaja echipele participante. TrueSkill modeleaza abilitatea unui jucator sub forma unei distributii normale:
Mean μ - media abilității jucătorului
Variance σ - încrederea sistemului în scorul obținut, în funcție de numărul de meciuri jucate și de adversarii întălniți.
Boții se vor lupta aleator între ei, în funcție de estimarea curentă a abilității, până ce sistemul va căpata 'încredere' în valorile obținute. (nu mai apar modificări în clasament).