Documente Academic
Documente Profesional
Documente Cultură
Algoritmi și tehnici de
programare
Cursul 8
+
◼ Dacă lui xk i s-a atribuit o valoare, nu se trece direct la atribuirea de valori lui
xk+1, ci se verifică daca sunt indeplinite condiţii de continuare, referitoare
la x1, x2,...xk-1 xk.
◼ 𝑋 = 𝑥1 , 𝑥2 , … , 𝑥𝑛 , 𝑥𝑖 ∈ 𝑆𝑖 , 𝑖 = 1, 𝑛
◼ 𝜑 𝑥 = 𝑑𝑎
◼ 𝜑𝑘 - condiții de continuare
◼ Configurație curentă
𝒗𝟏 … 𝒗𝒊−𝟏 𝒙𝒊 … 𝒙𝒏
𝑪𝟏 … 𝑪𝒊−𝟏 𝑪𝒊 ∅ ∅
◼ Configurație inițială
𝒙 … 𝒙𝒏
ቤ 𝟏
∅ ∅ ∅
◼ Configurație soluție
𝒗𝟏 … 𝒗𝒏
𝑪𝟏 … 𝑪𝒏 ฬ
◼ Configurație finală
𝒙𝟏 … 𝒙𝒏
ቤ𝑺 ∅ ∅
𝟏
◼ Rezolvare problemă:
◼ Configurație inițială → configurație soluție →…→configurație soluție → configurație finală
+
Backtracking - operații
◼ Atribuie și avansează
… 𝑣𝑖−1 𝑥𝑖 𝑥𝑖+1 … … 𝑣𝑖−1 𝑣𝑖 𝑥𝑖+1 …
… 𝐶𝑖−1 𝐶𝑖 ∅ … → … 𝐶𝑖−1 𝐶𝑖 ∪ 𝑣𝑖 ∅ …
◼ Încercare eșuată
… 𝑣𝑖−1 𝑥𝑖 𝑥𝑖+1 … … 𝑣𝑖−1 𝑥𝑖 𝑥𝑖+1 …
… 𝐶𝑖−1 𝐶𝑖 ∅ … === … 𝐶𝑖−1 𝐶𝑖 ∪ 𝑣𝑖 ∅ …
◼ Revenire
… 𝑣𝑖−1 𝑥𝑖 𝑥𝑖+1 … … 𝑣𝑖−2 𝑥𝑖−1 𝑥𝑖 …
… 𝐶𝑖−1 𝑆𝑖 ∅ … ← … 𝐶𝑖−2 𝐶𝑖−1 ∅ …
Magazinul are:
5 etaje
◼ La etajul 1 are 10 raioane cu pantofi
◼ La etajul 2 are 10 raioane cu ciorapi
◼ La etajul 3 are 10 raioane cu pantaloni
◼ La etajul 4 are 10 raioane cu cămăși
◼ La etajul 5 are 10 raioane cu cravate
+ Exemplu
◼ Deoarece soluţia are mai multe componente, 5 – câte etaje are magazinul,
putem folosi metoda Backtracking. Pentru rezolvare vom folosi:
altfel
ne întrebăm dacă mai sunt raioane pe etajul k
dacă da, atunci
se verifică dacă ne convine ce conţine raionul
dacă am găsit atunci se merge la etajul următor
altfel
se coboară la etajul de jos
+ Exemplu
k=1; (se pleacă de la primul etaj)
st[k]=0; (din faţa uşii)
while (k>0) (atâta timp cât încă ne aflăm la un etaj , k)
{
if(k==6) (dacă le-am luat pe toate atunci)
{
tipar() (se afişează)
k=k-1; (se coboară la etajul de jos)
}
altfel
{
if (st[k]<10) ne întrebăm dacă mai sunt raioane pe etajul k
dacă da, atunci
st[k]=st[k]+1;
if valid() (se verifică dacă ne convine ce conţine raionul care urmează)
k=k+1; (se merge la etajul următor)
else (altfel)
{
st[k]=0;
k=k-1; (se coboară la etajul de jos)
}
}
+
Realizarea funcţiei de initializare
void init()
for (i=0;i<5;i++)
st[i]=0;
}
+
Realizarea funcţiei de validare
// nu există condiţii
între componentele
vectorului
+
Realizarea funcţiei de afişare
void tipar(int k)
int i;
for(i=0;i<k;i++)
printf("\nst[%d]=%d\n", i, st[i]);
Afişarea rezultatului
+ Exemplu
if(k==m)
+
Comentarii
int valid()
{
int ev;
ev=1;
return ev;
}
+
Comentarii
int valid(int k)
{
int i,ev;
ev=1;
for(i=0;i<=k-1;i++)
if(!(st[k]!=st[i]))
ev=0;
st[k] nu este diferit de st[i]
return ev;
}
+ Backtracking
}
+ Backtracking
Aranjamente
void back(int m, int n, int st[], int *nrsol) else
{ int k; if (st[k]<n)
k=0; {
init(n,st); st[k]=st[k]+1;
while (k>=0) if (valid(k,st)) k++;
if (k==m)
}
{
else
(*nrsol)++;
{
printf("Solutia cu nr: %d \n",*nrsol);
st[k]=0;
tipar(m,st);
k--;
printf("\n");
k--; }
} }
+ Backtracking
Combinari