This shows you the differences between two versions of the page.
pa:laboratoare:laborator-05 [2021/03/08 23:12] radu.nichita [Problema damelor] |
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 829: | Line 817: | ||
==== Problema damelor ==== | ==== Problema damelor ==== | ||
- | 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 solutie** 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. | + | 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 865: | Line 853: | ||
</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 |