Sunteți pe pagina 1din 16

GRUPUL COLAR INDUSTRIAL DE CHIMIE

C.D. NENIESCU
CRAIOVA

LUCRARE DE DIPLOM

PROFESOR:
TOADER ELENA

NICOLA LILIANA IONICA


CLASA a XII a F

2004

TEMA LUCRRII:
COLORAREA HRILOR FOLOSIND METODA BACKTRACKING

Motivul alegerii acestei teme este:


Studierea si aprofundarea rezolvarii problemelor prin
metoda backtracking.

CUPRINS:

1. METODA BACKTRACKING

2. APLICAII REZOLVATE

3. PROBLEMA COLORRII HRILOR

13

METODA BACKTRACKING
NOIUNI GENERALE

La dispoziia celor care rezolv probleme cu ajutorul calculatorului exist mai


multe metode . Dintre acestea cel mai des utilizate sunt:
- metoda Greedy;
- metoda Divide et impera;
- metoda Branch and Bound;
- metoda Backtracking;
Metoda Backtracking se aplic problemelor n care soluia poate fi
reprezentat sub forma unui vector x = (x1, x2, x3, xk, xn) S, unde S este
mulimea soluiilor problemei i S = S1 x S2 x x Sn, i Si sunt mulimi finite
avnd s elemente si xi si , ()i = 1..n.
Pentru fiecare problem se dau relaii ntre componentele vectorului x, care
sunt numite condiii interne; soluiile posibile care satisfac condiiile interne se
numesc soluii rezultat. Metoda de generare a tuturor soluiilor posibile si apoi de
determinare a soluiilor rezultat prin verificarea ndeplinirii condiiilor interne
necesit foarte mult timp.
Metoda backtracking evit aceast generare i este mai eficient.
Elementele vectorului x, primesc pe rnd valori n ordinea cresctoare a indicilor,
x[k] va primi o valoare numai daca au fost atribuite valori elementelor x1.. x[k-1].
La atribuirea valorii lui x[k] se verifica ndeplinirea unor condiii de continuare
referitoare la x1x[k-1]. Daca aceste condiii nu sunt ndeplinite, la pasul k, acest
lucru nseamn ca orice valori i-am atribui lui x[k+1], x[k+1], .. x[n] nu se va
ajunge la o soluie rezultat.

Metoda backtracking construiete un vector soluie n mod progresiv


ncepnd cu prima component a vectorului i mergnd spre ultima cu eventuale
reveniri asupra atribuirilor anterioare.
Metoda se aplica astfel :
1) se alege prima valoare sin S1 si I se atribuie lui x1 ;
2) se presupun generate elementele x1x[k-1], cu valori din S1..S[k-1]; pentru
generarea lui x[k] se alege primul element din S[k] disponibil si pentru
valoarea aleasa se testeaz ndeplinirea condiiilor de continuare.
Pot aprea urmtoarele situaii :
a) x[k] ndeplinete condiiile de continuare. Daca s-a ajuns la soluia
final (k = n) atunci se afieaz soluia obinut. Daca nu s-a ajuns la
soluia final se trece la generarea elementului urmtor x [k-1];
b) x[k] nu ndeplinete condiiile de continuare. Se ncearc urmtoarea
valoare disponibila din S[k]. Daca nu se gsete nici o valoare n S[k]
care s ndeplineasc condiiile de continuare, se revine la elementul
x[k-1] i se reia algoritmul pentru o nou valoare a acestuia. Algoritmul
se ncheie cnd au fost luate in considerare toate elementele lui S1.
Problemele rezolvate prin aceast metod necesit timp mare de execuie, de
aceea este indicat sa se foloseasc metoda numai daca nu avem alt algoritm de
rezolvare.
Dac mulimile S1,S2,Sn au acelai numr k de elemente, timpul necesar
de execuie al algoritmului este k la n. Dac mulimile S1, S2.. Sn nu au acelai
numr de elemente, atunci se noteaz cu m minimul cardinalelor mulimilor S1
Sn si cu M, maximul. Timpul de execuie este situat n intervalul [m la n .. M la
n]. Metoda backtracking are complexitatea exponenial, in cele mai multe cazuri
fiind ineficient. Ea insa nu poate fi nlocuit cu alte variante de rezolvare mai
rapide n situaia n care se cere determinarea tuturor soluiilor unei probleme.

