Differences

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

Link to this comparison view

pa:laboratoare:laborator-05 [2021/03/08 23:04]
radu.nichita [Aranjamente]
pa:laboratoare:laborator-05 [2024/04/01 14:12] (current)
radu.nichita
Line 1: Line 1:
-====== Laborator 5: Backtracking ====== +====== Laborator 05: Backtracking ====== 
-Responsabili:​ + 
-  * [[neatudarius@gmail.com|Darius-Florentin Neațu (2017-2021)]] +
-  * [[radunichita99@gmail.com | Radu Nichita (2021)]] +
-  * [[cristianolaru99@gmail.com | Cristian Olaru (2021)]] +
-  * [[mirunaelena.banu@gmail.com ​ | Miruna-Elena Banu (2021)]] +
-  * [[maraioana9967@gmail.com | Mara-Ioana Nicolae (2021)]] +
-  * [[stefanpopa2209@gmail.com | Ștefan Popa (2018-2020)]] +
- +
- +
-Autori: +
-  * [[radu.stochitoiu@gmail.com|Radu Stochitoiu (2018)]] +
-  * [[razvan.m.chitu@gmail.com|Razvan Chitu (2018)]] +
 ===== Obiective laborator ===== ===== Obiective laborator =====
   * Întelegerea noțiunilor de bază despre backtracking;​   * Întelegerea noțiunilor de bază despre backtracking;​
Line 32: Line 20:
 ===== Ce este Backtracking?​ ===== ===== Ce este Backtracking?​ =====
 Backtracking este un algoritm care caută **una sau mai multe soluții** pentru o problema, printr-o căutare exhaustiva, mai eficientă însă în general decât o abordare „generează si testează”,​ de tip „forță brută”, deoarece un candidat parțial care nu duce la o soluție este abandonat. Poate fi folosit pentru orice problemă care presupune o căutare în **spațiul stărilor**. Backtracking este un algoritm care caută **una sau mai multe soluții** pentru o problema, printr-o căutare exhaustiva, mai eficientă însă în general decât o abordare „generează si testează”,​ de tip „forță brută”, deoarece un candidat parțial care nu duce la o soluție este abandonat. Poate fi folosit pentru orice problemă care presupune o căutare în **spațiul stărilor**.
-În general, în timp ce cautăm o soluție e posibil să dăm de o înfundătură ​în urma unei alegeri greșite sau să găsim o soluție, dar să dorim să căutăm în continuare alte soluții. În acel moment trebuie să ne întoarcem pe pașii făcuți (**backtrack**) și la un moment dat să luăm altă decizie.+În general, în timp ce cautăm o soluție e posibil să dăm de un deadend ​în urma unei alegeri greșite sau să găsim o soluție, dar să dorim să căutăm în continuare alte soluții. În acel moment trebuie să ne întoarcem pe pașii făcuți (**backtrack**) și la un moment dat să luăm altă decizie.
 Este relativ simplu din punct de vedere conceptual, dar complexitatea algoritmului este exponentială. Este relativ simplu din punct de vedere conceptual, dar complexitatea algoritmului este exponentială.
  
Line 191: Line 179:
 Soluția va avea următoarele complexitati:​ Soluția va avea următoarele complexitati:​
  
-  * complexitate temporala : $T(n)=O(n * n!)=O(n!)$+  * complexitate temporala : $T(n)=O(n * n!)$
      * explicație : Complexitatea generarii permutarilor,​ $O(n!)$, se înmultește cu complexitatea copierii vectorilor soluție si domeniu si a stergerii elementelor din domeniu, $O(n)$      * explicație : Complexitatea generarii permutarilor,​ $O(n!)$, se înmultește cu complexitatea copierii vectorilor soluție si domeniu si a stergerii elementelor din domeniu, $O(n)$
   * complexitate spatiala : $S(n)=O(n^2)$   * complexitate spatiala : $S(n)=O(n^2)$
Line 783: Line 771:
 </​note>​ </​note>​
  
-==== Submultimi ​==== +==== Submulțimi ​==== 
-Fie N un **numar natural strict pozitiv**. Se cere afisarea ​tuturor ​submultimilor multimii ​{1, 2, ..., N}.+Fie N un **număr ​natural strict pozitiv**. Se cere afișarea ​tuturor ​submulțimilor mulțimii ​{1, 2, ..., N}.
  
 <spoiler Exemplu 1> <spoiler Exemplu 1>
Line 790: Line 778:
 Fie N = 4 => M = {1, 2, 3, 4} Fie N = 4 => M = {1, 2, 3, 4}
  
-Solutie+Soluție
-{} - multimea vida+{} - mulțimea vidă
 {1} {1}
 {1, 2} {1, 2}
Line 812: Line 800:
  
 <​note>​ <​note>​
