Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Algoritmi i tehnici de
programare
Cursul 12
Greedy
Backtracking
cutare complet
Spaiul soluiilor
Fie mulimile , = 1, ,
ordine pe
card( ) = , o relaie de
= 1 2 = = 1 , 2 , , | spaiul
soluiilor
: ,
= | =
=
funcie de validare
mulimea soluiilor rezultat
Este folosit atunci cnd gsirea celei mai bune soluii este
prea costisitoare.
care
menine
{} este acceptabil?
= {}
Algoritm general
Problema rucsacului
Problema paznicului
Algoritmul Dijkstra
= 1 , 2 , , , , = 1,
=
- condiii de continuare
iniializare , , ,
= , = ,
//construire configuraie iniial
k=
ct timp >
//ct timp configuraia nu e final
Dac k== +
//configuraie de tip soluie?
reine soluia = , , ,
k=
//revenire dup construirea unei soluii
altfel
dac
//mai snt valori neconsumate
alege o valoare
=
dac ( , , , , ) satisfac condiiile de continuare
=
//atribuie i avanseaz
=+
altfel
//revenire
=
=
=
=
//primul element minus raia, de multe ori 0=1-1
ct timp >
=
//variabila de impas
ct timp < i ==
//alegerea unei noi valori pentru
= +
//urmtorul termen n progresie
posibil( ,vb)
//snt ndeplinite condiiile de continuare
dac ==
//impas => revenire
=
altfel
dac ==
dac condiii_finale(x)
//configuraie soluie?
reine_soluia = , , ,
altfel
//avans
=+
=
retine_solutia();
altfel
pentru fiecare element j din Si
x[i]=j;
daca posibil(i)
backtracking(i+1);
Exemple de
backtracking:
probleme
care
se
rezolv
prin
metoda
void backtracking()
else
{
if (st[k]<n)
k=0;
{
init();
st[k]=st[k]+1;
while (k>=0)
if (valid(k)) k++;
if (k==n)
}
{
else
nrsol++;
{
printf("Solutia cu nr: %d \n",nrsol);
st[k]=0;
tipar();
k--;
printf("\n");
}
k--;
}
}
void init()
{
for (i=0;i<n;i++)
st[i]=0;
}
void tipar()
{
for (i=0;i<n;i++)
printf("st[%d]=%d ",i,st[i]);
}
int valid(int k)
{
for (int i=0;i<k;i++)
if (st[i]==st[k]) return 0;
return 1;
}
void main()
{
printf("n=");
scanf("%d",&n);
back();
printf("\n");
printf("nrsol =%d",nrsol);
}