APLICAII REZOLVATE
Exemple:
Generarea permutrilor. Se citete un numr natural n. S se genereze toate
permutrile mulimii {1, 2, 3, ,n}.
Generarea permutrilor se va face innd cont c orice permutare va fi
alctuit din elemente distincte ale mulimii A. Din acest motiv, la generarea unei
permutri, vom urmri ca numerele s fie distincte.
Prezentm algoritmul corespunztor cazului n=3:

1
1

2
1

1
2
1

3
1

1
3
1

2
3
1

3
3
1

1
1
2

2
1
2

3
1
2

2
2

2
2
1

3
2
1

1
2

3
2

1
3
2

se ncarc n stiv pe nivelul 1 valoarea 1;


ncrcarea valorii 1 pe nivelul al 2-lea nu este posibil, ntruct aceast
valoare se gsete i pe nivelul 1 al stivei;
ncrcarea valorii 2 pe nivelul al 2-lea este posibil, deoarece aceast
valoare nu mai este ntlnit;
valoarea 1 din nivelul al 3-lea se regsete pe nivelul 1;
valoarea 2 din nivelul al 3-lea se regsete pe nivelul al 2-lea;
valoarea 3 pe nivelul al 3-lea nu e ntlnit pe nivelurile anterioare;
ntruct nivelul 3 este completat corect. Tiprim: 1 2 3

Algoritmul continu pn cnd stiva devine vid.


6

Problema celor n dame. Fiind dat o tabl de ah nn se cer toate soluiile


de aranjare a n dame, astfel nct s nu se afle dou dame pe aceeai linie, coloan
sau diagonal (damele s nu se atace reciproc).
Exemplu: Presupunnd c dispunem de o tabl de dimensiune 44, o soluie
ar fi urmtoarea:
D
D
D
D
Cum procedm? Observm c o dam trebuie s fie plasat singur pe linie.
Plasm prima dam pe linia 1 coloana 1.
D

A doua dam nu poate fi aezat dect pe coloana a 3-a.


D
D

Observm c a treia dam nu poate fi plasat n linia a 3-a. ncercm atunci


plasarea celei de-a doua dame n coloana a 4-a.
D
D

A treia dam nu poate fi plasat dect pe coloana a 2-a.


D
D
D

n aceast situaie dama a patra nu mai poate fi aezat. ncercnd s avansm


cu dama a treia, observm c nu este posibil s o plasm nici n coloana a treia, nici
n coloana a patra, deci o vom scoate de pe tabl. Dama a doua nu mai poate avansa,
deci i ea este scoas de pe tabl. Avansm cu prima dam n coloana a doua.
D

A doua dam nu poate fi aezat dect n coloana a patra.


D
D

Dama a treia se aeaz n prima coloan.


D
D
D

Acum este posibil s plasm a patra dam n coloana a treia i astfel am


obinut o soluie a problemei.

D
8

D
D
D
Algoritmul continu n acest mod pn cnd trebuie scoas de pe tabl prima
dam.
Pentru prezentarea unei soluii putem folosi un vector cu n componente
(avnd n vedere c pe fiecare linie se gsete o singur dam). Exemplu: pentru
soluia gsit avem vectorul st ce poate fi asimilat unei stive.
Dou dame se gsesc pe aceeai diagonal dac i numai dac este ndeplinit
condiia. |st (i) st (j)| = |i-j| : (diferena, n modul, ntre linii i coloane este
aceeai).
3

ST (4)

ST (3)

ST (2)

ST (1)

n general ST(i) = k semnific


faptul c pe linia i dama ocup
poziia k.

Exemplu: n tabla 44 avem situaia:


D
St (1) = 1 i = 1;
St (3) = 1 j = 3;
| St (1) st (3) | = |1 3| = 2
|i j| = |1 3| = 2

Sau situaia:
D
St (1) = 3 i = 1;
St (3) = 1 j = 3;
| St (i) st (j) | = |3 1| = 2
|i j| = |3 1| = 2

ntruct dou dame nu se pot gsi pe aceeai coloan, rezult c o soluie este
sub form de permutare. O prim idee ne conduce la generarea tuturor permutrilor
i la extragerea soluiilor pentru problem (ca dou dame s nu fie plasate n aceeai
diagonal). A proceda astfel, nseamn s lucr conform strategiei backtracking.
Aceasta presupune ca imediat ce am gsit dou dame care se atac, s relum
cutarea. Fa de programul de generare a tuturor soluiilor problemei celor n dame,
are o singur condiie suplimentar, n procedura valid.
Produsul cartezian a n mulimi. Se dau mulimile de mai jos i se cere
produsul cartezian al lor.
A1 = {1, 2, 3, , k1}
A2 = {1, 2, 3, , k2}

An = {1, 2, 3, , kn}
Exemplu:

A1 = {1, 2}
A2 = {1, 2, 3}
A3 = {1, 2, 3}

A1 A2 A3 = {(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3,
1), (1, 3, 2), (1, 3, 3), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3,
1), (2, 3, 2), (2, 3, 3)}.
Pentru rezolvare, se folosesc stiva ST i un vector A ce reine numerele k 1, k2,
kn. Utilizm metoda backtracking, uor modificat din urmtoarele motive:
a) Orice element aflat la nivelul k al stivei este valid, motiv pentru care
procedura valid nu face altceva dect s atribuie variabilei ev valoarea
TRUE.
b) Limita superioar pe nivelul k al stivei este dat de A(k).
Modul de concepere a algoritmului rezult din cele ce urmeaz:

10

Observaii:
Algoritmul prezentat aici este de tip backtracking? ntrebarea are sens
pentru c este absent mecanismul de ntoarcere. Vom admite c i aceasta
este backtracking, dar degenerat.
Generarea aranjamentelor. Se citesc n i p. S se genereze toate
aranjamentele de n luate cte p.
Din analiza problemei rezult urmtoarele:
stiva are nlimea p;
fiecare nivel ia valori ntre 1 i n;
elementele plasate pe diverse niveluri trebuie s fie distincte.
Algoritmul este asemntor cu cel de la permutri, cu deosebirea c aici stipa
are nlimea p.
Generarea combinrilor. Se citesc n i p numere naturale, np. Se cere s se
genereze toate submulimile cu p elemente ale mulimii {1, 2, 3, , n}.
Pentru rezolvarea problemei trebuie inut cont de urmtoarele:
stiva are nlimea p;
elementele aflate pe niveluri diferite ale stivei trebuie s fie distincte;
pentru a evita repetiia elementele se aeaz n ordine cresctoare: pe nivelul
k se va afla o valoare mai mare dect pe nivelul k-1 i mai mic sau egal cu n-p+k.
Problema comis-voiajorului. Un comis voiajor trebuie s viziteze un numr
n de orae. Iniial, el se afl ntr-unul dintre ele, notat 1. Comis voiajorul dorete
s nu treac de dou ori prin acelai ora, iar la ntoarcere s revin n oraul 1.
Cunoscnd legturile existente ntre orae, se cere s se tipreasc toate drumurile
posibile pe care le poate efectua comis voiajorul.
Exemplu: n figura alturat sunt simbolizate cele 6 orae, precum i
drumurile existente ntre ele.
11

Comis voiajorul are urmtoarele posibiliti de parcurgere:


1, 2, 3, 4, 5, 6, 1;
1, 2, 5, 4, 3, 6, 1;
1, 6, 3, 4, 5, 2, 1;
1, 6, 5, 4, 3, 2, 1;
Legturile existente ntre orae sunt date n matricea An,n. Elementele matricei
A pot fi 0 sau 1 (matricea este binar).
1, dac exist drum ntre oraele i i j;
A(i,j) =
0,

altfel

Se observ c A(i,j) = A(j,i), oricare ar fi i,j {1, 2, 3, , n} matricea este


simetric.
Pentru rezolvarea problemei folosim stiva st. la baza stivei (nivelul 1) se
ncarc numrul 1. Prezentm n continuare modul de rezolvare a problemei.
2
1

De la oraul 1 la oraul 2 exist drum, deci se va urca n stiv;

2
2
1

Oraul 2 se mai gsete n stiv, deci nu este acceptat;

3
2
1

De la oraul 2 la oraul 3 se gsete drum; prin oraul 3 nu s-a mai


trecut, deci oraul 3 este acceptat.

Algoritmul continu n acest mod pn se ajunge din nou la nivelul 1, caz n


care algoritmul se ncheie.
12

Un succesor, ntre 2 i n, aflat pe nivelul k al stivei, este considerat valid dac


sunt ndeplinite urmtoarele condiii:
nu s-a mai trecut prin oraul simbolizat de succesor, deci acesta nu se
regsete n stiv;
exist drum ntre oraul aflat la nivelul k-1 i cel aflat la nivelul k;
dac succesorul se gsete la nivelul n, s existe drum de la el la oraul 1.
Observaii:
1.

Problemele rezolvate prin aceast metod necesit un timp


ndelungat de execuie. Din acest motiv este bine s utilizm metoda
atunci numai atunci cnd nu mai avem la dispoziie un alt algoritm
mai eficient

2.

Menionm

c nu exist probleme pentru care nu se cunosc

algoritmi eficieni de rezolvare, deci backtracking este indicat.


3.

Rezolvarea iterativ ncalc principiul stivei atunci cnd verificm


condiiile de continuare, sau atunci cnd tiprim soluia gsit,
pentru c accesm orice nivel al stivei. Consider c o structur
trebuie folosit ca atare atunci cnd este strict necesar. De exemplu,
chiar i segmentul de stiv al calculatorului poate fi accesat oriunde.
Asta nu nseamn c acolo nu se utilizeaz din plin mecanismul
stivei.

13

PROBLEMA COLORRII HARILOR


Enun:
Fiind dat o hart nu n ri, se cer toate soluiile de colorare a hrii,
utiliznd cel mult patru culori, astfel nct dou ri de frontier comun s fie
colorate diferit. Este demonstrat faptul c sunt suficiente numai patru culori pentru
ca orice hart s poat fi colorat.
Rezolvare:
Pentru exemplificare, vom considera urmtoarea hart unde rile sunt
numerotate cu cifre cuprinse ntre 1 i 5:
1
4
2

O soluie a acestei probleme este urmtoarea:


ara 1 culoarea 1
ara 2 culoarea 2
ara 3 culoarea 1;
ara 4 culoarea 3;
ara 5 culoarea 4;
Harta este furnizat programului cu ajutorul unei matrice An,n
1, dac ara i se nvecineaz cu ara j;
A(i,j) =
0,

altfel

Matricea A este simetric. Pentru rezolvarea problemei se utilizeaz stiva st,


unde nivelul k al stivei simbolizeaz ara k, iar st[k] culoarea ataat rii k. Stiva
are nlimea n i pe fiecare nivel ia valori ntre 1 i 4.
14

Rezolvare PASCAL:
Program colorarea_hartilor;
Type
stiva = array [1100] of integer;
var
st : stiva;
i, j, n, k : integer;
as, ev : boolean;
a: array [1..20,1..20] of integer;
procedure init(k:integer; var st:stiva);
begin
st[k]:=0;
end;
procedure succesor(var as:boolean; var st:stiva; k:integer);
begin
if st[k] < 4
then
begin
st[k]:=st[k]+1;
as:true
end
else
as:false
end;
procedure valid (var ev:boolean; st:stiva; k:integer);
var
i:integer;
begin
ev:true;
for i:=1 to k-1 do
if (st[i]=st[k]) and (a[i,k]=1)
then
ev:false
end;
function solutie(k:integer):integer;
begin
solutie:=(k=n);
end;
15

procedure tipar;
var
i:integer;
begin
for i:= 1 to n do
writeln(Tara =, i,; culoarea=,st[i]);
writeln(===================);
end;
begin
write(Numarul de tari = );
readln(n);
for i:= 1 to n do
for j:=1 to i-1 do
begin
write(a[,i,,,j,]=);
readln(a[i,j])
end;
k:=1;
init(k,st);
while k>0 do
begin
repeat
succesor(as,st,k);
if as
then
valid(ev,st,k);
until (not as) or (as and ev);
if as
then
if solutie (k)
then
tipar
else
begin
k:=k+1;
init(k,st)
end
else
k:=k-1
end
end.

16

S-ar putea să vă placă și