You are on page 1of 29

THIT K GII THUT Ni dung ca chng ny trnh by hai chin lc thit k thut gii thng dng l vt cn v tham lam.

Ni dung ca chng, ngoi phn trnh by v cc phng php cn c nhng v d c th, c thut gii v ci t, ngi c c mt ci nhn chi tit v vic t thut ton n chng trnh. 1. Vt cn (Exhausted search) Vt cn, duyt, quay lui l mt s tn gi tuy khng ng ngha nhng cng ch mt phng php rt n gin trong tin hc: tm nghim ca mt bi ton bng cch xem xt tt c cc phng n c th. i vi con ngi phng php ny thng l khng kh thi v s phng n cn kim tra qu ln. Tuy nhin i vi my tnh, nh tc x l nhanh, my tnh c th gii rt nhiu bi ton bng phng php vt cn. u im ln nht ca phng php vt cn l lun m bo tm ra nghim chnh xc. Ngoi ra phng php vt cn cn c mt s u im so vi cc phng php khc l i hi rt t b nh v ci t n gin. Hn ch duy nht ca phng php ny l thi gian thc thi rt ln, phc tp thng bc m. Do vt cn thng ch p dng tt vi cc bi ton c kch thc nh. 1.1. Bi ton tm cu hnh t hp Thng nhng bi ton trong Tin hc c yu cu dng: tm cc i tng x tho mn nhng iu kin nht nh trong mt tp S cc i tng cho trc. Bi ton tm cu hnh t hp l bi ton yu cu tm cc i tng x c dng l mt vector tho mn cc iu kin sau: 1. i tng x gm n phn t: x = (x1,x2,xn). 2. Mi phn t xi c th nhn mt trong cc gi tr ri rc a1, a2, am. 3. x tho mn cc rng buc c th cho bi hm logic G(x). Tu tng trng hp m bi ton c th yu cu: tm mt nghim, tm tt c nghim hoc m s nghim. Trc ht chng ta nhc li mt s cu hnh t hp c bn. a) T hp Mt t hp chp k ca n l mt tp con k phn t ca tp n phn t. Chng hn tp {1,2,3,4} c cc t hp chp 2 l: {1,2}, {1,3, {1,4, {2,3}, {2,4}, {3,4}. V trong tp hp cc phn t khng phn bit th t nn tp {1,2} cng l tp {2,1} v do , ta coi chng ch l mt t hp.

Bi ton t ra cho chng ta l hy xc nh tt c cc t hp chp k ca tp n phn t. n gin ta ch xt bi ton tm cc t hp ca tp cc s nguyn t 1 n n. i vi mt tp hu hn bt k, bng cch nh s th t ca cc phn t, ta cng a c v bi ton i vi tp cc s nguyn t 1 n n. Nghim cn tm ca bi ton tm cc t hp chp k ca n phn t phi tho mn cc iu kin sau: 1. L mt vector x =(x1,x2,xk) 2. xi ly gi tr trong tp {1,2,n} 3. Rng buc: xi<xi+1 vi mi gi tr i t 1 n k-1. C rng buc 3 l v tp hp khng phn bit th t phn t nn ta sp xp cc phn t theo th t tng dn. b) Chnh hp lp Chnh hp lp chp k ca n l mt dy k thnh phn, mi thnh phn l mt phn t ca tp n phn t, c xt n th t v khng yu cu cc thnh phn khc nhau. Mt v d d thy nht ca chnh hp lp l cc dy nh phn. Mt dy nh phn di m l mt chnh hp lp chp m ca tp 2 phn t {0,1}. Chng hn 101 l mt dy nh phn di 3. Ngoi ra ta cn c 7 dy nh phn di 3 na l 000, 001, 010, 011, 100, 110, 111. V c xt th t nn dy 101 v dy 011 l 2 dy khc nhau. Nh vy, bi ton xc nh tt c cc chnh hp lp chp k ca tp n phn t yu cu tm cc nghim nh sau: 1. L mt vector x =(x1,x2,xk) 2. xi ly gi tr trong tp {1,2,n} 3. Khng c rng buc no gia cc thnh phn. Ch l cng nh bi ton tm t hp, ta ch xt i vi tp n s nguyn t 1 n n. Nu tp hp cn tm chnh hp khng phi l tp cc s nguyn t 1 n n th ta c th nh s cc phn t ca tp a v tp cc s nguyn t 1 n n c) Chnh hp khng lp Khc vi chnh hp lp l cc thnh phn c php lp li, tc l c th ging nhau, chnh hp khng lp chp k ca tp n phn t cng l mt dy k thnh phn ly t tp n phn t c xt th t nhng cc thnh phn khng c php ging nhau.

Chng hn c n ngi, mt cch chn ra k ngi xp thnh mt hng l mt chnh hp khng lp chp k ca n. Mt trng hp c bit ca chnh hp khng lp l hon v. Hon v ca mt tp n phn t l mt chnh hp khng lp chp n. Ni mt cch trc quan th hon v ca tp n phn t l php thay i v tr ca cc phn t (do mi gi l hon v). Nghim ca bi ton tm cc chnh hp khng lp chp k ca tp n s nguyn t 1 n n l cc vector x tho mn cc iu kin: 1. x c k thnh phn: x = (x1,x2,xk) 2. Cc gi tr xi ly trong tp {1,2,..n} 3. Rng buc: cc gi tr xi i mt khc nhau, tc l xixj vi mi ij. l mt s bi ton tm cu hnh t hp c bn. Chng ta s xem xt mt s bi ton khc thy tnh ph bin ca lp cc bi ton dng ny. d) Bi ton xp hu Cho bn c vua nxn. Hy xp n con hu ln bn c sao cho khng con no khng ch con no. Hai 2 con hu khng ch nhau nu chng trn cng mt hng, mt ct hoc mt ng cho. Chng hn ta c mt cch t sau, cc en l cc v tr t hu:

