You are on page 1of 37

Mt sphương pháp thiết kế thut gii

Ni dung ca chương này là mt schiến lược thiết kế thut gii như chia để tr, vét

cn, tham lam, quy hoch động

mi phương pháp cháp dng cho nhng lp bài toán phù hp. Ni dung ca chương, ngoài phn trình bày vcác phương pháp còn có nhng ví dcth, cthut gii và cài đặt, để người đọc có mt cái nhìn chi tiết vvic tthut toán đến chương trình.

Mc dù đó là các chiến lược tng quát, tuy nhiên

8.1. Chia để tr(Divide and Conquer)

Chia để trlà mt tư tưởng rt phbiến trong cuc sng và được áp dng rt hiu qutrong Tin hc. Tư tưởng cơ bn ca phương pháp chia để trchia mt bài toán ln, khó gii thành các bài toán tương t, có kích thước nhhơn và dgii hơn sao cho ta có thphi hp kết quca các bài toán con đó để có kết quca bài toán ln.

Rt nhiu thut toán ta gp chương trước đều mang tư tưởng "chia để tr": thut toán sp xếp nhanh Quick sort, thut toán sp xếp trn Merge sort, thut toán tìm kiếm nhphân,… Chúng ta snghiên cu bài toán Tháp Hà ni, là mt bài toán đin hình được gii bng phương pháp chia để tr.

8.1.1. Bài toán Tháp Hà Ni

Có N đĩa có đường kính khác nhau được đặt chng lên nhau theo thtgim dn ca đường kính tính tdưới lên. Có ba vtrí có thể đặt các đĩa đánh s1, 2, 3. Chng đĩa ban đầu được đặt vtrí 1:

đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3
đĩ a ban đầ u đượ c đặ t ở v ị trí 1: 12 3

12

3

Cn chuyn cchng đĩa tvtrí 1 sang vtrí 2, theo nhng quy tc sau:

Khi di chuyn mt đĩa, phi đặt nó vào mt trong ba vtrí đã cho.

Mi ln chcó thchuyn mt đĩa và phi là đĩa trên cùng.

Ti mt vtrí, đĩa nào mi chuyn đến sphi đặt lên trên cùng. Đĩa ln hơn không bao giđược phép đặt lên trên đĩa nhhơn (hay nói cách khác: mt đĩa chđược đặt trên mt đất hoc đặt trên mt đĩa ln hơn)

Bài toán này có ngun gc là mt truyn thuyết ca n độ rng có mt nhóm cao tăng n độ giáo được giao trng trách chuyn dn 64 đĩa vàng gia 3 cc kim cương

theo các điu kin đã nói phn trên. Khi nào hoàn tt công vic, tc là khi chuyn xong toàn b64 đĩa tvtrí ban đầu sang vtrí kết thúc thì cũng là thi đim tn thế.

Chúng ta gii bài toán bng cách chia bài toán chuyn N đĩa, tvtrí 1 sang vtrí 2 thành ba bài toán đơn gin hơn như sau:

1. Chuyn N-1 đĩa trên cùng tvtrí 1 sang vtrí 3, dùng vtrí 2 làm trung gian.

2. Chuyn đĩa thN tvtrí 1 sang vtrí 2.

3. Chuyn N-1 đĩa tvtrí 3 sang vtrí 2, dùng vtrí 1 làm trung gian.

Chú ý rng bài toán 1 và 3 tương tnhư bài toán ban đầu, chkhác là kích thước nhhơn. Chúng cũng sđược gii bng phương pháp “chia để tr” ging như bài toán ban đầu. Ddàng kim tra là khi gii như vy chúng vn thomãn các điu kin. Bài toán 2 thì được gii rt đơn gin.

Thut toán được viết dưới dng gimã như sau:

Procedure Hanoi;

begin

Move(n,1,2,3);

end; Procedure Move(n,a,b,c); {chuyn n đĩa, tvtrí a sang vtrí b, dùng vtrí c làm trung gian } begin

if n=0 then exit;

Move(n-1,a,c,b);

writeln('Chuyn đĩa ',n, ' tvtrí ',a, 'sang vi tri ',b);

Move(n-1,c,b,a);

end;