-Se doreste ​o complexitate $T(n) = O(2^n)$.+Se dorește ​o complexitate $T(n) = O(2^n)$.
 </​note>​ </​note>​
  
 <spoiler Hint> <spoiler Hint>
  
-Folositi-va de problema **Combinari**.+Folosiți-vă de problema **Combinari**.
  
 </​spoiler>​ </​spoiler>​
  
 <​note>​ <​note>​
-Solutiile ​se vor genera ​in ordine lexico-grafica!+Soluțiile ​se vor genera ​în ordine lexico-grafica!
  
-Checkerul ​asteapta sa le stocati in aceasta ​ordine.+Checkerul ​așteaptă să le stocați în această ​ordine.
 </​note>​ </​note>​
  
 ==== Problema damelor ==== ==== Problema damelor ====
  
-Problema damelor (sau problema reginelor) ​trateaza ​plasarea a 8 regine de sah pe o tablă de șah de dimensiuni 8 x 8 astfel ​incat sa nu existe ​doua regine care se ameninta ​reciproc. Astfel, se cauta **o solutie** astfel ​incat nicio pereche de doua regine ​sa nu fie pe acelasi rand, pe aceeasi coloana, sau pe aceeasi diagonala. Problema cu opt regine este doar un caz particular pentru problema ​generala, care presupune plasarea a N regine pe o tablă de sah N x N în aceleasi ​conditii. Pentru ​aceasta problema, există ​solutii ​pentru toate numerele naturale N cu excepția lui N = 2 si N = 3.+Problema damelor (sau problema reginelor) ​tratează ​plasarea a 8 regine de sah pe o tablă de șah de dimensiuni 8 x 8 astfel ​încat să nu existe ​două regine care se amenință ​reciproc. Astfel, se caută ​**o soluție** astfel ​încât ​nicio pereche de doua regine ​să nu fie pe același rând, pe aceeași coloană, sau pe aceeași diagonală. Problema cu opt regine este doar un caz particular pentru problema ​generală, care presupune plasarea a N regine pe o tablă de șah N x N în aceleasi ​condiții. Pentru ​această problemă, există ​soluții ​pentru toate numerele naturale N cu excepția lui N = 2 si N = 3.
  
 <spoiler Exemplu 1> <spoiler Exemplu 1>
Line 835: Line 823:
 Fie N = 5 Fie N = 5
  
-Solutie:+Soluție:
  
 |X|-|-|-|-| |X|-|-|-|-|
Line 843: Line 831:
 |-|-|-|X|-| |-|-|-|X|-|
  
-reprezinta ​dama, - reprezinta spatiu ​gol.+reprezintă ​damă, - reprezintă spațiu ​gol.
  
 </​spoiler>​ </​spoiler>​
Line 850: Line 838:
 <spoiler Hint> <spoiler Hint>
  
-E nevoie ​sa facem backtracking pe matrice sau e suficient pe vector?+E nevoie ​să facem backtracking pe matrice sau e suficient pe vector?
  
 </​spoiler>​ </​spoiler>​
Line 857: Line 845:
  
 <​note>​ <​note>​
-Se va cauta singura solutie ​ ​(**oricare** ​solutie corecta), care va fi returnata ​sub format ​unui vector cu $n + 1$ elemente.+Se va caută ​singură soluție ​ ​(**oricare** ​soluție corectă), care va fi returnată ​sub forma unui vector cu $n + 1$ elemente.
  
  
-Solutia ​este $sol[0], sol[1], ..., sol[n]$, unde $sol[i]$ = coloana unde vom plasa regina de pe linia i.+Soluția ​este $sol[0], sol[1], ..., sol[n]$, unde $sol[i]$ = coloana unde vom plasa regina de pe linia i.
  
-Elementul 0 este nefolosit, dorim sa pastram conventia ​cu indexare de la 1.+Elementul 0 este nefolosit, dorim să păstrăm convenția ​cu indexare de la 1.
  
 </​note>​ </​note>​
-==== Generare de siruri ​====+==== Generare de șiruri ​====
  
-Vi se da lista de caractere ​si o lista de frecvente ​(pentru caracterul de pe +Vi se dă listă ​de caractere ​și o lista de frecvențe ​(pentru caracterul de pe 
-pozitia ​i, frecventa ​de pe pozitia ​i). Vi se cere sa generati ​toate sirurile +poziția ​i, frecvența ​de pe poziția ​i). Vi se cere să generați ​toate șirurile 
-care se pot forma cu aceste caractere ​si aceste ​frecvente stiind ca nu pot fi +care se pot forma cu aceste caractere ​și aceste ​frecvențe știind că nu pot fi 
-mai mult de K aparitii ​consecutive ale aceluiasi ​caracter.+mai mult de K apariții ​consecutive ale aceluiași ​caracter.
  
 <spoiler Exemplu 1> <spoiler Exemplu 1>