chuyn bi ton ny v dng chun ca bi ton tm cu hnh t hp, ta c c nhn xt: mi con hu phi trn mt hng v mt ct. Do ta coi con hu th i hng i v nu bit x[i] l ct t con hu th i th ta suy ra c li gii. Vy nghim ca bi ton c th coi l mt vector x gm n thnh phn vi ngha: 1. Con hu th i c t hng i v ct x[i]. 2. x[i] ly gi tr trong tp {1,2n} 3. Rng buc: cc gi tr x[i] khc nhau tng i mt v khng c 2 con hu trn cng mt ng cho. Trong phn ci t, chng ta s phn tch chi tit v cc rng buc trn.

e) Bi ton t p (xu ABC) Mt t p l mt xu di n ch gm cc k t A,B,C m khng c 2 xu con lin tip no ging nhau. Chng hn ABAC l mt t p di 4, BABCA l mt t p di 5. Bi ton tm tt c cc t p di n cho trc yu cu tm nghim l cc vector x c n thnh phn: 1. xi nhn gi tr trong tp {A,B,C} 2. x khng c 2 on con lin tip no bng nhau. Trc khi trnh by v phng php vt cn gii cc bi ton tm cu hnh t hp, chng ta xem xt cc bi ton ti u t hp, v cc bi ton ti u t hp thc cht l s m rng ca bi ton tm cu hnh t hp. 1.2. Bi ton ti u t hp Bi ton ti u tng qut c th pht biu nh sau: Cho tp B khc rng v mt hm f:BR gi l hm mc tiu. Cn tm phn t x thuc B sao cho f(x) t gi tr nh nht hoc ln nht. Phn t x l nghim ca bi ton cn c gi l phng n ti u. Bi ton ti u t hp l bi ton tm phng n ti u trn tp cc cu hnh t hp. Nghim ca bi ton cng l mt vector x gm n thnh phn sao cho: 1. x = (x1,x2,xn) 2. xi ly gi tr trong tp {a1,a2,am} 3. x tho mn cc rng buc cho bi hm G(x). 4. f(x) min/max. Chng ta s phn tch mt s bi ton ti u t hp in hnh. Phn ln u l cc bi ton NPC. a) Bi ton xp bal C mt bal c ti trng m v n vt, vt i c trng lng wi v c gi tr vi. Hy la chn cc vt cho vo bal sao cho tng trng lng ca chng khng qu M v tng gi tr ca chng l ln nht. Mi cch chn cc vt cho vo bal u tng ng vi mt vector x gm n thnh phn m xi=1 nu chn a vt th i vo bal, v xi=0 nu vt th i khng c chn. Khi rng buc tng trng lng cc vt khng qu ti trng ca bal c vit thnh:

x w
i =1 i

Hm mc tiu l tng gi tr ca cc vt c chn:


f ( x ) = x i v i max
i =1 n

Nghim ca bi ton cng l mt vector x gm n thnh phn sao cho: 1. x = (x1,x2,xn) 2. xi ly gi tr trong tp {0,1} 3. Rng buc:
n

x w
i =1 i

4. f ( x ) = x i v i max .
i =1

b) Bi ton ngi du lch C n thnh ph, d[i,j] l chi ph di chuyn t thnh ph i n thnh ph j. (Nu khng c ng i th d[i,j] = ). Mt ngi mun i du lch qua tt c cc thnh ph, mi thnh ph mt ln ri tr v ni xut pht sao cho tng chi ph l nh nht. Hy xc nh mt ng i nh vy. Phng n ti u ca bi ton cng l mt vector x, trong xi l thnh ph s n thm ti ln di chuyn th i. Cc iu kin ca x nh sau: 1. x = (x1,x2,xn) 2. xi ly gi tr trong tp {1,2,n} 3. Rng buc: xi xj vi mi ij v d[xi,xi+1]< vi mi i=1,2,..n, coi xn+1=x1. 4. f(x) =

d[ x , x
i =1 i

i +1

] min

Trn y ta xt mt s bi ton tm cu hnh t hp v bi ton ti u t hp. Trong phn tip chng ta s tm hiu phng php vt cn gii cc bi ton . 1.3. Phng php vt cn gii cc bi ton cu hnh t hp v ti u t hp Phng php vt cn l phng php rt tng qut n gin gii cc bi ton cu hnh t hp v ti u t hp. tng c bn l: bng mt cch no sinh ra tt c cc cu hnh c th ri phn tch cc cu hnh bng cc hm rng buc v hm mc tiu tm phng n ti u (do phng php ny cn c gi l duyt ton b).