Chúng ta hãy dng li mt chút để phân tích độ phc tp tính toán. Gi T(n) là sthao tác chuyn đĩa cn thiết để chuyn xong n đĩa. Theo thut toán trên ta có:

T(n) = T(n-1) + 1 + T(n-1).

Bng các phương pháp gii công thc truy hi ta có được T(n) = 2 n -1. Áp dng kết qunày vi githiết rng mi cao tăng phi mt 1 giây để chuyn xong mt đĩa tcc này sang cc kia, ta thy thi gian để chuyn toàn b64 đĩa vàng là T(64)=2 16 - 1=18446744073709551615 giây. Như vy ngày tn thế (nếu có) theo truyn thuyết phi 600 tnăm na mi đến.

Chúng ta sphân tích mt thut toán na để thy được shiu quca phương pháp chia để tr. Bài toán được chn để phân tích tiếp theo là bài toán nhân 2 sln.

8.1.2. Bài toán nhân hai sln

Rt nhiu ng dng trong thc tế đòi hi phi xlí các srt ln, nm ngoài khong biu din ca các kiu cơ sca ngôn nglp trình (chng hn vic tìm các s

nguyên trt ln trong mã hoá RSA). Để gii quyết các yêu cu đó, chúng ta phi xây dng các kiu srt ln và xây dng các phép toán tương ng. Trong phn này ta chxét phép toán nhân đối vi hai srt ln. Githiết chai đều có n chsđược biu din bng mng. Bài toán nhân 2 sln phát biu như sau:

Input. A,B là 2 snguyên có n chs: A=A 1 A 2 ….A n và B=B 1 B 2 ….B n .

Output. C=A.B

Thut toán tnhiên (brute-force) ca bài toán nhân 2 sln là gii thut nhân tay ta vn thc hin: ln lượt nhân tng chsca sthhai vi sthnht, dch kết qutheo vtrí và cng các kết qutrung gian li.

Chng hn để nhân A=1981 và B=1234 ta tiến hành như sau:

1981

× 1234

-------

7924

+ 5943

3962

1981

-------

2444554

Thut toán nhân 2 sln kiu nhân tay được mô tbng gimã:

function Mul(A,B,n) begin

T := 0; for i := 1 to n do begin

D

:= A* B i ;

D

:= D shl (i-1); {dch D sang trái i-1 chs, tc là nhân D vi 10 i-1 }

T

:= T + D;

end;

return T;

end;

Ddàng tính được độ phc tp tính toán ca thut toán này là O(n 2 ). Chúng ta cgng gim bc ca thut toán vi tư tưởng chia để tr. Để đơn gin, ta githiết n=2k và tách A,B dưới dng XY và UV trong đó X,Y,U,V là các scó k chs. Như vy phép nhân 2 sA,B được tính như sau:

A.B = (X.10 k + Y).(U.10 k +V) = XU.10 2k + (XV+YU).10 k +UV.

Kết qulà bài toán nhân 2 sA.B có 2k chsố được chia thành 4 bài toán con nhân các sk chsvà mt sphép cng, tr. Nhưng như vy vn còn nhiu. Ta tiếp tc ci tiến bng nhn xét:

XV+YU = (X+U).(Y+V) - (XY + UV).

Đặt P = XY; Q = UV; R = (X+U).(Y+V). T2 đẳng thc trên ta có:

A.B = P.10 2k + (R-P-Q).10 k +Q.

Như vy bài toán nhân 2 sA.B có n chsđược chia thành 3 bài toán con nhân các sn/2 chsvà mt sphép cng, tr. Thut toán được viết dng gimã như sau:

function Mul(A,B,n) begin

if

n=1 then return A 1 *B 1 ;

 

k

= n / 2;

X

:=A(1

k);

Y := A(k+1

n);

U

:=B(1

k);

V := B(k+1

n);

P

:= Mul(X,Y,k);

Q

:= Mul(X,Y,k);

R

:= Mul(X+U,Y+V,k);

T

:= P shl n + (R-P-Q) shl k + Q;

return T

end;

Để xác định độ phc tp ca thut toán, ta coi là thao tác cơ bn là phép nhân, cng và dch trái tng chs. Gi T(n) là sthao tác cơ bn để thc hin nhân 2 scó n chs. Ta có:

T(n) = 3T(n/2) + C.n

Gii ra ta có T(n) = n log 2 3 = n 1.59 , tc là có mt sci thin so vi thut toán nhân tay. (Tuy nhiên khác bit cũng không rõ rt và chthhin khi n khá ln nên thông thường trong các bài toán không ln lm người ta thường dùng thut toán đầu tiên).

Qua các phn trên chúng ta đã thy được phn nào hiu quca phương pháp chia để tr. Cui chương này chúng ta sgp li tư tưởng chia để trtrong phn nói vphương pháp quy hoch động. Quy hoch động là tư tưởng chia để trtrit để và là mt phương pháp cc kì hiu qa trong vic gii các bài toán ti ưu.

8.2. Vét cn (Exhausted search)

Vét cn, duyt, quay lui… là mt stên gi tuy không đồng nghĩa nhưng cùng chmt phương pháp rt đơn gin trong tin hc: tìm nghim ca mt bài toán bng cách xem xét tt ccác phương án có th. Đối vi con người phương pháp này thường là không khthi vì sphương án cn kim tra quá ln. Tuy nhiên đối vi máy tính, nhtc độ xlí nhanh, máy tính có thgii rt nhiu bài toán bng phương pháp vét cn.

Ưu đim ln nht ca phương pháp vét cn là luôn đảm bo tìm ra nghim chính xác. Ngoài ra phương pháp vét cn còn có mt số ưu đim so vi các phương pháp khác là đòi hi rt ít bnhvà cài đặt đơn gin. Hn chế duy nht ca phương pháp

này là thi gian thc thi rt ln, độ phc tp thường bc mũ. Do đó vét cn thường cháp dng tt vi các bài toán có kích thước nh.

Mc dù vy, không nên coi thường phương pháp này. Rt nhiu bài toán chcó thut toán duy nht là vét cn: tbài toán đơn gin như tìm sln nht trong mt dãy số đến các bài toán NPC. Trong mt stình hung khác, chng hn như thi gian lp trình hn chế thì vét cn có thcoi như mt gii pháp tình thế. Rt nhiu trường hp ta có thsdng vét cn theo phương châm: thà mt 1h để viết mt chương trình vét cn chy trong trong 4 tiếng, còn hơn mt 4 ngày tìm thut toán hiu qa để chương trình chy trong 1 phút.

Chúng ta không đề cp kĩ vvic áp dng phương pháp vét cn đối vi các bài toán đơn gin như tìm giá trnhnht, ln nht hay tìm tt ccác snguyên tca mt tp hp. Chúng ta sxem xét thut toán vét cn đối vi các bài toán tìm cu hình thp và bài toán ti ưu thp, là lp các bài toán rt tng quát và phbiến trong tin hc.

8.2.1. Bài toán tìm cu hình thp

Có rt nhiu bài toán trong Tin hc có yêu cu dng: tìm các đối tượng x thomãn nhng điu kin nht định trong mt tp S các đối tượng cho trước. Bài toán tìm cu hình thp là bài toán yêu cu tìm các đối tượng x có dng là mt vector thomãn các điu kin sau:

1. Đối tượng x gm n phn t: x = (x 1 ,x 2 ,…x n ).

2. Mi phn tx i có thnhn mt trong các giá trri rc a 1 , a 2 , … a m .

3. x thomãn các ràng buc có thcho bi hàm logic G(x).

Tutng trường hp mà bài toán có thyêu cu: tìm mt nghim, tìm tt cnghim hoc đếm snghim.

Trước hết chúng ta nhc li mt scu hình thp cơ bn.

a) Thp

Mt thp chp k ca n là mt tp con k phn tca tp n phn t.

Chng hn tp {1,2,3,4} có các thp chp 2 là: {1,2}, {1,3, {1,4, {2,3}, {2,4}, {3,4}. Vì trong tp hp các phn tkhông phân bit thtnên tp {1,2} cũng là tp {2,1} và do đó, ta coi chúng chlà mt thp.

Bài toán đặt ra cho chúng ta là hãy xác định tt ccác thp châp k ca tp n phn t. Để đơn gin ta chxét bài toán tìm các thp ca tp các snguyên t1

đến n. Đối vi mt tp hu hn bt kì, bng cách đánh sthtca các phn t, ta cũng đưa được vbài toán đối vi tp các snguyên t1 đến n.

Nghim cn tìm ca bài toán tìm các thp chp k ca n phn tphi thomãn các điu kin sau:

1. Là mt vector x =(x 1 ,x 2 ,…x k )

2. x i ly giá trtrong tp {1,2,…n}

3. Ràng buc: x i <x i+1 vi mi giá tri t1 đến k-1.

Có ràng buc 3 là vì tp hp không phân bit thtphn tnên ta sp xếp các phn ttheo thttăng dn.

b) Chnh hp lp

Chnh hp lp chp k ca n là mt dãy k thành phn, mi thành phn là mt phn tca tp n phn t, có xét đến thtvà không yêu cu các thành phn khác nhau.

Mt ví ddthy nht ca chnh hp lp là các dãy nhphân. Mt dãy nhphân độ dài m là mt chnh hp lp chp m ca tp 2 phn t{0,1}. Chng hn 101 là mt dãy nhphân độ dài 3. Ngoài ra ta còn có 7 dãy nhphân độ dài 3 na là 000, 001, 010, 011, 100, 110, 111. Vì có xét thtnên dãy 101 và dãy 011 là 2 dãy khác nhau.

Như vy, bài toán xác định tt ccác chnh hp lp chp k ca tp n phn tyêu cu tìm các nghim như sau:

1. Là mt vector x =(x 1 ,x 2 ,…x k )

2. x i ly giá trtrong tp {1,2,…n}

3. Không có ràng buc nào gia các thành phn.

Chú ý là cũng như bài toán tìm thp, ta chxét đối vi tp n snguyên t1 đến n. Nếu tp hp cn tìm chnh hp không phi là tp các snguyên t1 đến n thì ta có thể đánh scác phn tca tp đó để đưa vtp các snguyên t1 đến n

c) Chnh hp không lp

Khác vi chnh hp lp là các thành phn được phép lp li, tc là có thging nhau, chnh hp không lp chp k ca tp n phn tcũng là mt dãy k thành phn ly ttp n phn tcó xét thtnhưng các thành phn không được phép ging nhau.

Chng hn có n người, mt cách chn ra k người để xếp thành mt hàng là mt chnh hp không lp chp k ca n.

Mt trường hp đặc bit ca chnh hp không lp là hoán v. Hoán vca mt tp n phn tlà mt chnh hp không lp chp n. Nói mt cách trc quan thì hoán vca tp n phn tlà phép thay đổi vtrí ca các phn t(do đó mi gi là hoán v).

Nghim ca bài toán tìm các chnh hp không lp chp k ca tp n snguyên t1 đến n là các vector x thomãn các điu kin:

1. x có k thành phn: x = (x 1 ,x 2 ,…xk)

2. Các giá trxi ly trong tp {1,2, n}

3. Ràng buc: các giá trxi đôi mt khác nhau, tc là xixj vi mi ij.

Đó là mt sbài toán tìm cu hình thp cơ bn. Chúng ta sxem xét mt sbài toán khác để thy tính phbiến ca lp các bài toán dng này.

d) Bài toán xếp hu

Cho bàn cvua nxn. Hãy xếp n con hu lên bàn csao cho không con nào khng chế con nào. Hai 2 con hu khng chế nhau nếu chúng trên cùng mt hàng, mt ct hoc mt đường chéo.

Chng hn ta có mt cách đặt sau, các ô đen là các vtrí đặt hu:

t sau, các ô đ en là các v ị trí đặ t h ậ u:

Để chuyn bài toán này vdng chun ca bài toán tìm cu hình thp, ta có có nhn xét: mi con hu phi trên mt hàng và mt ct. Do đó ta coi con hu thi hàng i và nếu biết x[i] là ct đặt con hu thi thì ta suy ra được li gii. Vy nghim ca bài toán có thcoi là mt vector x gm n thành phn vi ý nghĩa:

1. Con hu thi được đặt hàng i và ct x[i].

2. x[i] ly giá trtrong tp {1,2…n}

3. Ràng buc: các giá trx[i] khác nhau tng đôi mt và không có 2 con hu trên cùng mt đường chéo.

Trong phn cài đặt, chúng ta sphân tích chi tiết vcác ràng buc trên.

e) Bài toán từ đẹp (xâu ABC)

Mt từ đẹp là mt xâu độ dài n chgm các kí tA,B,C mà không có 2 xâu con liên tiếp nào ging nhau. Chng hn ABAC là mt từ đẹp độ dài 4, BABCA là mt từ đẹp độ dài 5.

Bài toán tìm tt ccác từ đẹp độ dài n cho trước yêu cu tìm nghim là các vector x

có n thành phn:

1. xi nhn giá trtrong tp {A,B,C}

2. x không có 2 đon con liên tiếp nào bng nhau.

Trước khi trình bày vphương pháp vét cn gii các bài toán tìm cu hình thp, chúng ta xem xét các bài toán ti ưu thp, vì các bài toán ti ưu thp thc cht là

smrng ca bài toán tìm cu hình thp.

8.2.2. Bài toán ti ưu thp

Bài toán ti ưu tng quát có thphát biu như sau: Cho tp B khác rng và mt hàm f:BR gi là hàm mc tiêu. Cn tìm phn tx thuc B sao cho f(x) đạt giá trnhnht hoc ln nht. Phn tx là nghim ca bài toán còn được gi là phương án ti ưu.

Bài toán ti ưu thp là bài toán tìm phương án ti ưu trên tp các cu hình thp. Nghim ca bài toán cũng là mt vector x gm n thành phn sao cho:

1. x = (x 1 ,x 2 ,…xn)

2. xi ly giá trtrong tp {a 1 ,a 2 ,…am}

3. x thomãn các ràng buc cho bi hàm G(x).

4. f(x) min/max.

Chúng ta sphân tích mt sbài toán ti ưu thp đin hình. Phn ln đều là các bài toán NPC.

a) Bài toán xếp balô

Có mt balô có ti trng m và n đồ vt, đồ vt i có trng lượng wi và có giá trvi. Hãy la chn các vt để cho vào balô sao cho tng trng lượng ca chúng không quá

M và tng giá trca chúng là ln nht.

Mi cách chn các đồ vt cho vào balô đều tương ng vi mt vector x gm n thành phn mà xi=1 nếu chn đưa vt thi vào balô, và xi=0 nếu vt thi không được chn.

Khi đó ràng buc tng trng lượng các đồ vt không quá ti trng ca balô được viết thành:

n

=

i

1

x w

i

i

m

Hàm mc tiêu là tng giá trca các đồ vt được chn:

f (x)

=

n

=

i

1

x v

i

i

max

Nghim ca bài toán cũng là mt vector x gm n thành phn sao cho:

1.

2.

3.

4.

x = (x 1 ,x 2 ,…xn)

xi ly giá trtrong tp {0,1}

Ràng buc:

n

=

i

1

f (x)

=

n

=

i

1

x v

i

i

x w

i

i

m

max .

b) Bài toán người du lch

Có n thành ph, d[i,j] là chi phí để di chuyn tthành phi đến thành phj. (Nếu không có đường đi thì d[i,j] = ). Mt người mun đi du lch qua tt ccác thành ph, mi thành phmt ln ri trvnơi xut phát sao cho tng chi phí là nhnht. Hãy xác định mt đường đi như vy.

Phương án ti ưu ca bài toán cũng là mt vector x, trong đó xi là thành phsđến thăm ti ln di chuyn thi. Các điu kin ca x như sau:

1. x = (x 1 ,x 2 ,…xn)

2. xi ly giá trtrong tp {1,2,…n}

3. Ràng buc: xi xj vi mi ij và d[xi,xi +1 ]<vi mi i=1,2,

4.

f(x) =

n

=

i

1

d[x , x

i

i

+

1

]

min

n, coi xn +1 =x 1 .

Trên đây ta đã xét mt sbài toán tìm cu hình thp và bài toán ti ưu thp. Trong phn tiếp chúng ta stìm hiu phương pháp vét cn gii các bài toán đó.

8.2.3. Phương pháp vét cn gii các bài toán cu hình thp và ti ưu thp

Phương pháp vét cn là phương pháp rt tng quát để đơn gin để gii các bài toán cu hình thp và ti ưu thp. ý tưởng cơ bn là: bng mt cách nào đó sinh ra tt

ccác cu hình có thri phân tích các cu hình bng các hàm ràng buc và hàm mc tiêu để tìm phương án ti ưu (do đó phương pháp này còn được gi là duyt toàn b).

Da trên ý tưởng cơ bn đó, người ta có 3 cách tiếp cn khác nhau để duyt toàn bcác phương án.

Phương pháp thnht là phương pháp sinh tun t. Phương pháp này cn xác định mt quan hthttrên các cu hình (gi là thttừ đin) và mt phép biến đổi để biến mt cu hình thành cu hình ngay sau nó. Mi ln sinh được mt cu hình thì tiến hành định giá, so sánh vi cu hình tt nht đang có và cp nht nếu cu hình mi tt hơn.

Gimã ca thut toán tìm cu hình ti ưu bng phương pháp sinh như sau:

Procedure Generate; begin x := FirstConfig; best := x; Repeat

x

:= GenNext(x);

if

f(x) "tt hơn" f(best) then best := x;

Until x = LastConfig;

end;

Thut toán thc hin như sau: tìm cu hình đầu tiên và coi đó là cu hình tt nht. Sau đó ln lượt sinh các cu hình tiếp theo, mi ln sinh được mt cu hình ta so sánh nó vi cu hình tt nht hin có (best) và nếu nó tt hơn thì cp nht best. Quá trình dng li khi ta sinh được cu hình cui cùng. Kết quta được phương án ti ưu là best.

Phương pháp sinh tun tthường rt khó áp dng. Khó khăn chyếu là do vic xác định thttừ đin, cu hình đầu tiên, cu hình cui cùng và phép biến đổi mt cu hình thành cu hình tiếp theo thường là không ddàng.

Phương pháp thhai là phương pháp thsai quay lui (Backtracking). Tư tưởng cơ bn ca phương pháp là xây dng tng thành phn ca cu hình, ti mi bước xây dng đều kim tra các ràng buc và chtiếp tc xây dng các thành phn tiếp theo nếu các thành phn hin ti là thomãn. Nếu không còn phương án nào để xây dng thành phn hin ti thì quay li, xây dng li các thành phn trước đó.

Gimã ca thut toán 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 hơn" f(best) then best := x; end;

Trong đon mã này, hàm Ok để kim tra các thành phn được sinh ra có thomãn các ràng buc hay không, còn hàm Next trli la chn tiếp theo ca mi thành phn.

Nhìn chung phương pháp quay lui làm gim đáng knhng khó khăn ca phương pháp sinh (không cn tìm thttừ đin và nht là không cn tìm quy tc sinh cu hình tiếp theo). Tuy nhiên, trong mt sbài toán mà cn đánh du trng thái, phương pháp quay lui không đệ quy được trình bày trên phi xlí phc tp hơn nhiu so vi phương pháp quay lui đệ quy.

Phương pháp quay lui đệ quy là phương pháp đơn gin và tng quát nht để sinh các cu hình thp. Do cơ chế cc bhoá ca chương trình con đệ quy và khnăng quay li đim gi đệ quy, thao tác quay lui trthành mc định và không cn xlý mt cách tường minh như phương pháp quay lui không đệ quy.

Mô hình cơ bn ca phương pháp 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 thái mi>; if i=n then Update else Try(i+1); <trli trng thái cũ>; end;

end; procedure Update; begin if f(x) "tt hơn" f(best) then best := x; end;

Để duyt tòan bcác cu hình, ban đầu ta gi đến Try(1). Try(1) sla chn cho x 1 mt giá trthích hp đầu tiên, ghi nhn trng thái ri gi đệ quy đến Try(2). Try(2) li la chn mt giá trcho x 2 , ghi nhn trng thái và gi đến Try(3). Cnhư vy bước thi, thut toán tìm mt giá trcho xi, ghi nhn trng thái ri gi đệ quy để sinh thành phn xi +1 . Khi sinh đủ n thành phn ca x thì dng li để cp nht phương án ti ưu. Nếu mi khnăng ca xi +1 đều đã xét qua thì vòng for ca Try(i+1) thc hin xong, theo cơ chế đệ quy chương trình squay về đim gi đệ quy ca Try(i). Trng thái cũ trước khi chn xi được phc hi và vòng for ca Try(i) stiếp tc để chn giá trphù hp tiếp theo ca xi, đó chính là thao tác quay lui. Khi quay lui vđến Try(1) và xét hết mi khnăng ca x 1 thì chương trình con đệ quy kết thúc và ta đã duyt được toàn bcác c