Professional Documents
Culture Documents
theo cc iu kin ni phn trn. Khi no hon tt cng vic, tc l khi chuyn
xong ton b 64 a t v tr ban u sang v tr kt thc th cng l thi im tn th.
Chng ta gii bi ton bng cch chia bi ton chuyn N a, t v tr 1 sang v tr 2
thnh ba bi ton n gin hn nh sau:
1. Chuyn N-1 a trn cng t v tr 1 sang v tr 3, dng v tr 2 lm trung gian.
2. Chuyn a th N t v tr 1 sang v tr 2.
3. Chuyn N-1 a t v tr 3 sang v tr 2, dng v tr 1 lm trung gian.
Ch rng bi ton 1 v 3 tng t nh bi ton ban u, ch khc l kch thc nh
hn. Chng cng s c gii bng phng php chia tr ging nh bi ton ban
u. D dng kim tra l khi gii nh vy chng vn tho mn cc iu kin. Bi ton
2 th c gii rt n gin.
Thut ton c vit di dng gi m nh sau:
Procedure Hanoi;
begin
Move(n,1,2,3);
end;
Procedure Move(n,a,b,c);
{chuyn n a, t v tr a sang v tr b, dng v tr c lm trung gian }
begin
if n=0 then exit;
Move(n-1,a,c,b);
writeln('Chuyn a ',n, ' t v tr ',a, 'sang vi tri ',b);
Move(n-1,c,b,a);
end;
Khi rng buc tng trng lng cc vt khng qu ti trng ca bal c vit
thnh:
n
x w
i
i =1
f ( x ) = x i v i max
i =1
x w
i
i =1
4. f ( x ) = x i v i max .
i =1
d[ x , x
i =1
i +1
] min
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 th sai quay lui (Backtracking). 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 li, xy dng li cc thnh phn trc .
Gi m ca thut ton quay lui nh sau.
procedure Backtrack;
begin
i := 1; x[1] := a0;
repeat
x[i] := next(x[i]);
if ok then Forward else Backward;
until i=0;
end;
procedure Forward;
begin
if i = n then Update
else begin
i := i + 1;
x[i] := a0;
end;
end;
procedure Backward;
begin
i := i 1;
end;
procedure Update;
begin
if f(x) "tt hn" f(best) then best := 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
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;
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;
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;
end;
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;
end;
end;
Phng php th hai l dng mt cu trc d liu na truy vt. Ta t T[i] l phn
t ng ngay trc i trong dy. Chng trnh con quy hoch ng c vit li nh
sau:
procedure Optimize;
var i,j;
begin
L[1] := 1;
for i := 2 to n do begin
L[i] := 1; T[i] := 0;
for j := 1 to i-1 do
if (a[j] <= a[i]) and (L[i] < L[j] + 1) then begin
L[i] := L[j] + 1;
T[i] := j;
end;
end;
end;
D dng chng minh c thut ton ny c phc tp tnh ton O(n2) v chi ph
khng gian l O(n).
8.3.2. Xu con chung di nht
D dng kim tra thut ton quy hoch ng tm xu con chung di nht c phc
tp tnh ton l O(n2) v i hi khng gian b nh cng l O(n2).
Qua hai v d trn, chc bn c phn no nhn thy s hiu qu ca phng php
quy hoch ng. Chng ta s tm hiu tip mt s bi ton na nhn thy sc
mnh ca quy hoch ng so vi cc phng php khc.
8.3.3. Bi ton xp bal
T cch tnh nhn ma trn cho thy: nhn mt ma trn kch thc mn vi mt ma
trn np, s php nhn phi thc hin l m.n.p. Mt khc php nhn cc ma trn c
tnh kt hp, tc l:
(A.B).C = A.(B.C)
Do khi tnh tch nhiu ma trn, ta c th thc hin theo cc trnh t khc nhau.
Vic la chn trnh t tnh s quyt nh s php nhn cn thc hin.
V d ta c 4 ma trn: A(13,5), B(5,89), C(89,3), D(3,34) th ta c mt s cch tnh
A.B.C.D theo cc trnh t khc nhau nh sau:
1. Tnh theo trnh t (((A.B).C).D) th s php nhn l 10592.
2. Tnh theo trnh t ((A.B).(C.D)) th s php nhn l 54201.
3. Tnh theo trnh t ((A.(B.C)).D th s php nhn l 2856.
4. Tnh theo trnh t A.((B.C).D) th s php nhn l 4055.
5. Tnh theo trnh t A.(B.(C.D)) th s php nhn l 26418.
Php nhn (nht l cc php nhn s thc) thng c thi gian thc hin lu hn
php cng, tr. Do ngi ta t ra bi ton:
Cho n ma trn A1,A2An, ma trn Ai c kch thc l di-1di. Hy xc nh trnh t
nhn ma trn A1.A2An sao cho s php nhn cn thc hin l t nht.
Nu dng phng php vt cn gii bi ton ny th chng ta s xt mi cch t
cc du ngoc khc nhau tm s php nhn ca tng cch t, t tm c cch
t ti u. Gi T(n) l s cch t du ngoc vi n ma trn th ta d dng chng minh
c cng thc tnh T(n) nh sau:
N 1
T (n ) = T(i).T(n i)
i =1
n
T(n)
1
1
2
1
3
2
4
5
5
14
10
4862
15
2674440
D thy l T(n) tng rt nhanh theo n. Ngi ta chng minh c T(n) c 4n/n. Kt
lun l gii bng phng php vt cn th ch gii c vi nhng gi tr n rt b.
ng ngc nhin l ta c th gii bi ton nhn ma trn bng phng php quy hoch
ng vi phc tp tnh ton ch l O(n3).
Gi F(i,j) l s php nhn tnh tch Ai.Ai+1....Aj th ta thy:
Nu i=j th ch c mt ma trn do F(i,i)=0.
Nu j=i+1 th ta ch phi nhn Ai v Ai+1. Ai c kch thc di-1di, Ai+1 c kch thc
didi+1, do F(i,i+1)=di-1.di.di+1.
Nu j>i+1 th ta thy c th tnh Ai.Ai+1....Aj cch chn mt v tr k no t
ngoc theo trnh t:
Ai.Ai+1....Aj = (Ai..Ak).(Ak+1..Aj)
Ma trn kt qu ca php nhn (Ai..Ak) c kch thc di-1dk, ma trn kt qu ca
php nhn (Ak+1..Aj) c kch thc dkdj. Vi cch t ta s mt F(i,k) php nhn
c kt qu trong du ngoc th nht, mt thm F(k+1,j) php nhn c kt qu
trong du ngoc th hai, v cui cng mt di-1.dk.dj nhn 2 ma trn kt qu . T
tng s php nhn ca cch t l:
F(i,k)+F(k+1,j)+di-1.dk.dj
C nhiu cch chn k : k=i+1,i+2,j-1. Ta chn cch cho php s php nhn t nht:
F(i,j) = min(F(i,k)+F(k+1,j)+di-1.dk.dj) vi mi k=i+1,i+2,...j-1.
Tm li ta c cng thc quy hoch ng nh sau:
1. F(i,i)=0
2. F(i,i+1)=di-1.di.di+1
3. F(i,j) = min(F(i,k)+F(k+1,j)+di-1.dk.dj, k=i+1,i+2,...j-1)
c cng thc quy hoch ng, ta s chn cu trc d liu l mt bng 2 chiu F
lu F(i,j). Tuy nhin c mt ch khi ci t l tnh c F(i,j), ta phi tnh F(i,k)
v F(k+1,j) trc. Nh vy trnh t tnh khng phi l tnh cc gi tr F(i,j) vi i,j t
nh n ln. Ta c nhn xt l trong cng thc trn j-i ln hn k-i v j-k. Do nu
ta tnh cc phn t F(x,y) vi y-x t nh n ln th khi tnh F(i,j), ta c F(i,k) v
F(k+1,j).
procedure Optimize;
begin
for i := 1 to n do
F[i,i] := 0;
for i := 1 to n-1 do
F[i,i+1] := d[i-1]*d[i]*d[i+1];
for m := 2 to n-1 do begin
for i := 1 to n-m do begin
j := i + m; F[i,j] := ;
for k := i+1 to j-1 do
F[i,j] := min(F[i,j], F[i,k]+F[k+1,j]+d[i-1]*d[k]*d[j]);
end;
end;
end;
Chng ta nhn thy sc mnh v tnh hiu qu ca phng php quy hoch ng.
Tuy nhin khng c phng php no l hon ho. Phng php quy hoch ng c
mt s nhc im ln nh sau:
1. Khng phi bi ton no cng gii c bng quy hoch ng. Hin nay ngi ta
vn cha tm c iu kin cn v mt bi ton c th gii c bng phng
php quy hoch ng. Do xc nh c mt bi ton c th gii c bng
quy hoch ng v tm c cng thc quy hoch ng ca n thng l vic rt kh
khn.
2. Nu bi ton c th gii c bng quy hoch ng th yu cu v khng gian nh
cng kh ln. a s cc bi ton u c i hi khng gian b nh c O(n2). Nu mi
trng lp trnh hn ch b nh th s khng th lm vic c vi cc d liu ln,
mc d phng php quy hoch ng c phc tp tnh ton khng cao.
Nhc im 1 nhn chung l kh gii quyt. Ch c cch c gng a bi ton ang
xt v mt m hnh no c chng minh l lm c bng quy hoch ng v
tm c cng thc quy hoch ng. Chng hn: m hnh dy con n iu tng
di nht, xu con chung, xp bal, nhn ma trn
Nhc im 2 th c th gii quyt d dng hn. Ch vo cng thc quy hoch
ng, ta thng thy F[n] thng ch phi tnh qua F[n-1]. Do ta khng cn phi
lu tr c bng phng n m ch cn lu mt s v tr cn thit. Nu bi ton c yu
cu truy vt tm nghim th ta c th dng bng truy vt c kch thc thng l nh
hn bng phng n.
Chng hn ta c k thut sau gii bi ton xu con chung di nht cho 2 xu c di
c 1000. (Ch , xu trong TP ch c di ti a 255 nn trong trng hp ny ta
phi dng mng k t lu tr 2 xu).
Cho s t nhin n. Hy cho bit c bao nhiu cch phn tch s n thnh tng cc s
nguyn dng. Cc cch phn tch khng xt th t, chng hn 6=1+5=5+1 c coi
l mt cch. n=0 cng c coi l 1 cch phn tch.
gii bi ton bng phng php quy hoch ng, trc ht ta phi lp c cng
thc quy hoch ng.
Gi F(i,j) l s cch phn tch s j thnh tng cc s nguyn dng nh hn hoc
bng i.
Cc cch phn tch ch thuc mt trong 2 nhm:
1. Nhm th nht khng cha gi tr i. Nh vy, j ch c phn tch thnh tng
cc s nguyn dng nh hn i v c F(i-1,j) cch nh vy.
2. Nhm th hai c cha t nht 1 gi tr i. Loi b gi tr i ny, ta s thy s cch
phn tch j theo kiu ny bng s cch phn tch j-i thnh tng cc s nguyn
nh hn hoc bng i, tc l c F(i,j-i) cch. Ch rng iu ny ch ng khi
ta khng xt th t cc s hng trong phn tch. V j phi ln hn hoc bng i
th mi phn tch nh vy c.
Tm li, ta c cng thc quy hoch ng nh sau:
1. F(i,0)=1 vi mi i>0.
2. F(i,j)=F(i-1,j) nu j<i.
3. F(i,j)=F(i-1,j)+F(i,j-i) vi j>=i.
Sau khi xc nh c cng thc quy hoch ng, ta d dng xy dng c thut
ton tnh bng phng n. V cu trc d liu, ta c th s dng mt bng phng n
2 chiu (hoc p dng k thut ci tin da trn nhn xt: tnh F(i) th ch cn F(i1)).
Thut ton tnh bng phng n:
procedure Calculate;
begin
F[0,0]:= 1;
for j := 1 to n do F[i,0] := 0;
for i := 1 to n do begin
for j := 0 to n do
if j<i then F[i,j]:=F[i-1,j]
else F[i,j] := F[i-1,j]+ F[i,j-i];
end;
end;
p s ca bi ton l F(n,n).
b) Bi ton dy s Catalan
Dy s Catalan bc n l mt dy s c nh ngha nh sau:
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:
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.
8.4.4. Bi ton ng thng (Bin-Packing)
8.5. kt lun
Trong chng ny chng ta tm hiu v bn phng php thit k thut ton ph
bin: chia tr, vt cn, quy hoch ng v tham lam. Chng ta cng vn dng
chng, c bit l 3 phng php sau gii cc bi ton ti u.
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 quy hoch ng c phc tp khng ln, cng
chc chn tm c li gii ti u nhng li i hi lng b nh rt ln, nhiu khi
vt qu mc p ng ca h thng. 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. Cn nu b nh rng ri hn th c th
phi hp quy hoch ng v tham lam.