Da trn tng c bn , ngi ta c 2 cch tip cn khc nhau duyt ton b cc phng n. Phng php th nht l phng php sinh tun t. Phng php ny cn xc nh mt quan h th t trn cc cu hnh (gi l th t t in) v mt php bin i bin mt cu hnh thnh cu hnh ngay sau n. Mi ln sinh c mt cu hnh th tin hnh nh gi, so snh vi cu hnh tt nht ang c v cp nht nu cu hnh mi tt hn. Gi m ca thut ton tm cu hnh ti u bng phng php sinh nh sau: Procedure sinh; begin x := cau_hinh_dau_tien; best := x; Repeat x := Cau_hinh_tiep_theo(x); if f(x) "tt hn" f(best) then best := x; Until x = cau_hinh_cuoi_cung; end; Thut ton thc hin nh sau: tm cu hnh u tin v coi l cu hnh tt nht. Sau ln lt sinh cc cu hnh tip theo, mi ln sinh c mt cu hnh ta so snh n vi cu hnh tt nht hin c (best) v nu n tt hn th cp nht best. Qu trnh dng li khi ta sinh c cu hnh cui cng. Kt qu ta c phng n ti u l best. Phng php sinh tun t thng rt kh p dng. Kh khn ch yu l do vic xc nh th t t in, cu hnh u tin, cu hnh cui cng v php bin i mt cu hnh thnh cu hnh tip theo thng l khng d dng. Phng php th hai l phng php quay lui quy. T tng c bn ca phng php l xy dng tng thnh phn ca cu hnh, ti mi bc xy dng u kim tra cc rng buc v ch tip tc xy dng cc thnh phn tip theo nu cc thnh phn hin ti l tho mn. Nu khng cn phng n no xy dng thnh phn hin ti th quay lui, xy dng li cc thnh phn trc . M hnh c bn ca phng php quay lui quy nh sau: Procedure Search; begin

Try(1); end; procedure Try(i); var j; Begin for j := 1 to m do if <chn c a[j]> then begin x[i] := a[j]; <ghi nhn trng thi mi>; if i=n then Update else Try(i+1); <tr li trng thi c>; end; end; procedure Update; begin if f(x) "tt hn" f(best) then best := x; end; duyt ton b cc cu hnh, ban u ta gi n Try(1). Try(1) s la chn cho x1 mt gi tr thch hp u tin, ghi nhn trng thi ri gi quy n Try(2). Try(2) li la chn mt gi tr cho x2, ghi nhn trng thi v gi n Try(3). C nh vy bc th i, thut ton tm mt gi tr cho xi, ghi nhn trng thi ri gi quy sinh thnh phn xi+1. Khi sinh n thnh phn ca x th dng li cp nht phng n ti u. Nu mi kh nng ca xi+1 u xt qua th vng for ca Try(i+1) thc hin xong, theo c ch quy chng trnh s quay v im gi quy ca Try(i). Trng thi c trc khi chn xi c phc hi v vng for ca Try(i) s tip tc chn gi tr ph hp tip theo ca xi, chnh l thao tc quay lui. Khi quay lui v n Try(1) v xt ht mi kh nng ca x1 th chng trnh con quy kt thc v ta duyt c ton b cc cu hnh. Trn y l cc thut ton vt cn i vi bi ton tm cu hnh ti u. Trong trng hp bi ton cn tm mt cu hnh, tm mi cu hnh hay m s cu hnh th thut ton cng tng t, ch khc phn cp nht (Update) khi sinh c mt cu hnh mi.

Chng hn th tc Update i vi bi ton tm v m mi cu hnh s tng s cu hnh v in ra cu hnh va tm c: procedure Update; begin count := count + 1; print(x); end; Chng ta s dng thut ton quay lui quy gii cc bi ton cu hnh t hp v ti u t hp trnh by trn. a) Sinh cc t hp chp k ca n y l bi ton sinh t hp c chng ta trnh by phn trn. Ta s gii bng thut ton tm cu hnh t hp bng quy quay lui. V cu trc d liu ta ch cn mt mng x biu din t hp. Rng buc i vi gi tr x[i] l: x[i1]< x[i] nk+i. Th tc quy sinh t hp nh sau: procedure Try(i); var j; begin for j := x[i1]+1 to nk+i do begin x[i] := j; if i=k then Print(x) else Try(i+1); end; end; Di y l ton vn chng trnh sinh t hp vit bng ngn ng Pascal. n gin, cc gi tr n,k c nhp t bn phm v cc t hp c in ra mn hnh. Ngi c c th ci tin chng trnh nhp/xut ra file. program SinhTohop; uses crt; const max = 20; var n,k : integer; x : array[0..max] of integer;

{===============================} procedure input; begin clrscr; write('n,k = '); readln(n,k); writeln('Cac to hop chap ',k,' cua ',n); end; procedure print; var i : integer; begin for i := 1 to k do write(' ',x[i]); writeln; end; procedure try(i:integer); var j : integer; begin for j := x[i-1]+1 to n-k+i do begin x[i] := j; if i = k then Print else try(i+1); end; end; procedure solve; begin x[0] := 0; try(1); end; {===============================}

BEGIN input; solve; END. Ch trong phn ci t l c khai bo thm phn t x[0] lm "lnh canh", v vng lp trong th tc quy c truy cp n x[i1], v khi gi Try(1) th s truy cp n x[0]. b) Sinh cc chnh hp lp chp k ca n Xem li phn tch ca bi ton sinh chnh hp lp chp k ca n ta thy hon ton khng c rng buc no i vi cu hnh sinh ra. Do , cu trc d liu ca ta ch gm mt mng x lu nghim. Thut ton sinh chnh hp lp nh sau: procedure Try(i); var j; begin for j := 1 to n do begin x[i] := j; if i=k then Print(x) else Try(i+1); end; end; Di y l chng trnh sinh tt c cc dy nh phn di n. n gin, chng trnh nhp n t bn phm v in cc kt qu ra mn hnh. program SinhNhiphan; uses crt; const max = 20; var n : integer; x : array[1..max] of integer; {===============================} procedure input; begin clrscr;

