This shows you the differences between two versions of the page.
pa:laboratoare:laborator-05 [2021/03/08 22:58] radu.nichita [Exercitii] |
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 752: | Line 740: | ||
</note> | </note> | ||
==== Aranjamente ==== | ==== Aranjamente ==== | ||
- | Fie N si K doua **numere naturale strict pozitive**. Se cere afisarea tuturor aranjamentelor de N elemente luate cate K din multimea {1, 2, ..., N}. | + | Fie N și K două **numere naturale strict pozitive**. Se cere afișarea tuturor aranjamentelor de N elemente luate cate K din mulțimea {1, 2, ..., N}. |
<spoiler Exemplu 1> | <spoiler Exemplu 1> | ||
Line 758: | Line 746: | ||
Fie N = 3, K = 2 => M = {1, 2, 3} | Fie N = 3, K = 2 => M = {1, 2, 3} | ||
- | Solutie: | + | Soluție: |
* {1, 2} | * {1, 2} | ||
* {1, 3} | * {1, 3} | ||
Line 769: | Line 757: | ||
<note> | <note> | ||
- | Se doreste o complexitate $T(n, k) = A(n,k)$. | + | Se dorește o complexitate $T(n, k) = A(n,k)$. |
</note> | </note> | ||
<spoiler Hint> | <spoiler Hint> | ||
- | Folositi-va de problema **Permutari**. | + | Folosiți-vă de problema **Permutări**. |
</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> | ||
- | ==== 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|-| | ||
- | X reprezinta o dama, - reprezinta spatiu gol. | + | X reprezintă o 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 o singura solutie (**oricare** solutie corecta), care va fi returnata sub format unui vector cu $n + 1$ elemente. | + | Se va caută o 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 o lista de caractere si o lista de frecvente (pentru caracterul de pe | + | Vi se dă o 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 | ||
- | O variabila poate lua orice valoare din domeniul sau la orice pas. O constrangere este o relatie sau o limitare a unor variabile. | + | O 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 |