Line 876: Line 864:
 Fie caractere[] = {'​a',​ '​b',​ '​c'​},​ freq[] = {1, 1, 2}, K = 5 Fie caractere[] = {'​a',​ '​b',​ '​c'​},​ freq[] = {1, 1, 2}, K = 5
  
-Solutie:+Soluție:
   * abcc   * abcc
   * acbc   * acbc
Line 909: Line 897:
  
 <​note>​ <​note>​
-Solutiile ​se vor genera ​in ordine lexico-grafica!+Soluțiile ​se vor genera ​în ordine lexico-grafica!
  
-Checkerul ​asteapta sa le stocati in aceasta ​ordine.+Checkerul ​așteaptă să le stocați în această ​ordine.
 </​note>​ </​note>​
 ===== Bonus ===== ===== Bonus =====
Line 917: Line 905:
 ==== Problema damelor (AC3) ==== ==== Problema damelor (AC3) ====
  
-**Aplicati ​AC3 pe problema damelor.**+**Aplicați ​AC3 pe problema damelor.**
  
-Algoritmul AC-3 (Arc Consistency Algorithm) este de obicei folosit ​in probleme de satisfacere a constrangerilor ​(CSP). Acesta ​sterge ​arcele din arborele de stari care sigur nu se vor folosi niciodata.+Algoritmul AC-3 (Arc Consistency Algorithm) este de obicei folosit ​în probleme de satisfacere a constrângerilor ​(CSP). Acesta ​șterge ​arcele din arborele de stări ​care sigur nu se vor folosi niciodata.
  
-AC-3 lucreaza ​cu: +AC-3 lucrează ​cu: 
-    * constrangeri+    * constrângeri
     * variabile     * variabile
     * domenii de variabile     * domenii de variabile
  
-variabila ​poate lua orice valoare din domeniul ​sau la orice pas. O constrangere ​este o relatie ​sau o limitare a unor variabile.+variabilă ​poate lua orice valoare din domeniul ​său la orice pas. O constrângere ​este o relație ​sau o limitare a unor variabile.
  
 === Exemplu AC-3 === === Exemplu AC-3 ===
  
-Consideram ​A, o variabila ​ce are domeniul D(A) = {0, 1, 2, 3, 4, 5, 6} si B o variabila ce are domeniul D(B) = {0, 1, 2, 3, 4}. Cunoastem constrangerile: C1 = "A trebuie ​sa fie impar" ​si C2 = "A + B trebuie ​sa fie egal cu 5".+Considerăm ​A, o variabilă ​ce are domeniul D(A) = {0, 1, 2, 3, 4, 5, 6} și B o variabila ce are domeniul D(B) = {0, 1, 2, 3, 4}. Cunoaștem constrângerile: C1 = "A trebuie ​să fie impar" ​și C2 = "A + B trebuie ​să fie egal cu 5".
  
-Algoritmul AC-3 va elimina ​in primul ​rand toate valorile pare ale lui A pentru a respecta C1 => D(A) = {1, 3, 5}. Apoi, va incerca sa satisfaca ​C2, asa ca va pastra in domeniul lui B toate valorile care adunate cu valori din D(A) pot da 5 => D(B) = {0, 2, 4}.+Algoritmul AC-3 va elimina ​în primul ​rând toate valorile pare ale lui A pentru a respecta C1 => D(A) = {1, 3, 5}. Apoi, va încerca să satisfacă ​C2, așa că va păstra în domeniul lui B toate valorile care adunate cu valori din D(A) pot da 5 => D(B) = {0, 2, 4}.
  
-AC-3 a redus astfel domeniile lui A si B, reducand ​semnificativ timpul folosit de algoritmul backtracking.+AC-3 a redus astfel domeniile lui A si B, reducând ​semnificativ timpul folosit de algoritmul backtracking.
  
 ===== Extra ===== ===== Extra =====
Line 945: Line 933:
 </​spoiler>​ </​spoiler>​
  
-==== Ultimate Tic Tac Toe ==== 
- 
-[[http://​theaigames.com/​competitions/​ultimate-tic-tac-toe | The AI Games - Ultimate Tic Tac Toe]] 
  
  
 +<spoiler Backtracking problems>​
 +Articolul de pe [[https://​leetcode.com/​tag/​backtracking/​| leetcode]] conține o listă cu diverse tipuri de probleme de programare dinamică, din toate categoriile discutate la PA (plus multe altele).
 +</​spoiler>​
  
 ===== Referințe ===== ===== Referințe =====
  
 [0] Chapter **Backtracking**,​ “Introduction to Algorithms”,​ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein [0] Chapter **Backtracking**,​ “Introduction to Algorithms”,​ Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein
pa/laboratoare/laborator-05.1615237449.txt.gz · Last modified: 2021/03/08 23:04 by radu.nichita
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