write('n = '); readln(n); writeln('Cac day nhi phan do dai ',n); end; procedure print; var i : integer; begin for i := 1 to n do write(' ',x[i]); writeln; end; procedure try(i:integer); var j : integer; begin for j := 0 to 1 do begin x[i] := j; if i = n then Print else try(i+1); end; end; procedure solve; begin try(1); end; {===============================} BEGIN input; solve; END.

c) Sinh cc chnh hp khng lp chp k ca n Chnh hp khng lp yu cu cc phn t phi khc nhau. m bo iu , ngoi mng x, ta s dng thm mt cu trc d liu na l mng d nh du. Khi mt gi tr c chn, ta nh du gi tr , v khi chn, ta ch chn cc gi tr cha nh du. Mng d s l "trng thi" ca thut ton. Bn c xem phn gi m di y thy r hn tng . procedure Try(i); var j; begin for j := 1 to n do if d[j]=0 then begin x[i] := j; d[j] := 1; if i=k then Print(x) else Try(i+1); d[i] := 0; end; end; Chng trnh di y s sinh ton b cc hon v ca tp n s nguyn t 1 n n. Gi tr n c nhp t bn phm v cc hon v c in ra mn hnh. program SinhHoanvi; uses crt; const max = 20; var n : integer; x,d : array[1..max] of integer; {===============================} procedure input; begin clrscr; write('n = '); readln(n); writeln('Cac hoan vi cua day ',n); end;

procedure print; var i : integer; begin for i := 1 to n do write(' ',x[i]); writeln; end; procedure try(i:integer); var j : integer; begin for j := 1 to n do if d[j] = 0 then begin x[i] := j; d[j] := 1; if i = n then Print else try(i+1); d[j] := 0; end; end; procedure solve; begin try(1); end; {===============================} BEGIN input; solve; END.

d) Bi ton xp hu Khc vi nhng bi ton sinh cc cu hnh n gin phn trc, sinh cc cu hnh ca bi ton xp hu i hi nhng phn tch chi tit hn v cc iu kin rng buc. Rng buc th nht l cc gi tr x[i] phi khc nhau. Ta c th dng mt mng nh du nh thut ton sinh hon v m bo iu ny. Rng buc th 2 l cc con hu khng c nm trn cng mt ng cho chnh v ph. Cc bn c th d dng nhn ra rng 2 v tr (x1,y1) v (x2,y2) nm trn cng ng cho chnh nu: x1y1=x2y2=const. Tng t, 2 v tr (x1,y1) v (x2,y2) nm trn cng ng cho ph nu: x1+y1=x2+y2=const Do , con hu i t ti v tr (i,x[i]) v con hu j t ti v tr (j,x[j]) phi tho mn rng buc: ix[i] jx[j] v i+x[i] j+x[j] vi mi ij Ta c th vit ring mt hm Ok kim tra cc rng buc . Nhng gii php tt hn l dng thm cc mng nh du m t rng mt ng cho chnh v ph c mt con hu khng ch. Tc l khi ta c con hu i v tr (i,j), ta s nh du ng cho chnh i-j v ng cho ph i+j. Nh vy v cu trc d liu, ta dng 4 mng: 1. Mng x vi ngha: x[i] l ct ta s t con hu th i. 2. Mng cot vi ngha: cot[j]=1 nu ct j c mt con hu c t, ngc li th cot[j]=0. 3. Mng dcc vi ngha: dcc[k]=1 nu ng cho chnh th k c mt con hu c t, tc l ta t mt con hu ti v tr (i,j) m ij=k; ngc li th dcc[k]=0. 4. Tng t ta dng mng dcp vi ngha: dcp[k]=1 nu ng cho ph th k c mt con hu c t. Gi m ca thut ton xp hu nh sau: procedure Try(i); var j; begin for j := 1 to n do

if (cot[j]=0) and (dcc[i-j]=0) and (dcp[i+j]=0) then begin x[i] := j; cot[j]:=1; dcc[i-j]:=1; dcp[i+j]:=1; {ghi nhn trng thi mi} if i=n then Update else Try(i+1); cot[j]:=0; dcc[i-j]:=0; dcp[i+j]:=0; {phc hi trng thi c} end; end; procedure Update; begin count := count + 1; print(x); end; Phn di l ton b chng trnh tm cc phng n xp hu trn bn c 8x8. Chng trnh tm c 92 phng n khc nhau. e) Bi ton t p Tt c cc bi ton ta gii trn u c cu hnh c thnh phn l cc s nguyn. Ring bi ton t p th cn tm cu hnh l mt xu. Ta c th dng mt mng k t thay th, tuy nhin iu khng cn thit v ngn ng Pascal cng c kh nng x l xu k t rt tt. M hnh quay lui ca bi ton t p c th vit nh sau: procedure Try(i) var c; begin for c := 'A' to 'C' do begin x := x + c; if Ok(i) then if i=n then Update else Try(i+1); delete(x,i,1); end; end; procedure Update;

