Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pp:22:teme:prolog-ultimate-ttt [2022/05/18 02:03]
bot.pp
pp:22:teme:prolog-ultimate-ttt [2022/05/28 15:25] (current)
bot.pp
Line 2: Line 2:
  
   * Data publicării:​ 10.05.2022   * Data publicării:​ 10.05.2022
-  * Data ultimei modificări a enunțului: ​18.05.2022 Etapa 1: 15.05.2022 (vezi [#​changelog]) +  * Data ultimei modificări a enunțului: ​19.05.2022 Etapa 1: 15.05.2022 (vezi [[#changelog|changelog]]) 
-  * Data ultiemi ​modificări a scheletului: ​18.05.2022 (Etapa 2), 11.05.2022 (Etapa 1)+  * Data ultimei ​modificări a scheletului: ​27.05.2022 (Etapa 2), 11.05.2022 (Etapa 1)
   * Deadline hard: ziua laboratorului 12 + 2 zile   * Deadline hard: ziua laboratorului 12 + 2 zile
   * [[https://​curs.upb.ro/​2021/​mod/​forum/​view.php?​id=225449|Forum temă]]   * [[https://​curs.upb.ro/​2021/​mod/​forum/​view.php?​id=225449|Forum temă]]
Line 118: Line 118:
  
   * orice mutare care duce la câștigarea tablei de către jucătorul aflat la mutare are prioritate 0.   * orice mutare care duce la câștigarea tablei de către jucătorul aflat la mutare are prioritate 0.
 +    * în exemplu, în tabla ne, pentru jucătorul 0, mutarea n are prioritate 0.
   * orice mutare care blochează oponentul de la a câștiga (este într-o poziție în care dacă oponentul mută, câștigă) are prioritate 1.   * orice mutare care blochează oponentul de la a câștiga (este într-o poziție în care dacă oponentul mută, câștigă) are prioritate 1.
 +    * în exemplu, în tabla ne, pentru jucătorul x, mutarea n are prioritate 1.
   * dacă tabla este goală, mutările în colțuri au prioritate 2.   * dacă tabla este goală, mutările în colțuri au prioritate 2.
   * dacă jucătorul curent nu a mutat de loc în această tablă, iar oponentul a mutat deja în centru, mutările în colțuri au prioritate 3.   * dacă jucătorul curent nu a mutat de loc în această tablă, iar oponentul a mutat deja în centru, mutările în colțuri au prioritate 3.
   * dacă jucătorul curent nu a mutat de loc în această tablă, iar oponentul nu a mutat deja în centru, mutarea în centru are prioritate 3.   * dacă jucătorul curent nu a mutat de loc în această tablă, iar oponentul nu a mutat deja în centru, mutarea în centru are prioritate 3.
   * orice mutare care duce tabla într-o stare din care jucătorul curent poate câștiga cu o singură mutare are prioritate 4.   * orice mutare care duce tabla într-o stare din care jucătorul curent poate câștiga cu o singură mutare are prioritate 4.
-  * în orice alt caz în afară de cele de mai sus, o mutare ​în centru ​are prioritate 5, iar celelalte mutări au prioritate 6.+  * în orice alt caz în afară de cele de mai sus, o mutare ​într-un colț are prioritate 5, iar celelalte mutări au prioritate 6.
  
 Predicatul ''​%%movePriority/​4%%''​ evaluează prioritatea unei mutări, pentru un jucător, pentru o tablă individuală. Predicatul ''​%%movePriority/​4%%''​ evaluează prioritatea unei mutări, pentru un jucător, pentru o tablă individuală.
  
 Predicatul ''​%%bestIndividualMoves/​3%%''​ ordonează mutările disponibile într-o tablă individuală în funcție de prioritatea lor pentru jucătorul curent. Ordinea apriori a mutărilor este cea din lista positions. Două mutări cu prioritate egală își păstrează ordinea apriori. Folosiți pentru sortare ''​%%sortMoves/​2%%''​. Predicatul ''​%%bestIndividualMoves/​3%%''​ ordonează mutările disponibile într-o tablă individuală în funcție de prioritatea lor pentru jucătorul curent. Ordinea apriori a mutărilor este cea din lista positions. Două mutări cu prioritate egală își păstrează ordinea apriori. Folosiți pentru sortare ''​%%sortMoves/​2%%''​.
 +
 +În exemplu, pentru tabla w, cele mai bune mutări sunt, în ordine, ''​%%[c,​ ne, sw, se, n, w, e, s]%%'',​ pentru că:
 +
 +  * oponentul a mutat deja în acea tablă, iar centrul nu e încă ocupat
 +  * apoi, cele 3 colțuri în afară de nw nu sunt ocupate
 +  * apoi mijlocurile laturilor.
  
 Strategia ''​%%narrowGreedy%%''​ va întoarce o mutare bazată pe următorul algoritm: dacă este o singură tablă disponibilă,​ se va alege mutarea cu cea mai mică prioritate (sau prima mutare cu cea mai mică prioritate);​ dacă sunt mai multe table disponibile,​ se alege tabla cu cea mai mică prioritate, și în ea mutarea cu cea mai ică prioritate. Strategia ''​%%narrowGreedy%%''​ va întoarce o mutare bazată pe următorul algoritm: dacă este o singură tablă disponibilă,​ se va alege mutarea cu cea mai mică prioritate (sau prima mutare cu cea mai mică prioritate);​ dacă sunt mai multe table disponibile,​ se alege tabla cu cea mai mică prioritate, și în ea mutarea cu cea mai ică prioritate.
Line 142: Line 150:
   * mutări care nu se încadrează în alte cazuri din această listă, inclusiv cele de mai jos   * mutări care nu se încadrează în alte cazuri din această listă, inclusiv cele de mai jos
   * mutări care duc oponentul într-o tablă în care jucătorul curent este la o mutare de a câștiga   * mutări care duc oponentul într-o tablă în care jucătorul curent este la o mutare de a câștiga
-  * mutări care duc oponentul într-o stare în care oponentul este la o mutare de a câștiga, dar acea mutare duce jucătorul curent într-o tablă în care este la o singură mutare de a câștiga+  * mutări care duc oponentul într-o stare în care oponentul este la o mutare de a câștiga, dar acea mutare duce jucătorul curent într-o tablă în care este la o singură mutare de a câștiga ​sau este deja finalizată
   * mutări care duc oponentul într-o stare în care oponentul este la o mutare de a câștiga, iar acea mutare duce jucătorul curent într-o tablă în care **nu** este la o singură mutare de a câștiga   * mutări care duc oponentul într-o stare în care oponentul este la o mutare de a câștiga, iar acea mutare duce jucătorul curent într-o tablă în care **nu** este la o singură mutare de a câștiga
   * mutări care duc oponentul într-o tablă deja finalizată   * mutări care duc oponentul într-o tablă deja finalizată
Line 148: Line 156:
  
 Predicatul ''​%%bestMoves/​2%%''​ ordonează mutările disponibile în ordinea prezentată mai sus. Pentru stările în care sunt mai multe table disponibile pentru jucătorul curent, mutările vor fi luate apriori (înainte de sortarea după priorități) după ordonearea tablelor individuale conform cu ''​%%bestIndividualMoves/​3%%''​. Predicatul ''​%%bestMoves/​2%%''​ ordonează mutările disponibile în ordinea prezentată mai sus. Pentru stările în care sunt mai multe table disponibile pentru jucătorul curent, mutările vor fi luate apriori (înainte de sortarea după priorități) după ordonearea tablelor individuale conform cu ''​%%bestIndividualMoves/​3%%''​.
 +
 +NOTĂ: când calculați cele mai bune mutări, în moemntul evaluării unei anumite mutări M, atunci când facem referire la ce va face mai departe un alt jucător (sau același jucător), faceți evaluarea pe starea în care mutarea M s-ar fi aplicat deja.
 +
 +În exemplu, pentru x, cele mai bune mutări (după această strategie) sunt, în ordine, ''​%%[sw,​ w, e, s, n, ne, c, se]%%'',​ pentru că:
 +
 +  * sw este un colț, iar acolo oponentul are puține mutări
 +  * în w oponentul are puține mutări
 +  * în e oponentul are puține mutări, dar x are deja o mutare
 +  * în s, oponentul are puține mutări, dar x are deja 2 mutări
 +  * în n, oponentul va câștiga tabla, dar îl trimite pe
 +  * în ne, oponentul va câștiga tabla, iar câștigând nu va duce într-o tablă în care x va câștiga direct
 +  * în c, tabla este deja finalizată
 +  * în se, la fel.
  
 Strategia ''​%%greedy%%''​ va întoarce cea mai bună mutare (prima) din mutările întoarse de ''​%%bestMoves/​2%%''​. Strategia ''​%%greedy%%''​ va întoarce cea mai bună mutare (prima) din mutările întoarse de ''​%%bestMoves/​2%%''​.
 +
 +==== Bonus etapa 2 ====
 +
 +Pentru puncte bonus, implementați cât mai elegant, folosind ''​%%findall%%'',​ ''​%%forall%%'',​ și având reguli diferite doar atunci când este neapărat nevoie (e.g. pentru calculul priorităților pe diferite cazuri).
  
 ==== Hints ==== ==== Hints ====
Line 160: Line 185:
   * se va lucra numai în fișierul ''​%%uttt.pl%%''​   * se va lucra numai în fișierul ''​%%uttt.pl%%''​
   * pentru rularea testelor se va apela predicatul vmcheck/0 (apela de la consolă ca ''​%%vmcheck.%%''​)   * pentru rularea testelor se va apela predicatul vmcheck/0 (apela de la consolă ca ''​%%vmcheck.%%''​)
 +    * puteți apela teste individuale cu ''​%%vmtest(<​nume_test>​)%%'',​ e.g. ''​%%vmtest(narrowGreedy)%%''​
   * pentru rezultate mai detaliate ale testelor, **decomentați** linia ''​%%detailed_mode_disabled :- !, fail.%%''​ din fișierul ''​%%checker.pl%%''​. Modul detaliat (unde este posibil să primiți câteva puncte în plus cu implementările implicite) **nu** este cel folosit pe vmchecker, dar în acest mod testerul oferă mai mult detalii despre testele eșuate.   * pentru rezultate mai detaliate ale testelor, **decomentați** linia ''​%%detailed_mode_disabled :- !, fail.%%''​ din fișierul ''​%%checker.pl%%''​. Modul detaliat (unde este posibil să primiți câteva puncte în plus cu implementările implicite) **nu** este cel folosit pe vmchecker, dar în acest mod testerul oferă mai mult detalii despre testele eșuate.
 +  * în ''​%%input.pl%%''​ există și starea ''​%%uttt(enunt,​ S)%%'',​ care este exemplul de mai sus din acest enunț.
  
 ===== Resurse ===== ===== Resurse =====
Line 179: Line 206:
   * 16.05 - modificare deadline.   * 16.05 - modificare deadline.
   * 18.05 - adăugare la ''​%%printBoards%%''​ (în scheletul pentru etapa 2) a afișării jucătorului curent și a tablelor disponibile pentru următoarea mutare.   * 18.05 - adăugare la ''​%%printBoards%%''​ (în scheletul pentru etapa 2) a afișării jucătorului curent și a tablelor disponibile pentru următoarea mutare.
 +  * 18.05 - corecție teste ''​%%bestIndividualMoves%%''​
 +  * 18.05 - vmchecker etapa 2
 +  * 18.05 - adăugare
 +    * informații bonus etapa 2
 +    * mai multe exemple în enunț
 +    * ''​%%uttt(enunt,​ S)%%''​ în ''​%%input.pl%%''​ și mențiune în enunț
 +    * mențiune tastare teste individuale
 +    * NOTĂ la ''​%%bestMoves%%''​
 +  * 19.05 - pentru prioritate 5 la tabla individuală erau mutările //în colțuri//, nu //în centru//.
 +  * 19.05 - îmbunătățire a testelor pentru movePriority
 +  * 19.05 - îmbunătățire a testelor pentru a reduce diferența dintre modul detaliat și modul nedetaliat (de pe vmchecker) de testare.
 +  * 25.05 - adăugare afișări ajutătoare (comentate) pentru ''​%%play_strategies%%''​ în ''​%%utils.pl%%''​
 +  * 27.05 - acceptare a soluției (c,se) pentru testul greedy|c (vezi [[https://​curs.upb.ro/​2021/​mod/​forum/​discuss.php?​d=15374|această discuție]])
  
  
pp/22/teme/prolog-ultimate-ttt.1652828611.txt.gz · Last modified: 2022/05/18 02:03 by bot.pp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0