[r]
(1)Bài 3: Bài toán liệt kê tổ hợp BÀI 3: BÀI TOÁN LIỆT KÊ TỔ HỢP
Giới thiệu
Bài học trình bày nội dung toán liệt kê tổ hợp, toán quan tâm đến tất cấu hình có, lời giải cần biểu diễn dạng thuật toán “vét cạn” tất cấu hình Lời giải trường hợp cụ thể máy tính giải nhờ chạy chương trình cài đặt theo thuật tốn tìm Bài toán liệt kê thường “làm nền” cho nhiều toán khác Hiện nay, số toán tổ hợp chưa có cách giải ngồi cách giải liệt kê Khó khăn cách giải có q nhiều cấu hình, nhiên tính khả thi phương pháp liệt kê ngày nâng cao nhờ tiến nhanh chóng chất lượng máy tính điện tử
Nội dung Mục tiêu
Giới thiệu toán liệt kê tổ hợp
Trình bày thuật tốn quay lui
Liệt kê số cấu hình
Thờilượng học tiết
Sau học này, bạn có thể:
Nắm yêu cầu toán liệt kê tổ hợp
Sử dụng thuật toán quay lui việc thực toán liệt kê tổ hợp
Liệt kê số câu hình như: liệt kê dãy nhị phân, liệt kê hoán vị, liệt kê tổ hợp
(2)Bài 3: Bài toán liệt kê tổ hợp
TÌNH HUỐNG DẪN NHẬP Tình
“Tìm cách xếp quân Hậu bàn cờ Vua cho khơng có qn ăn quân nào”
Câu hỏi
(3)Bài 3: Bài toán liệt kê tổ hợp
3.1 Giới thiệu toán
Bài toán liệt kê tổ hợp nhằm đưa cấu hình cho khơng bỏ sót khơng trùng lặp Như vậy, khác với cách giải thông thường, trình bày lập luận, chứng minh, hay tính tốn qua cơng thức, lời giải tốn phải trình bày dạng thuật tốn, bước xây dựng cấu hình thỏa mãn điều kiện nêu
Vào thời chưa có máy tính, máy tính cịn dạng sơ khai, việc liệt kê chủ yếu nhờ vào sức thủ cơng, kết hạn chế Khi đó, việc liệt kê thực tốn kích thước khơng đáng kể, nhằm minh họa số khái niệm hay kiểm chứng vài kết đơn giản Hiện nay, với phát triển mạnh mẽ máy tính, tốc độ lên tới hàng triệu phép tính giây, việc liệt kê nhờ máy tính ngày khả thi giải pháp liệt kê ngày ý, nhờ mà số tốn tồn đọng hàng kỷđã giải
Với hỗ trợ máy tính, tốn liệt kê thường làm để giải toán tổ hợp khác (các tốn đếm, tồn tại, tối ưu) tình khơng cịn lựa chọn tốt Khó khăn tốn số cấu hình thường q lớn mà việc chờ đợi kết vượt khả thực thi máy tính Để khắc phục khó khăn này, mặt người cố gắng xây dựng thuật toán hữu hiệu, mặt nâng cao khả xử lý máy tính Việc nghiên cứu chế tạo máy tính có nhiều xử lý đồng thời với việc phát triển giải thuật song song chắn nâng cao tính khả thi toán liệt kê lên nhiều
Bài giới thiệu thuật toán mang tính phổ dụng tốn hữu hạn cho phép liệt kê cấu hình cách cài đặt chương trình máy tính
3.2 Thuật toán quay lui
Thuật toán quay lui thực chất thuật toán duyệt tất khả xây dựng cấu hình cho khơng bỏ sót khơng trùng lặp Thơng thường cấu hình biểu diễn dạng có thứ tự (x1, x2, , xn), thành phần xác định từ tập giá trị (hữu hạn) đấy, thỏa mãn điều kiện đề
Nội dung thuật toán quay lui xác định thành phần cấu hình thành phần Để xác định thành phần, ta thử tất giá trị cho trạng thái thành phần trước xác định Vì thế, thích hợp phát biểu thuật toán quy nạp
Giả sử xác định thành phần x1, x2, , xi − Dưới bước xác định thành phần xi (bước thử thứ i) Gọi Si tập giá trị thử cho xi (gọi tập đề cử, xác định từ điều kiện cấu hình) Duyệt tất giá trị j thuộc Si thử cho xi Xảy hai tình huống:
Có j mà việc thử cho xi chấp nhận (dựa vào điều kiện cấu hình) Khi gán j cho xi Nếu i = n (xi thành phần cuối) liệt kê cấu hình (sau duyệt j tiếp, hết, lùi lại bước trước để thử giá trị khác cho xn − 1), trái lại sang bước i + để xác định thành phần
(4)Bài 3: Bài toán liệt kê tổ hợp Để khơng bỏ sót, tập giá trị đề cử Si cho xi cần phải xem xét cách cẩn thận, giá trị đề cử chấp nhận được, bỏ sót giá trịđề cử dẫn đến bỏ sót cấu hình Để khơng trùng lặp, bước tìm kiếm, ta phải lưu lại thông tin cần thiết để lùi lại, không thử giá trị thử Những thông tin cần cất giữ theo chế vào sau, trước (ngăn xếp) Để cài đặt, tốt dùng ngôn ngữ lập trình cho phép gọi đệ quy Với ngơn ngữ này, ta tận dụng chế ngăn xếp việc đệ quy mà tự tổ chức lấy ngăn xếp Điều làm việc viết chương trình trở nên đơn giản nhiều Hiện ngôn ngữ thuật tốn cài đặt máy tính C, Pascal có khả
Nội dung thuật tốn quay lui mơ tả qua thủ tục đệ quy (viết mô theo ngôn ngữ Pascal):
Thuật toán quay lui
PROCEDURE TRY (i: INTEGER);
VAR j: INTEGER;
BEGIN
FOR (j thuộc Si) DO
IF (chấp nhận j) THEN BEGIN
xi := j;
IF (i = n) THEN (ghi nhận cấu hình) ELSE
TRY(i+1);
END; END;
Thủ tục TRY(i) xác định xi cách duyệt tất giá trị đề cử cho (vịng lặp FOR) Trong thủ tục có khai báo biến địa phương j dùng để duyệt giá trị đề cử (khơng tính tổng qt, ta giả thiết giá trị nguyên) Khi xác định xong xi, việc tiến hành bước tiếp thực lời gọi đệ quy TRY(i+1) Khi xong vòng lặp duyệt, thủ tục TRY(i) kết thúc, trở vòng lặp duyệt TRY(i−1) để tiếp tục thử giá trịđề cử khác cho xi−1
(5)Bài 3: Bài toán liệt kê tổ hợp Trong TRY(i), mệnh đề (chấp nhận j) một biểu thức lôgic, phụ thuộc j mà nhiều tình cịn phụ thuộc vào giá trịđã thửở bước trước, để tính biểu thức này, ta cần tổ chức thêm biến phụ (được khai báo toàn cục) ghi nhận thay đổi trạng thái tốn sau bước tìm kiếm (vì biến gọi biến trạng thái) Độ phức tạp biến phụ thuộc vào độ phức tạp cấu hình cần liệt kê Nếu có mặt biến vậy, TRY(i) cần thêm vào khối lệnh (ghi nhận trạng thái mới), (trả trạng thái cũ), nhằm cập nhật lại giá trị biến nơi thích hợp, nhưđề nghị đây:
Vòng lặp đệ quy lồng Try(i)
PROCEDURE TRY (i: INTEGER);
VAR j: INTEGER;
BEGIN
FOR (j thuộc Si) DO IF (chấp nhận j) THEN BEGIN
xi := j;
(ghi nhận trạng thái mới);
IF (i = n) THEN (ghi nhận cấu hình) ELSE TRY(i+1);
(trả trạng thái cũ); END;
END;
TRY(i) khởi động lời gọi TRY(1) chương trình Khi TRY(1) kết thúc, q trình liệt kê hoàn tất Dĩ nhiên, trước gọi TRY(1), chương trình cần phải gọi thủ tục nhập liệu khởi gán giá trị ban đầu Cũng nên thiết kế thủ tục làm nhiệm vụ (ghi nhận cấu hình) được gọi TRY(i), nhằm xử lý cấu hình nhận cho phù hợp với u cầu tốn (có thể đưa hình, ghi file, áp dụng thao tác cấu hình này) Chẳng hạn, dùng liệt kê để giải tốn đếm, thủ tục đơn giản tăng biến đếm lên đơn vị (biến đếm cần khởi gán 0), cần chứng minh có cấu hình (bài tốn tồn tại), nhận cấu hình đầu tiên, ta kết thúc Thứ tự liệt kê cấu hình phụ thuộc vào thứ tự duyệt giá trịđề cử cho thành phần Thông thường giá trịđề cửđược xếp tăng dần, biểu diễn cấu hình sẽđược xếp theo thứ tự từđiển
Tên gọi thuật toán quay lui, xuất phát từ nội dung Thuật tốn biết đến với tên gọi thuật toán thử-sai
(6)Bài 3: Bài toán liệt kê tổ hợp Mục đưa số thí dụ minh họa việc dùng thuật toán quay lui để liệt kê số cấu hình đơn giản, chương trình cài đặt theo khn dạng sau:
Ví dụ: Thuật tốn quay lui
PROCEDURE INIT; PROCEDURE OUT;
PROCEDURE TRY(i: INTEGER); BEGIN (* chương trình chính*) INIT;
TRY(1); END
Thủ tục INIT nhập liệu khởi gán giá trị ban đầu, thủ tục OUT đếm đưa cấu hình x1, x2, , xn xây dựng xong, thủ tục TRY(i) thực việc xác định xi đệ quy
Trong thủ tục trên, thủ tục TRY(i) quan trọng Vì thí dụ minh họa, chủ yếu chúng tơi trình bày việc phân tích thiết kế thủ tục
3.3 Liệt kê số cấu hình đơn giản 3.3.1 Liệt kê dãy nhị phân
Một dãy nhị phân độ dài n (còn gọi chuỗi n bit) có thứ tự gồm n thành phần (x1, x2, , xn) thành phần xi nhận hai giá trị 0, Trong toán đếm ta biết số dãy nhị phân độ dài n 2n, ta giải toán liệt kê tất dãy nhị phân độ dài n cách viết chương trình theo mơ hình cài đặt
Theo định nghĩa dãy nhị phân, giá trịđề cử cho xi {0, 1}, việc chọn giá trị hay cho thành phần chấp nhận, không phụ thuộc vào giá trị thành phần trước Đây trường hợp mà TRY(i) có dạng đơn giản nhất, khơng có khối (chấp nhận j), (ghi nhận trạng thái mới), (trả trạng thái cũ)
Thuật tốn tìm kiếm quay lui dãy nhị phân
PROCEDURE TRY (i: INTEGER);
VAR j: INTEGER;
BEGIN
FOR j := TO DO BEGIN
xi := j;
IF (i = n) THEN OUT ELSE TRY(i+1); END;
(7)Bài 3: Bài tốn liệt kê tổ hợp Các bước tìm kiếm quay lui dãy nhị phân độ dài mô tả liệt kê đây:
Kết chạy chương trình với n = 3, ta 23 = dãy nhị phân theo thứ tự sau:
1) 0 5) 0
2) 0 7) 1
3) 8) 1
4) 1 9) 1
3.3.2 Liệt kê hoán vị
Một hoán vị phần tử 1, 2, , n cách xếp thứ tự phần tửđó Như ta biểu diễn hốn vị xét có thứ tự gồm n thành phần (x1, x2, , xn) thành phần xi lấy giá trị khác tập {1, 2, , n} Từđó nhận tập đề cử cho xi {1, 2, , n} điều kiện chấp nhận j cho xi j không trùng với giá trịđã gán cho thành phần trước (j chưa dùng) Để kiểm tra điều kiện này, ta xây dựng biến lôgic bj (j = 1, 2, , n), đóng vai trị biến trạng thái, biến bj kiểm soát trạng thái j với quy ước bj TRUE j chưa dùng bj FALSE trái lại Khi đó, mệnh đề (chấp nhận j) (bj) câu lệnh (ghi nhận trạng thái mới), (trả trạng thái cũ) tương ứng với lệnh gán (bj := FALSE) (bj := TRUE) Các biến trạng thái bj cần phải khởi gán tất TRUE trước gọi TRY(1)
Thuật tốn tìm kiếm quay lui hoán vị
PROCEDURE TRY (i: INTEGER);
VAR j: INTEGER;
BEGIN
FOR j := TO n DO
IF (bj) THEN BEGIN
xi := j;
bj := FALSE;
IF (i = n) THEN OUT ELSE TRY(i+1);
bj := TRUE;
END;
END;
Các bước tìm kiếm quay lui hốn vịđộ dài mơ tả liệt kê đây:
0
0
0
0
1
1
1 1 1