begin count := count + 1; print(x); end; Cc th tc Try, Update kh tng t cc bi ton khc. Ring vit hm Ok kim tra la chn hin ti cho x[i] c ph hp khng, chng ta phn tch su hn nh sau: Trc ht ta thy rng khi la chn n x[i] th xu x[1..i-1] tho mn tnh cht ca t p. Nh vy nu x[1..i] khng tho mn tnh cht ca t p th ch c kh nng l do k t th i mi c chn khng ph hp. Vy hm Ok(i) ch cn kim tra cc xu con c cha x[i] c ging mt xu con lin k trc n hay khng? Nu c th gi tr x[i] khng tho mn v ta phi chn gi tr khc. Ngc li nu gi tr x[i] tho mn th ta cp nht kt qu hoc quy tip tu thuc vo vic ta chn n k t cha. Hm Ok c th vit nh sau: function Ok(l) begin Ok := false; for k := 1 to l div 2 do if copy(x,l-k+1,k) = copy(x,l-2*k+1,k) then exit; Ok := true; end; Nu c gi thy hm Ok kh hiu th chng ti c th gii thch nh sau: ta cn kim tra mi xu con c cha k t cui cng c bng xu con lin k trc n hay khng? di xu ang c l l, do cc xu con c cha k t th l c kh nng bng xu lin k trc n ch c di t 1 n l/2. Biu thc copy(x,lk+1,k) cho kt qu l xu con gm k k t cui cng ca x v biu thc copy(x,l2*k+1,k) cho xu con k k t ngay trc xu con c k k t cui cng. Phn ci t chng trnh c th xin dnh cho c gi. Phn tip theo chng ti xin cp n bi ton ti u t hp. f) Bi ton ngi du lch. c gi d dng nhn thy mi phng n ca bi ton ngi du lch l mt hon v ca n thnh ph. Do ta c th dng m hnh vt cn ca bi ton sinh

hon v tm cc phng n. V ta s dng thm rng buc: d[xi-1,xi]<. Mt khc v phng n l mt chu trnh nn ta c th coi thnh ph xut pht l thnh ph 1. Thut gii bi ton ngi du lch bng vt cn nh sau: procedure Search; begin min := ; x[1] := 1; dd[1] := 1; try(2); end; procedure Try(i) var j; begin for j := 1 to n do if (dd[j]=0) and (d[x[i-1],j] < ) then begin x[i] := j; dd[j] := 1; if i=n then Update else Try(i+1); dd[j] := 0; end; end; procedure Update; var s,i; begin s := d[x[n],1]; for i := 1 to n-1 do s := s + d[x[i],x[i+1]]; if s < min then begin min := s; best := x; end; end; Lp cc bi ton ti u t hp rt rng. Phn ln cc bi ton trong trng hp tng qut ch c thut ton ti u duy nht l vt cn. Tuy nhin,

nhc im ca phng php vt cn l phc tp tnh ton rt ln do hin tng bng n t hp. Cc bn nh li rng s hon v ca tp n phn t l n!. Do trong trng hp xu nht thut ton vt cn i vi bi ton ngi du lch l O(n!). C 2 gii php khc phc vn ny. Gii php th nht ci tin phng php vt cn bng k thut nhnh cn, tc l loi b ngay cc hng i chc chn khng dn n phng n ti u. Gii php th 2 l s dng cc phng php khc, m hai phng php ni bt nht l phng php quy hoch ng v phng php tham lam. Phn tip theo, chng ti s trnh by s lc v k thut nhnh cn. 1.4. K thut nhnh cn Nguyn nhn dn n phc tp ca cc bi ton ti u t hp l hin tng bng n t hp. l hin tng s cu hnh t hp tng theo hm m i vi s thnh phn t hp n. n gin nht l cc dy nh phn, mi thnh phn t hp ch c 2 kh nng l 0 v 1 th s cc dy nh phn di n l 2n. Do vic sinh ton b cc cu hnh t hp s khng kh thi khi n ln. Qu trnh vt cn kiu quay lui l mt qu trnh tm kim phn cp, tc l cc thnh phn x1, x2 s c chn trc. Nu ti bc i ta chn mt gi tr xi khng ti u th ton b qu trnh chn xi+1, xi+2 s hon ton v ngha. Ngc li, nu ta xc nh c rng gi tr xi khng dn n cu hnh ti u th ta s tit kim c ton b cc bc chn xi+1, xi+2 Tit kim i khi l ng k. Chng hn nu i vi bi ton duyt nh phn (ti u cc cu hnh l dy nh phn) ta xc nh c x1=0 khng hp l th ta tit kim c 2n-1 bc duyt pha sau. chnh l t tng ca phng php nhnh cn. M hnh quay lui c nhnh cn nh sau: Procedure Search; begin Try(1); end; procedure Try(i); var j; Begin for j := 1 to m do

if <chn c a[j]> then begin x[i] := a[j]; <ghi nhn trng thi mi>; if i=n then Update else if Ok(i) then Try(i+1); <tr li trng thi c>; end; end; Ci tin so vi phng php vt cn thun tu l cu lnh if Ok(i) then Try(i+1);. Hm Ok y c dng nh gi tnh trng ca cu hnh hin ti. Th nht l c m bo dn n cu hnh ti u hay khng. Nu khng th t nht cng phi m bo cho gi tr hm mc tiu tt hn phng n tt nht ta ang c. K thut nhnh cn rt a dng, ph thuc vo tng bi ton v t duy ca ngi lp trnh. Chng ta s xem xt mt s bi ton ti u gii bng phng php nhnh cn. u tin l bi ton ngi du lch. Ta c nhn xt: ti ln di chuyn th i, nu tng chi ph ang c chi ph ca phng n tt nht ta ang c th r rng vic i tip khng mang n kt qu tt hn. Do ta c th t mt nhnh cn n gin nh sau: procedure Try(i) var j; begin for j := 1 to n do if (dd[j]=0) and (d[x[i-1],j] < ) then begin x[i] := j; dd[j] := 1; s := s + d[x[i-1],j]; if i=n then Update else if s < min then Try(i+1); dd[j] := 0; s := s - d[x[i-1],j]; end; end;

