Tema proiectului de anul acesta din cadrul materiei Proiectarea Algoritmilor va fi realizarea unui program capabil să joace o versiune de șah, numită Crazyhouse. Această versiune a jocului conține patru modificări față de regulile jocului de șah clasic:
Proiectul se va realiza în echipe de câte 2-4 studenți (minim 2, maxim 4 studenți pe echipă) și se va desfășura pe parcursul a 4 etape. Se va folosi platforma XBoard pentru a interfața, vizualiza, înregistra și reda partidele jucate între aplicațiile realizate în cadrul proiectului. Dacă vreți să testați pe Windows, puteți folosi varianta WinBoard, pe care o puteți descărca de aici sau puteți folosi WSL împreună cu un XServer (în secțiunea FAQs există un mic tutorial pentru această opțiune).
Reguli de upload: Vom folosi pentru proiect repository-urile din cadrul platformei GitHub Classroom. Căpitanul echipei va trebui să intre pe assignment-ul corespunzător proiectului (https://classroom.github.com/a/HQbmZPA0) și să creeze echipa. Ceilalți membri vor intra ulterior pe același link și se vor înscrie în aceeași echipă. Repository-ul va fi creat automat și va fi privat, singurii care îl vor putea accesa fiind membrii echipei și responsabilii de proiect din echipa de PA. La fiecare etapă (în afară de etapa 0) veți salva în repository-ul vostru 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 MacOS. Scriptul de testare va “make clean”, “make build” pentru compilare, apoi “make run” pentru rulare. Makefile-ul trebuie să se afle în rădăcina arhivei pentru a putea fi rulat. Asigurați-vă că fișierul Makefile nu conține path-uri absolute (să poată fi rulat și pe alt sistem).
La fiecare push în repository, GitHub va verifica automat dacă există o arhivă cu numele corect și dacă cele 3 acțiuni din Makefile pot fi rulate. Puteți ignora erorile înainte de trimiterea finală a arhivei.
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ă.
Etapa 0 presupune formarea unor echipe de câte 2-4 persoane. Echipele se pot forma între oricare 2-4 studenți din aceeași 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 crea echipa pe GitHub Classroom. Ceilalţi membri ai echipei se vor conecta în echipa deja creată.
Pentru înscriere, accesați acest link.
Deadline-ul acestei etape este marți, 28 martie 2023, ora 23:55.
Se va realiza reprezentarea internă a tablei de joc și a pieselor de joc, precum și o interfațare cu programul XBoard.
Interfațarea va presupune posibilitatea de a interpreta și interacționa cu următoarele comenzi ale XBoard (cele cu steluță * sunt opționale, dar recomandate): xboard, protover N*, feature*, new, force, go, quit, resign, move. Documentația oficială pentru xboard o puțeți găsi aici. Chiar dacă nu aveți nevoie neapărat de tot ce este acolo, recomandarea noastră este să parcurgeți toată pagina. Veți înțelege mai bine cum funcționează XBoard în general.
Interacțiunea cu această aplicație se va face prin intermediul stdin-ului și stdout-ului: Xboard va scrie comenzi/mutări programului vostru la stdin, iar voi îi veți răspunde scriind la stdout. Comenzile menționate mai sus au următoarele roluri și trebuie să vă asigurați că funcționează pentru a primi punctajul aferent acestora:
De asemenea, programul va trebui să primească mișcări de la XBoard și să trimită mișcări legale.
Programul vostru va trebui să fie capabil să joace un joc de șah complet. Acest lucru implică interpretarea tuturor mișcărilor legale din jocul de Crazyhouse. Pentru a decide următoarea mutare este suficient să aveți o strategie aleatorie, dar dacă doriți să implementați ceva mai inteligent sunteți invitații noștri.
Modalități de testare:
> xboard -fcp "make run" -debug
Presupunând că “make run” pornește engine-ul vostru (asta ar și trebui să facă) atunci comanda de mai sus va crea un fișier xboard.debug în care va scrie tot ce se întâmplă. Dacă vreți să aveți un exemplu inițial, puteți juca cu un bot deja existent care vine instalat odată cu xboard prin comanda:
> xboard -fcp "fairymax" -debug
Această etapă va avea 4 săptămâni. Punctajul alocat acestei etape este de 0.6 puncte.
Deadline-ul acestei etape este 30 aprilie 2023, 23:55.
Testarea se va realiza manual folosind atât funcția “force” (Edit Game), cât și prin joc “normal”. Scenariile pe care va trebui să le implementați și care vor fi și testate sunt următoarele:
Ce nu vom testa, dar va fi nevoie de ele pentru etapa următoare vor fi condițiile de terminare a partidei:
Această etapă este dedicată implementării unor algoritmi avansați pentru a crește calitatea jocului prestat de program. Punctajul pe această etapă poate fi obținut în urma unor meciuri cu boți puși la dispoziție de către noi. Recomandăm implementarea algoritmului alpha-beta și a cel putin două tehnici avansate/euristici pentru a putea calcula cât mai multe mutări în față. Administrarea timpului rămas este o componentă foarte importantă acestei etape.
TODO Această etapă va avea 5 săptămâni. Punctajul alocat acestei etape este de 0.6 puncte.
TODO Deadline-ul acestei etape este 31 mai 2023, ora 23:55.
Pentru testare ne vom folosi de engine-ul Fairy-Stockfish disponibil aici. Acesta poate fi instalat direct din surse folosind aceste instrucțiuni. Comenzile de mai jos sunt rulate presupunand ca executabilul “stockfish” se află în directorul curent, vor trebui adaptate în funcție de locația executabilului de pe sistemul vostru. În funcție de caz, capabilitățile sale vor fi limitate, folosind opțiunea Skill level cu valorile -20, -10 sau -5. Acest lucru îl va face să joace progresiv mai bine.
Testarea se va face automat într-o mașină virtuală linux cu 1 singur procesor. Comenzile care vor fi rulate pentru testare vor arăta (foarte) asemănător cu comenzile de mai jos. Iar prin “foarte asemănător” înțelegem că această comandă va fi dată xboardului să pornească jocul cu engine-ul vostru, dar mai pot diferi numele fișierului în care se salvează partidele și/sau va fi pusă într-un script.
Explicarea parametrilor:
Punctajul de 0.6 puncte se va acorda în felul următor:
Punctele se vor acorda după următoarea formulă:
punctaj_etapă = min(0.2, 0.2 * (număr_puncte_din_meci_vs_easy / 2)) + min(0.2, 0.2 * (număr_puncte_din_meci_vs_medium / 2)) + min(0.2, 0.2 * (număr_puncte_din_meci_vs_hard / 2))
În cadrul turneului se realizeaza un concurs între proiectele realizate, actualizat permanent. Punctajul aferent acestei etape este de 0.8 puncte și se va acorda după următorul algoritm:
Didactic, este o idee de proiect bună din mai multe puncte de vedere (provocări de implementare, înțelegerea unor concepte de algoritmi avansați, provocări de time management, abilitatea de autodocumentare, abilitatea de a lucra în echipă, etc). Șahul a fost ales datorită rezonanței sale ca joc. Din experientă vă spunem că un motor de șah decent făcut dă bine la un interviu.
Winboard/Xboard a devenit un program standard de interfațare între diferitele motoare existente în momentul de față. Fiecare motor minimalist existent știe să lucreze cu acest program. Ușurarea lucrului de mediere a unui joc justifică implementarea sa, precum și faptul că proiectul realizat va putea juca cu orice alt motor cât de cât performant de pe net. Cât despre timpul pierdut, interfațarea minimalistă cerută in etapa 1 se poate realiza în aproximativ o oră. La ce chestii vor fi de implementat la protocoale de comunicații, asta vi se va părea floare la ureche .
Da, exista multe surse de documentație pe net despre cum să implementezi un joc de șah. Dar de la vorbe la fapte e cale lungă. Doar pentru că există mulți algoritmi nu inseamnă că oricine va ști să-i implementeze și să o facă și bine. Implementarea corectă și eficientă presupune mai mult decât copy paste de pe net. Cât despre proiectele de anii trecuți, ele există in posesia echipei de PA, și cele de anul acesta vor fi verificate contra celor precedente pentru a nu avea cazuri de fraudă. De asemenea, tipul de șah “crazyhouse” este diferit de șahul normal astfel că un engine care joacă șah normal va pierde destul de sigur împotriva unuia specializat. Dacă se constată o tentativă de fraudă din partea oricărei echipe, toți membrii echipei vor avea restanță la Proiectarea Algoritmilor și vor pierde punctajul aferent proiectului.
Cum vrei, pe baza oricăror criterii crezi tu că sunt importante.
Din experiența anilor trecuți, niciodată nu se intamplă ca toți membrii echipei să lucreze la fel de mult. Acest fapt se intamplă din varii motive: fie nu toți pot, fie unul sau doi acaparează toata munca și nu le dau celorlalți o șansă (nu râdeți, s-a intamplat :P), fie <insert another reason here>. Fiecare echipă va avea un căpitan care va avea, printre altele, datoria de a comunica echipei de PA (asistentului de laborator, titularului de curs etc) orice neregulă din cadrul propriei echipe. In afară de asta și de a vorbi puțin individual cu membrii fiecarei echipe nu există altă soluție. Depinde de prioritățile fiecărui membru de echipă și a echipei per ansamblu.
In oricare limbaj de programare cu care vă înțelegeți mai bine, atât timp cât va putea rula pe linux. De remarcat este faptul că pentru acest proiect timpul de execuție este critic.
Nu. S-a pus problema și în alți ani. Motivul este că nu toți știu să lucreze cu thread-uri, iar un astfel de avantaj ar fi incorect față de ceilalți. NU postați în legătură cu asta pe forum…it’s final and that’s that.
Da, atât timp cât toata arhiva este până în 5Mb.
Categoric NU. Proiectul trebuie să fie stand-alone. Nu se admit conexiuni de genul celor menționate mai sus.
Nu. Doar cod sursă (și eventuale adiționale precum opening data bases). Codul se va compila și link-edita dupa regulile prezente în makefile-ul, ant file-ul, script-ul etc-ul vostru de build.
Pe forum-ul dedicat proiectului de pe pagina web a cursului de PA.
Pentru început este nevoie de un X server care e capabil să ruleze aplicațiile grafice din Linux. O varintă ar fi să instalați Xming X server (Xming sourceforge). Aveți aici un tutorial. Pe scurt:
> DISPLAY=:0 xboard
În urma acestori pași, dacă și xboardul este instalat ar trebui să vă apară tabla din cadrul aplicației xboard. Dacă acest lucru nu merge și primiți o eroare de genul “cannot open display :0” atunci rulați următoarea comandă care ar trebui să rezolve problema:
> export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0 ; xboard
Last update: 27/4/23 1:20 (protocol hotfix in Main.java/Main.cpp + Java Makefile)
Aveți aici schelete de cod pentru limbajele C++ și Java. Implementarea voastră se va realiza în fișierele Bot.cpp sau Bot.java, după caz. In cadrul clasei Bot, vă veți declara câmpuri private (spre exemplu tabla de șah), pe care le puteți stoca în orice structuri doriți. Inițializarea acestora o veți face în constructorul clasei. Acestea vor putea fi accesate de către voi în cele două metode ce le veți implementa: