Bài 3: Bài toán lit kê t hp
v1.0 69
BÀI 3: BÀI TOÁN LIT KÊ T HP
Gii thiu
Bài hc này trình bày ni dung bài toán lit
kê t hp, bài toán này quan tâm đến tt c
các cu hình có th có, vì thế li gii ca nó
cn được biu din dưới dng thut toán
“vét cn” tt c các cu hình. Li gii trong
tng trường hp c th s được máy tính
gii quyết nh chy mt chương trình cài đặt
theo thut toán đã tìm. Bài toán lit kê
thường được “làm nn” cho nhiu bài toán
khác. Hin nay, mt s bài toán t hp vn
chưa có cách nào gii ngoài cách gii lit kê.
Khó khăn chính ca cách gii này là có quá
nhiu cu hình, tuy nhiên tính kh thi ca
phương pháp lit kê ngày càng được nâng
cao nh s tiến b nhanh chóng v cht
lượng ca máy tính đin t.
Ni dung Mc tiêu
Gii thiu bài toán lit kê t hp
Trình bày thut toán quay lui
Lit kê mt s cu hình cơ bn
Thi lượng hc
6 tiết
Sau khi hc bài này, các bn có th:
Nm được yêu cu ca bài toán lit kê t
hp.
S dng thut toán quay lui trong vic
thc hin bài toán lit kê t hp.
Lit kê được mt s câu hình cơ bn như:
lit kê dãy nh phân, lit kê hoán v, lit
kê t hp.
S dng các kiến thc ca bài toán lit
kê trong vic gii quyết mt s tình hung
thc tế.
Bài 3: Bài toán lit kê t hp
70 v1.0
TÌNH HUNG DN NHP
Tình hung
“Tìm cách xếp 8 quân Hu trên bàn c Vua sao cho không có
quân nào ăn được quân nào”.
Câu hi
Có bao nhiêu cách xếp hu tha mãn yêu cu ca bài toán và đó là nhng cách nào?
Bài 3: Bài toán lit kê t hp
v1.0 71
3.1. Gii thiu bài toán
Bài toán lit kê t hp nhm ln lượt đưa ra tng cu hình sao cho không b sót
không trùng lp. Như vy, khác vi nhng cách gii thông thường, trong đó trình bày
các lp lun, chng minh, hay các tính toán qua các công thc, li gii ca bài toán
này phi được trình bày dưới dng thut toán, trong đó ch ra các bước xây dng tng
cu hình tha mãn điu kin đã nêu.
Vào thi chưa có máy tính, hoc máy tính còn dưới dng sơ khai, vic lit kê ch yếu
nh vào sc th công, vì thế kết qu rt hn chế. Khi đó, vic lit kê ch được thc
hin trên nhng bài toán kích thước không đáng k, nhm minh ha mt s khái nim
hay kim chng mt vài kết qu đơn gin. Hin nay, vi s phát trin mnh m ca
máy tính, tc độ lên ti hàng triu phép tính trong mt giây, vic lit kê nh máy tính
ngày càng kh thi và gii pháp lit kê ngày càng được chú ý, nht là nh nó mà mt s
bài toán tn đọng hàng thế k đã được gii quyết.
Vi s h tr ca máy tính, bài toán lit kê thường được làm nn để gii quyết nhng
bài toán t hp khác (các bài toán đếm, tn ti, ti ưu) trong nhng tình hung không
còn la chn tt hơn. Khó khăn chính ca bài toán này là s cu hình thường quá ln
mà vic ch đợi kết qu vượt quá kh năng ngay c khi thc thi bng máy tính. Để
khc phc khó khăn này, mt mt con người c gng xây dng nhng thut toán hu
hiu, mt mt nâng cao kh năng x lý ca máy tính. Vic nghiên cu chế to các
máy tính có nhiu b xđồng thi vi vic phát trin các gii thut song song chc
chn s nâng cao tính kh thi ca nhng bài toán lit kê lên rt nhiu.
Bài này gii thiu mt thut toán cơ bn mang tính ph dng ca toán hu hn cho
phép lit kê các cu hình và cách cài đặt nó bng mt chương trình trên máy tính.
3.2. Thut toán quay lui
Thut toán quay lui thc cht là thut toán duyt tt c các kh năng xây dng cu
hình sao cho không b sót và không trùng lp. Thông thường mt cu hình được biu
din dưới dng mt b có th t (x1, x2, ..., xn), trong đó các thành phn được xác định
t nhng tp giá tr (hu hn) nào đấy, tha mãn nhng điu kin đề ra.
Ni dung ca thut toán quay lui là ln lượt xác định các thành phn ca cu hình bt
đầu t thành phn đầu tiên. Để xác định mt thành phn, ta th tt c các giá tr kh dĩ
cho nó trong trng thái các thành phn trước đấy đã được xác định. Vì thế, thích hp
hơn c là phát biu thut toán này bng quy np.
Gi s đã xác định được các thành phn x1, x2, ..., xi 1. Dưới đây là bước xác định
thành phn xi (bước th th i). Gi Si là tp các giá tr th cho xi (gi là tp đề c, nó
được xác định t nhng điu kin ca cu hình). Duyt tt c các giá tr j thuc Si
th nó cho xi. Xy ra hai tình hung:
Có mt j mà vic th cho xi là chp nhn được (da vào các điu kin ca cu hình).
Khi đó gán j cho xi. Nếu i = n (xi là thành phn cui) thì lit kê được mt cu hình
(sau đó duyt j tiếp, nếu hết, lùi li bước trước để th giá tr khác cho xn 1), trái li
sang bước i + 1 để xác định thành phn kế tiếp.
Mi j thuc Si đều không được chp nhn. Khi đó lùi v bước trước để th giá tr
khác cho xi 1.
Bài 3: Bài toán lit kê t hp
72 v1.0
Để không b sót, tp giá tr đề c Si cho xi cn phi xem xét mt cách cn thn, mc
dù không phi giá tr đề c nào cũng chp nhn được, nhưng nếu b sót giá tr đề c
thì s dn đến b sót cu hình. Để không trùng lp, trong mi bước tìm kiếm, ta phi
lưu li nhng thông tin cn thiết để khi lùi li, không th nhng giá tr đã th ri.
Nhng thông tin này cn được ct gi theo cơ chế vào sau, ra trước (ngăn xếp).
Để cài đặt, tt hơn c là dùng mt ngôn ng lp trình cho phép gi đệ quy. Vi nhng
ngôn ng này, ta tn dng được cơ chế ngăn xếp ca vic đệ quy mà không phi t t
chc ly ngăn xếp. Điu này làm vic viết chương trình tr nên đơn gin rt nhiu.
Hin nay các ngôn ng thut toán được cài đặt trên máy tính như C, Pascal đều có kh
năng này.
Ni dung ca thut toán quay lui có th mô t qua th tc đệ quy dưới đây (viết mô
phng theo ngôn ng Pascal):
Thut toán quay lui
PROCEDURE TRY (i: INTEGER);
VAR j: INTEGER;
BEGIN
FOR (j thuc Si) DO
IF (chp nhn j) THEN
BEGIN
xi := j;
IF (i = n) THEN (ghi nhn mt cu hình) ELSE
TRY(i+1);
END;
END;
Th tc TRY(i) xác định xi bng cách duyt tt c các giá tr đề c cho nó (vòng lp
FOR). Trong th tc có khai báo biến địa phương j dùng để duyt các giá tr đề c
(không mt tính tng quát, ta có th gi thiết các giá tr này là nguyên). Khi xác định
xong xi, vic tiến hành bước tiếp được thc hin bng li gi đệ quy TRY(i+1). Khi
xong vòng lp duyt, th tc TRY(i) kết thúc, và tr v vòng lp duyt ca TRY(i1)
để tiếp tc th các giá tr đề c khác cho xi1.
Vòng lp đệ quy lng nhau ca TRY(i)
Bài 3: Bài toán lit kê t hp
v1.0 73
Trong TRY(i), mnh đề (chp nhn j) là mt biu thc lôgic, không nhng ph thuc
j mà trong nhiu tình hung còn ph thuc vào các giá tr đã th nhng bước trước,
vì thế để tính biu thc này, ta cn t chc thêm nhng biến ph (được khai báo toàn
cc) ghi nhn s thay đổi trng thái ca bài toán sau mi bước tìm kiếm (vì thế các
biến này được gi là các biến trng thái). Độ phc tp ca nhng biến này ph thuc
vào độ phc tp ca cu hình cn lit kê. Nếu có mt nhng biến như vy, trong TRY(i)
cn thêm vào các khi lnh (ghi nhn trng thái mi), (tr v trng thái cũ), nhm cp
nht li giá tr ca các biến này ti nhng nơi thích hp, như đề ngh dưới đây:
Vòng lp đệ quy lng nhau ca Try(i)
PROCEDURE TRY (i: INTEGER);
VAR j: INTEGER;
BEGIN
FOR (j thuc Si) DO
IF (chp nhn j) THEN
BEGIN
xi := j;
(ghi nhn trng thái mi);
IF (i = n) THEN (ghi nhn mt cu hình) ELSE TRY(i+1);
(tr v trng thái cũ);
END;
END;
TRY(i) được khi động bng li gi TRY(1) trong chương trình chính. Khi TRY(1)
kết thúc, quá trình lit kê được hoàn tt. Dĩ nhiên, trước khi gi TRY(1), trong chương
trình chính cn phi gi các th tc nhp d liu và khi gán các giá tr ban đầu. Cũng
nên thiết kế mt th tc làm nhim v (ghi nhn mt cu hình) được gi trong
TRY(i), nhm x lý cu hình nhn được cho phù hp vi yêu cu ca bài toán (có th
đưa ra màn hình, ghi ra file, hoc áp dng mt thao tác nào đấy trên cu hình này).
Chng hn, nếu dùng lit kê để gii bài toán đếm, thì th tc này đơn gin là tăng biến
đếm lên mt đơn v (biến đếm cn được khi gán 0), nếu ch cn chng minh có cu
hình (bài toán tn ti), thì khi nhn được cu hình đầu tiên, ta có th kết thúc ngay.
Th t lit kê các cu hình ph thuc vào th t duyt các giá tr đề c cho mi thành
phn. Thông thường các giá tr đề c được sp xếp tăng dn, khi đó các biu din cu
hình s được xếp theo th t t đin.
Tên gi thut toán quay lui, xut phát t chính ni dung ca nó. Thut toán này cũng
được biết đến vi tên gi thut toán th-sai.
Cũng chú ý rng, trên đây ch là mô hình có tính cht định hướng cho vic xây dng
chương trình thc hin thut toán quay lui. Ni dung c th ca nó ph thuc vào kết
qu phân tích cu hình, trong đó vic t chc d liu để mô t cu hình, vic xác định
các tp đề c, vic xây dng các biến trng thái và biu thc kim tra giá tr th, ...
đóng mt vai trò quan trng trong vic quyết định cht lượng ca chương trình. Ngoài
vic nm vng ngôn ng được dùng, người lp trình cn phi có nhng kiến thc toán
hc nht định, liên quan đến vn đề đang xét.