Hai bin s, min l cc bin ton cc, trong min dng lu chi ph ca phng n tt nht cn s lu tng chi ph hin ti. Ta c th tip tc ci tin cn ny bng vic khng ch xt chi ph n thi im hin ti m cn xt lun c chi ph ti thiu kt thc hnh trnh. Gi dmin l gi tr nh nht ca bng d, tng ng vi chi ph nh nht ca vic di chuyn t thnh ph ny n thnh ph kia. Ti bc th i th ta cn phi thc hin ni+1 bc di chuyn na th mi kt thc hnh trnh (i qua ni thnh ph cn li v quay v thnh ph 1). Do chi ph ca c hnh trnh s ti thiu l s + (ni+1)*dmin. Nu chi ph ny cn ln hn chi ph ca phng n tt nht th r rng la chn hin ti cng khng th dn n mt phng n tt hn. Chng trnh con vt cn quy c th sa thnh: procedure Try(i) var j; begin for j := 1 to n do if (dd[j]=0) and (d[x[i1],j] < ) then begin x[i] := j; dd[j] := 1; s := s + d[x[i1],j]; if i=n then Update else if s + (ni+1)*dmin < min then Try(i+1); dd[j] := 0; s := s d[x[i1],j]; end; end; Nhn chung nhng cn c ci thin tnh hnh i cht nhng cng khng thc s hiu qu. Ngi ta cng nghin cu nhiu cn cht hn, c gi c th tm c cc ti liu khc. Ta xt tip bi ton t p nht. nh ngha t p c m t bi ton t p. T p nht l t c t k t C nht. R rng bi ton tm t p nht l mt bi ton ti u t hp. Chng ta xy dng nhnh cn vi nhn xt: nu x[1..n] l t p th trong 4 k t lin tip ca x phi c t nht mt k t C. Vy, nu ta xy dng i k t th phn cn li gm ni k t s c t nht (ni)/4 k t C. Do s k t C ti thiu

ca c xu s l t + (ni)/4, trong t l s k t C ca x[1..i]. Ta c th dng t+(ni)/4 lm cn. Chng trnh con quy nh sau: procedure Try(i) var c; begin for c := 'A' to 'C' do begin x := x + c; if c = 'C' then t := t + 1; if Ok(i) then if i=n then Update else if t + (n-i) div 4 < minC then Try(i+1); delete(x,i,1); if c = 'C' then t := t - 1; end; end; Bin minC y dng lu s k t C ca phng n tt nht ang c. Nhnh cn l mt k thut mnh v i hi t duy su sc. Chn c mt cn tt thng khng n gin, i hi phi c nhng phn tch su sc v t m. Mt s ch khi chn cn: 1. Cn phi nh gi chnh xc tnh trng cu hnh hin ti. Nu qu lng th s cu hnh loi b khng ng k, nu qu cht th s dn n b st nghim. 2. Cn phi tnh ton n gin. V thao tc tnh cn thc hin ti tt c cc bc nn nu tnh ton cn qu phc tp th thi gian rt ngn nh t cn tit kim c th li mt ng k cho vic tnh cn. Mc d nhnh cn l k thut mnh nhng mun p dng tt i hi nhng phn tch rt chi tit. Hn na nhiu trng hp c t cn th s phng n cn duyt vn qu nhiu. Trong nhng trng hp nh vy chng ta cn phi c nhng cch tip cn khc. Phn tip theo trnh by v mt phng php cc k hiu qu, l phng php quy hoch ng. 2. Phng php tham lam (Gready) Tm nghim ca bi ton ti u thng i hi chi ph ln v thi gian tnh ton v khng gian b nh. Tuy nhin trong nhiu trng hp ta ch tm c mt

nghim tt, kh gn vi nghim ti u l t yu cu, nht l khi c hn ch v mt thi gian v b nh. Phng php tham lam xy dng cc thut ton gii cc bi ton ti u da trn t tng ti u cc b theo mt chin lc t duy kiu con ngi, nhm nhanh chng t n mt li gii "tt". C mt s thut ton da trn t tng ca phng php tham lam thc s tm c phng n ti u (chng hn thut ton Kruscal tm cy khung cc tiu), cn li a s cc thut ton da trn phng php tham lam thng l thut ton gn ng, ch cho mt li gii xp x li gii ti u. 2.1. Mt s chin lc tham lam Phng php tham lam tm nghim ti u da trn cc chin lc ti u cc b ca con ngi. Trc khi trnh by nhng thut gii tham lam cho nhng bi ton c th, chng ti cp n hai chin lc ti u cc b c bn: - Chn ci tt nht trc (cn gi l "chn ming ngon trc". y l l do v sao phng php ny c gi l "tham lam" hay "tham n"). - Ci tin ci ang c thnh ci tt hn. Chin lc th nht thng c p dng khi xy dng dn tng thnh phn ca nghim ti u. Thut gii s nh gi cc la chn theo mt tiu chun no v sp xp t nh n ln ri tin hnh chn theo trnh t . Chin lc th hai thng bt u bng mt hay mt vi phng n. Sau , bng mt s cch thc no , cc phng n c iu chnh c gi tr tt hn. Qu trnh iu chnh s dng li khi khng iu chnh c thm hoc s ci thin rt nh hoc ht thi gian cho php Phn ln cc thut ton hin nay p dng cho b d liu ln c thit k theo chin lc ny: chng hn tm kim leo i, gii thut di truyn c gi c th tham kho trong nhng ti liu khc. Chng ta s i vo mt s bi ton c th v vn dng nhng chin lc trn thit k cc thut gii tham lam. 2.2. Bi ton xp bal Gii thut tham lam gii bi ton xp bal da trn chin lc "chn ci tt nht trc". Vic chn cc vt a vo bal c th theo 3 chin lc nh sau: - u tin vt nh trc (vi hi vng chn c nhiu vt). - u tin vt c gi tr cao trc. - u tin chn nhng vt c t s gi tr/trng lng ln trc.

Ta thy chin lc th 3 tng qut hn nht. Do vy vic tm nghim ca chng ta s tin hnh theo 2 bc: 1. Sp xp cc vt gim dn theo t l: gi tr/trng lng. 2. Ln lt a vo bal nhng vt no c th a c theo trnh t sp xp . Thut gii chi tit nh sau: procedure Gready; begin for i := 1 to n do begin a[i]:=v[i]/w[i];id[i] := i; end; sp xp w,v,a,id theo a; for i:=1 to n do begin if m >= w[i] then begin m := m - w[i]; t := t + v[i]; s := s + [id[i]]; end; end; end; Kt qu: S l tp cc vt c chn, T l tng gi tr ca chng. Thut gii ny c phc tp O(nlogn) do thao tc ch yu phn sp xp. 2.3. Bi ton ngi du lch C nhiu gii thut tham lam khc nhau gii bi ton ny. Chng ti xin trnh by mt gii thut theo chin lc chn ci tt trc v mt gii thut theo chin lc ci tin ci hin c. Gii thut theo chin lc chn ci tt nht trc c tng rt n gin: ti mi bc ta s chn thnh ph tip theo l thnh ph cha n thm m chi ph t thnh ph hin ti n thnh ph l thp nht. Gii thut theo chin lc ci tin ci hin c cng c tng rt n gin: xut pht t mt l trnh no (1,2,..n chng hn), ta ci tin l trnh hin c bng cch tm 2 thnh ph m i ch chng cho nhau th tng chi ph gim i. Qu trnh dng li khi khng cn ci tin c hn na.

Da trn 2 tng , bn c c th d dng xy dng c cc thut gii. Thut gii th nht c phc tp tnh ton l O(n2), thut gii th hai c phc tp tnh ton l O(n3). Ngoi 2 gii thut trn, ngi ta cn xy dng c gii thut di truyn cho bi ton ny. tng c bn l thay v xut pht t mt phng n, chng ta x l nhiu phng n ng thi, ci tin chng bng vic m phng qu trnh di truyn, thch nghi v tin ho ca sinh vt c c nhng phng n ngy mt tt hn. Tuy nhin vn nm ngoi khun kh ca cun gio trnh ny. i vi th metric (tc l c bt ng thc tam gic d[i,j]<=d[i,k]+d[k,j] vi mi i,j,k) ngi ta cn tm c thut gii tham lam cho nghim c tng chi ph <=2 tng chi ph ca nghim ti u. Thut gii tin hnh cng theo 2 bc: 1. Tm cy khung cc tiu ca th. 2. Duyt cy khung theo chiu su. 3. Xy dng l trnh l th t duyt ca cc nh, loi b cc nh trng nhau. 2.4. Bi ton ng thng (Bin-Packing) Cho N vt, mi vt c trng lng l ai. C rt nhiu thng ging nhau v mi thng ch c kh nng cha c cc vt c tng khi lng khng qu M (tt nhin ai<=M) . Hy xp cc vt vo cc thng sao cho s thng s dng l t nht. Bi ton ng thng cng l mt bi ton NPC, tc l cha c thut gii a thc. Thut gii tham lam ca bi ton ny da trn tng: 1. Sp xp cc vt theo th t trng lng gim dn. 2. Ln lt a cc vt vo cc thng bng cch tm thng u tin vn cn cha vt y. Nu khng c th thm mt thng mi cha vt y. procedure Gready; begin for i:=1 to n do id[i] := i;; sxep a,id on a; k:=0; for i:=1 to n do begin for j := 1 to k+1 do if t[j]+a[i]<=M then break; {tm thng j u tin}

if j=k+1 then k:=k+1; {k thng u tin khng th cha c => dng thng mi} t[j] := t[j] + a[i]; s[j] := s[j] + [id[i]]; end; end; ngha ca cc cu trc d liu nh sau: id[i] l ch s ban u vt i sau khi sp xp, k l s thng cn dng, t[j] l tng trng lng cc vt ang c trong thng j, s[j] l tp hp cc vt c a vo thng j. phc tp tnh ton ca thut ton l O(n2). Johnson chng minh c thut gii ny cho nghim x tho mn: f(x) xp x 11*f(x0)/9+4 vi x0 l nghim ti u. Trc khi kt thc trnh by v phng php tham lam, chng ti cp n thut ton Kruscal, mt thut ton tham lam thc s ti u. 2.5. Thut ton Kruscal Thut ton Kruscal gii bi ton tm cy khung cc tiu ca th v hng c trng s. Bi ton cy khung cc tiu c trnh by chng th. Ni mt cch n gin, cy khung cc tiu ca mt th N nh l mt th con N nh, N-1 cnh, lin thng v c tng trng s cc cnh l nh nht. L thuyt th chng minh mt th lin thng khng c chu trnh s l mt cy. T tng tham lam trong thut ton Kruscal l "chn ci tt nht trc". Chng ta s tin hnh chn N-1 cnh u tin cc cnh c trng s nh trc sao cho khi chn cnh c chn phi khng to thnh chu trnh vi cc cnh chn. Nh vy thut ton s tin hnh qua 2 bc: sp xp v chn. kim tra mt cnh khi c chn c to thnh chu trnh hay khng, ta s lu tr cc nh vo cc cy con. Nu hai nh u mt ca mt cnh m cng thuc mt cy th thm cnh s to thnh chu trnh. ng thi, khi thm mt cnh ta cng hp nht 2 cy ca 2 nh tng ng. V cu trc d liu: ta biu din th bng danh sch cnh, gm cc b ba (u,v,d) vi ngha trng s cnh (u,v) l d. biu din cc cy con ta dng mng T, trong T[u] l nh cha ca nh u trong cy. Nu T[u] bng 0 th u l nh gc. Hai nh cng thuc mt cy nu chng cng nh gc.

Thut ton chi tit nh sau: procedure Kruscal; begin sp xp u,v,d tng dn theo d; {sp xp danh sch cnh tng dn} for i := 1 to m do begin x := Root(u[i]); y := Root(v[i]); {tm gc ca mi nh } if x <> y then begin {thuc 2 cy khc nhau } k := k + 1; s := s + [i]; {chn cnh i} T[y] := x; {hp nht 2 cy} if k=n-1 then exit; {chn n-1 cnh th xong} end; end; end; function Root(u); {tm gc ca nh u, l nh c T = 0} begin while T[u] <> 0 do u := T[u]; Root := u; end; Kt qu ta c s l danh sch cc cnh c chn. D dng chng minh c phc tp ca thut ton l O(mlogm), ch yu l thi gian sp xp cc cnh. Qua cc thut gii tham lam trnh bi, chng ta c th kt lun: 1. Phng php tham lam c phc tp tnh ton thp, thng nhanh chng tm c li gii . 2. Li gii ca phng php tham lam thng ch l mt li gii tt ch khng phi li gii ti u. 3. Kt lun Trong chng ny chng ta tm hiu v hai phng php thit k thut ton ph bin: vt cn, tham lam. Mi phng php c nhng u im v nhc im ring. Phng php vt cn c u im l n gin v chc chn tm c li gii ti u. B li nhc im ca n l phc tp qu ln. Phng php

tham lam th nhanh chng, n gin v khng i hi nhiu b nh, nhng li khng chc chn tm c li gii ti u. Do mi phng php u c u, nhc im ring nn tu vo yu cu ca bi ton v kh nng cho php m ta c th la chn hay phi hp cc phng php khc nhau tm kim li gii tt nht. Chng hn nu b nh hn hp th ta c th dng vt cn vi b d liu nh v tham lam vi b d liu ln, hoc dng phng php tham lam xc nh mt s cn cho vt cn.

Bi tp Bi 1: Dominoes C N qun Domino xp thnh mt hng nh hnh v Mi qun Domino c chia lm hai phn, phn trn v phn di. Trn mt mi phn c t 1 n 6 du chm. Ta nhn thy rng: Tng s du chm phn trn ca N qun Domino bng: 6+1+1+1=9, tng s du chm phn di ca N qun Domino bng 1+5+3+2=11, chnh lch gia tng trn v tng di bng |9-11|=2 Vi mi qun, bn c th quay 1800 phn trn tr thnh phn di, phn di tr thnh phn trn, v khi chnh lch c th c thay i. V d nh ta quay qun Domino cui cng ca hnh trn th chnh lch bng 0 Bi ton t ra l: Cn quay t nht bao nhiu qun Domino nht chnh lch gia phn trn v phn di l nh nht. D liu vo trong file: Dom.in c dng: - Dng u l s nguyn dng N (1N20) - N dng sau, mi dng hai s ai, bi l s du chm phn trn, s du chm phn di ca qun Domino th i (1 ai, bi 6) Kt qu ra file: Dom.out c dng: - Gm 1 dng duy nht cha 2 s nguyn cch nhau mt du cch l chnh lch nh nht v s qun Domino cn quay t nht c chnh lch . Bi 2: Tham quan Trong t t chc i tham quan danh lam thng cnh ca thnh ph H Ch Minh, Ban t chc hi thi Tin hc tr t chc cho N on ( nh t s 1 n N) mi on i thm quan mt a im khc nhau. on th i i thm a im cch Khch sn Hong di km (i=1,2,...., N). Hi thi c M xe taxi nh s t 1 n M (MN) phc v vic a cc on i thm quan. Xe th j c mc tiu th xng l vj n v th tch/km. Yu cu: Hy chn N xe phc v vic a cc on i thm quan, mi xe ch phc v mt on, sao cho tng chi ph xng cn s dng l t nht.

D liu: File vn bn TQ.INP: - Dng u tin cha hai s nguyn dng N, M (NM200); - Dng th hai cha cc s nguyn dng d1, d2, ..., dN; - Dng th ba cha cc s nguyn dng v1, v2, ..., vM. - Cc s trn cng mt dng c ghi khc nhau bi du trng. Kt qu: Ghi ra file vn bn TQ.OUT: - Dng u tin cha tng lng xng du cn dng cho vic a cc on i thm quan (khng tnh lt v); - Dng th i trong s N dng tip theo ghi ch s xe phc v on i (i=1, 2, ..., N). Bi 3: Biu thc Cho mt xu S (ch gm cc k t 0 n 9, di nh hn 10) hy tm cch chn vo S cc du '+' hoc '-' thu c s M cho trc (nu c th). Xu S v s M (M thuc kiu longint) nguyn c c t file BT.INP. Trong file BT.OUT ghi tt c cc phng n chn (nu c) v ghi "-1" nu nh khng th thu c M t cch lm trn. V d: M = 8, S=123456789 mt trong cc phng n l: '-1+2-3+4+5-6+7';

You might also like