Professional Documents
Culture Documents
Tập hợp và phần tử là những khái niệm toán học nguyên sơ, không thể định
nghĩa mà ta chỉ có thể mô tả chúng.
Có 2 cách mô tả tập hợp:
Cách thứ nhất:
Tất cả những đối tượng có một hoặc một vài tính chất chung nào đó tạo thành
một tập hợp (đôi khi nói ngắn gọn là một tập); khi đó mỗi đối tượng là một phần
tử của tập hợp đó.
Thí dụ 1. Tập hợp các số nguyên dương tạo nên tập N+.
N {1, 2, 3, ..., n, ...} . Khi đó các số 1, 2, 3, … là các phần tử của N+. Các
phần tử của N+ có 2 tính chất chung: đó là nguyên và dương.
Thí dụ 2. A {1, 3, 5, 7, ...} là tập hợp các số nguyên dương lẻ. Các phần tử
của A có 3 tính chất chung là nguyên, dương và lẻ.
Nếu x là phần tử của A ta viết x A ; nếu x không phải phần tử của A thì ta
viết x A .
Khi mô tả tập hợp theo cách này phải đạt được yêu cầu sau đây: Khi đưa ra
một đối tượng bất kỳ thì các tính chất chung mà chúng ta nêu lên phải đủ để
khẳng định đối tượng đó có phải là phần tử của tập hợp hay không.
Trong thí dụ 2: số 15 A ; số 16 A vì 16 không có tính chất lẻ.
Trong trường hợp yêu cầu trên không đạt được ta phải dùng cách khác.
Cách thứ hai:
Liệt kê các phần tử của tập hợp.
Thí dụ 1. B {2, 4, 5, 6, 8}
Khi mô tả tập hợp theo cách này thì lại không đòi hỏi các phần tử của tập hợp
phải có một tính chất nào giống nhau.
Thí dụ 2. C {0, a, Hà Nội, *}.
1.1.1. Tập hữu hạn và tập vô hạn.
Số lượng phần tử của A gọi là bản số của A; ký hiệu là |A| hay N(A); đó là
một số nguyên dương.
Nếu |A| là một số hữu hạn thì A là tập hữu hạn, còn gọi là tập rời rạc. Toán
rời rạc chỉ quan tâm đến các tập rời rạc.
Nếu A không phải tập hữu hạn thì A là tập vô hạn.
Thí dụ.
A {2, 4, 6, 8} là tập hữu hạn.
N {0, 1, 2, ...,n, ...} : tập các số tự nhiên là tập vô hạn.
Z {0, 1, 2, ..., n, ...} : tập các số nguyên là tập vô hạn.
1
1.1.2. Tập rỗng.
Nếu | A | 0 thì A gọi là tập rỗng, đó là tập không chứa một phần tử nào.
Việc đưa vào tập rỗng rất có ý nghĩa khi ta nghiên cứu về các phép toán trên tập
hợp.
Thí dụ.
A là tập các nghiệm số thực của phương trình x 2 3x 2 0 thì
A {1, 2} .
Còn tập nghiệm thực của phương trình x 2 x 1 0 là một tập rỗng vì
phương trình này không có nghiệm thực.
Ta ký hiệu tập rỗng là .
1.1.3. Sự bằng nhau của hai tập.
Hai tập A và B gọi là bằng nhau (ta viết A B ) nếu chúng bao gồm những
phần tử như nhau, nghĩa là:
xA x B
Thí dụ.
A {x, 2, 5, 4} và B {5, x, 4, 2} là hai tập bằng nhau.
Thứ tự hay vị trí của các phần tử không quan trọng.
1.1.4. Sự bao hàm và tập con.
Nếu x A x B thì ta nói:
A bao hàm trong B hoặc A chứa trong B.
B bao hàm A hay B chứa A.
A là tập con của B.
Để diễn đạt điều này ta viết A B hay B A .
Vậy
A B nếu A B và B A
A chứa các phần tử của nó.
Tập rỗng là tập con của mọi tập A.
Để hình dung quan hệ giữa hai tập người ta dùng sơ đồ Ven để biểu diễn hình
học một tập, coi mỗi tập là một vòng phẳng kín, mỗi điểm bên trong là một phần
tử của tập đó. Khi đó quan hệ A B được biểu thị bởi hình 1 – vòng A nằm
trong vòng B.
A
B
Hình 1
2
1.1.5. Tập vũ trụ.
Tập vũ trụ ký hiệu là U, đó là tập bao hàm mọi tập khác; khi biểu diễn tập U
bằng sơ đồ Ven, người ta dùng 1 hình vuông hoặc hình chữ nhật. Khi đó mọi tập
khác đều nằm trong hình vuông hoặc hình chữ nhật đó (Hình 2).
C
A
B
Hình 2
Từ hai tập A và B cho trước tạo ra một tập mới theo một cách nào đó, ta gọi
đó là phép hợp thành. Mỗi phép hợp thành như thế là một phép toán tập hợp.
A B
AB
Hình 3
3
Thí dụ. A {1, 3, 5}, B {1, 2, 3} A B {1, 2, 3, 5}
A B
AB
Hình 4
Thí dụ. Cũng trong thí dụ trên A {1, 3, 5}, B {1, 2, 3} thì
A B {1, 3}
Nếu A B thì ta nói rằng A và B là hai tập rời nhau.
Thí dụ: A {1, 3, 5, 7, 9}, B {2, 4, 6, 8} là hai tập rời nhau vì
A B .
A B
A\B
Hình 5
Thí dụ. A {1, 2, 5}, B {1, 2, 3} A\B = {5}
4
A A
Hình 6
Luật De Morgan:
A E; B E ta có:
a) A B A B
b) A B A B
Các phép toán a) và b) có thể mở rộng cho n tập; khi đó định luật De Morgan
sẽ có dạng tổng quát sau đây:
Ai Ai
i I i I
Ai Ai
i I i I
Các phép toán nêu trên thỏa mãn các đẳng thức dưới đây mà ta gọi đó là các
luật
Đẳng thức Tên gọi
A A
Luật đồng nhất
AUA
AUU
Luật nuốt
A
AAA
Luật lũy đẳng
AAA
ABBA
Luật giao hoán
ABBA
A (B C) (A B) C
Luật kết hợp
A (B C) (A B) C
A (B C) (A B) (A C)
Luật phân phối
A (B C) (A B) (A C)
ABAB
Luật De Morgan
ABAB
AA Luật bù
5
1.2.5. Phủ và phân hoạch.
Cho S {A1, A2 , ..., An } trong đó Ai (i 1, n) là các tập con của E. Nếu
n
Ai E thì S gọi là một phủ của E.
i 1
6
Thí dụ 3.
E là tập các sinh viên trong 1 lớp học nào đó
aRb ”a cùng năm sinh với b” là một quan hệ 2 ngôi.
Quan hệ 2 ngôi trên một tập E có thể có các tính chất sau đây:
a) Tính phản xạ:
Quan hệ R có tính chất phản xạ nếu aRa a E
Thí dụ:
- Quan hệ “cùng năm sinh” có tính phản xạ
- Quan hệ “nhỏ hơn” (a < b) không có tính phản xạ vì không thể có
a < a.
b) Tính đối xứng:
Quan hệ R có tính đối xứng nếu aRb bRa
Thí dụ.
- Quan hệ “cùng năm sinh” có tính đối xứng
- Quan hệ “nhỏ hơn” (a < b) không có tính đối xứng vì từ a < b không thể
suy ra b < a.
c) Tính bắc cầu:
Quan hệ R gọi là có tính bắc cầu nếu (aRb và bRc) aRc
Thí dụ 1.
Quan hệ “cùng năm sinh” có tính bắc cầu; quan hệ “nhỏ hơn” cũng có tính
bắc cầu vì từ (a < b và b < c) suy ra a < c.
Thí dụ 2.
Trên tập các số nguyên dương N+ ta đưa vào quan hệ như sau:
aRb a và b là 2 số nguyên tố cùng nhau.
Quan hệ R này không có tính bắc cầu; vì (4R5 và 5R8) không thể suy ra
4R8 vì 4 và 8 không nguyên tố cùng nhau do chúng có 2 ước chung khác 1 đó là
2 và 4.
d) Tính phản xứng:
Quan hệ R gọi là có tính phản xứng nếu (aRb và bRa) a = b
Thí dụ 1.
Quan hệ aRb a b có tính phản xứng vì từ a b và b a ta suy ra
a = b (trên tập số thực)
Thí dụ 2.
E là tập các cán bộ trong một cơ quan, ta đưa vào quan hệ R như sau:
aRb lương của a không cao hơn lương của b.
Quan hệ R này không có tính phản xứng vì (aRb và bRa) ta chỉ suy ra
lương của a = lương của b mà không thể suy ra a = b ; nghĩa là a và b có thể vẫn
là hai cán bộ khác nhau của cơ quan đó.
7
1.3.2. Các phương pháp biểu diễn quan hệ 2 ngôi.
a) Phương pháp liệt kê.
Theo định nghĩa thì mọi quan hệ 2 ngôi R trên tập E đều là tập con của tập
tích Đề-các E E , nghĩa là luôn viết được R E E . Do đó một trong những
phương pháp biểu diễn R là liệt kê tất cả các phần tử của R trong E E .
Thí dụ. Cho E {a1, a 2 , a 3} . Tìm trong E một quan hệ 2 ngôi có tính phản
xạ, đối xứng nhưng không bắc cầu.
Ta có:
R {(a1, a1 ), (a 2 , a 2 ), (a 3 , a 3 ), (a1, a 2 ), (a 2 , a1), (a 2 , a 3 ), (a 3 , a 2 )}
Tính phản xạ được thể hiện ở 3 phần tử đầu, 4 phần tử sau thể hiện tính đối
xứng. Ở đây ta có (a1, a 2 ) và (a 2 , a 3 ) R nhưng (a1, a 3 ) R nên không có
tính chất bắc cầu..
b) Phương pháp sơ đồ.
Mỗi phần tử của E là một đỉnh của đồ thị, nếu a i Ra j thì có cung nối a i đến
a j . Trong thí dụ trên ta có
a1 a2 a3
8
- Quan hệ “a < b” trên tập số thực không phải là quan hệ tương đương.
Nếu R là quan hệ tương đương thì aRb có thể viết là a b .
Ta có định nghĩa sau:
Giả sử R là một quan hệ tương đương trên E và x E . Khi đó lớp tương
đương chứa x là tập con:
x {y E : yRx}
Định lý 1. Giả sử R là quan hệ tương đương trên E. Khi đó:
1) x E : x x
2) x, y E, xRy x y
3) Nếu x y thì 2 lớp tương đương x và y trùng nhau.
Khi đưa quan hệ tương đương R vào E thì chúng chia E thành các lớp tương
đương.
Các lớp tương đương này rời nhau và tạo nên một phủ của E; do đó nó là một
phân hoạch của E.
Việc đưa vào tập E một quan hệ tương đương là một cách tìm một phân hoạch
của E, nhờ đó ta có thể tìm số phần tử của E bằng cách tìm tổng số các phần tử
của tất cả các lớp tương đương.
1.3.4. Quan hệ thứ tự.
Quan hệ 2 ngôi R trên tập E gọi là quan hệ thứ tự nếu nó có 3 tính chất: phản
xạ, phản xứng và bắc cầu. Dễ dàng thấy rằng quan hệ ( a b ) hay ( a b ) là
quan hệ thứ tự trên tập các số tự nhiên cũng như trên tập các số thực.
a) Quan hệ thứ tự toàn phần.
Cho R là một quan hệ thứ tự trên E, nếu a, b E ta đều có aRb hoặc bRa
thì R gọi là quan hệ thứ tự toàn phần; khi đó mọi phần tử của E được sắp xếp
theo một thứ tự xác định theo quan hệ R và E là một tập có thứ tự toàn phần.
b) Quan hệ thứ tự không toàn phần.
Nếu R là một quan hệ thứ tự trên E nhưng không phải là quan hệ thứ tự toàn
phần thì ta nói R là quan hệ thứ tự không toàn phần.
Thí dụ.
- Quan hệ trên tập số thực là quan hệ thứ tự toàn phần vì với mọi số thực
a và b ta luôn có a b hoặc b a , và dó đó tập các số thực là tập có thứ tự toàn
phần.
- Quan hệ trên tập các véc tơ n chiều (trong không gian véc tơ n chiều
R n ) là quan hệ thứ tự không toàn phần vì a R n và b R n mà ta không có
a b và cũng không có b a . Tập R n còn gọi là tập có thứ tự bộ phận.
1.4. ÁNH XẠ
1.4.1. Các định nghĩa.
9
Định nghĩa 1.
f gọi là ánh xạ từ tập A vào tập B nếu x A, y duy nhất B mà ta ký
hiệu là f(x) và gọi là ảnh của x qua ánh xạ f. Ta viết:
f :A B
x f (x)
Định nghĩa 2.
Nếu E A thì ảnh của E qua f là tập:
f (E) {y B: x E; y f (x)}
Hoặc ta cũng viết: f (E) {f (x) : x E}
Chú ý.
- Nếu f 1 (y) thì y f (A)
- Nếu f 1 (y) x thì x là phần tử duy nhất có ảnh là y.
Định nghĩa 3.
Cho f là một ánh xạ từ tập A vào tập B.
a) f là toàn ánh nếu f (A) B
b) f là đơn ánh nếu x1, x 2 A và x1 x 2 f (x1 ) f (x 2 )
c) f là một song ánh nếu f vừa là toàn ánh vừa là đơn ánh.
Chú ý.
Nếu f là một song ánh từ A lên B thì ta viết f : A B . Khi đó y B, x
duy nhất A để cho y f (x) ; như vậy sự tương ứng y x là một ánh xạ từ
B vào A mà ta ký hiệu f 1 .
f 1 : B A
y f 1 (y) x với y f (x)
Và ta có
f f 1 (y) y, y B
f 1 f (x) x, x A
Và trong trường hợp này ta nói f 1 là ánh xạ ngược của f.
Thí dụ. Ký hiệu R là tập số thực; R là tập số thực không âm.
a) f : R R cho bởi y x 2 là một ánh xạ nhưng không phải là toàn ánh vì
các số âm không là ảnh của bất kỳ số x nào qua ánh xạ y x 2 ; cũng không phải
là đơn ánh vì hai số x và x (với x 0 ) có chung một ảnh.
b) f : R R cho bởi y x 2 là toàn ánh nhưng không phải là đơn ánh.
c) f : R R cho bởi y e x là đơn ánh nhưng không phải là toàn ánh vì
các số 1 không là ảnh của bất kỳ số x 0 qua ánh xạ y e x .
10
d) f : R R cho bởi y ax b (a 0) là song ánh (vừa là toàn ánh, vừa
là đơn ánh). Ánh xạ ngược của nó là:
f 1 : R R
y a 1y a 1b
1.4.2. Hợp (hay tích) của 2 ánh xạ.
Cho 2 ánh xạ: f : A B và g : B C , khi đó:
x A, y B sao cho f (x) y
Và y B, z C sao cho g(y) z
Do đó x A, z C (qua ánh xạ trung gian f) sao cho g f (x) z
Vậy có một ánh xạ từ A tới C xác định như sau:
x A z g f (x) C
Định nghĩa 4.
Hợp (hay tích) của hai ánh xạ f và g ký hiệu là g f : A C xác định như
sau: x A (g f )(x) g f (x) C
Hợp của 2 ánh xạ thường được biểu diễn bởi sơ đồ:
A B g C
f
x
y = f(x) z = g(y)
g f
Thí dụ. Cho A B C R ;
x R y f (x) x 2 R
y R z g(y) y 3 R
Khi đó ánh xạ hợp: g f : R R xác định như sau:
x R (g f )(x) g f (x) x 2 3 R
Định lý 3.
Hợp của 2 đơn ánh là một đơn ánh.
Hợp của 2 toàn ánh là một toàn ánh.
Hợp của 2 song ánh là một song ánh.
Cho ánh xạ f : A B và A1, A 2 là 2 tập con bất kỳ của A; B1 , B2 là 2
tập con bất kỳ của B. Khi đó:
f (A1 A2 ) f (A1 ) f (A2 )
f (A1 A2 ) f (A1 ) f (A2 )
f 1 (B1 B2 ) f 1 (B1 ) f 1(B2 )
f 1 (B1 B2 ) f 1 (B1 ) f 1(B2 )
11
Bà i 2 . BÀI TOÁN ĐẾM
Dạng tổng quát nhất của bài toán đếm có thể phát biểu ngắn gọn như sau: Cho
một tập rời rạc A; tìm bản số |A| của tập A, tức là hãy đếm xem A có bao nhiêu
phần tử.
Khi đếm các phần tử của A phải đảm bảo nghiêm ngặt 2 nguyên tắc:
Một là: Không bỏ sót, nghĩa là phần tử nào cũng được đếm.
Hai là: Không trùng lặp, nghĩa là không có phần tử nào được đếm quá một
lần.
Phương pháp tổng quát để giải bài toán đếm có thể diễn giải như sau: Giả sử
A là tập cần đếm, N {1, 2, 3, ..., n} là tập n số nguyên dương đầu tiên. Nếu lập
được sự tương ứng đơn trị hai chiều giữa các phần tử của A và các phần tử của
N; nghĩa là tìm được một song ánh f
f : A N thì | A | n
Tuy nhiên có rất nhiều cách cho tập A khác nhau nên phương pháp nêu trên
chỉ có ý nghĩa như một định hướng tổng quát, còn trên thực tế thì người ta phải
căn cứ vào hình thái cụ thể của tập A mà tìm ra một giải pháp thích hợp.
Mỗi phương pháp đếm là một thuật toán, nên trước tiên ta tìm hiểu những
khái niệm cơ bản về thuật toán.
2.2. KHÁI NIỆM THUẬT TOÁN
1
b) Biểu diễn bằng sơ đồ khối.
Phương pháp này sử dụng các biểu trưng hình học quy ước để diễn đạt các
bước và thao tác cần thực hiện trong thuật toán. Ta quy ước có các khối sau:
Nút điều kiện, ghi rõ điều kiện cần kiểm tra trong quá
trình tính toán
2
n(n 1)(2n 1)
Ta có vế trái 12 22 ... n 2 (n 1) 2 (n 1)2
6
(n 1)(n 2)(2n 3)
vế phải.
6
Vậy công thức được chứng minh.
3
dần từ thành phần đầu tiên. Thành phần đầu tiên có n cách chọn, thành phần thứ
hai chỉ có (n 1) khả năng chọn, …, thành phần thứ k chỉ có (n k 1) khả
năng chọn.
Nếu ký hiệu số chỉnh hợp chập k của n phần tử là A kn thì ta có:
Akn n.(n 1). ... .(n k 1) (1)
Thí dụ.
Từ các phần tử của X đã cho ở trên, có thể lập được bao nhiêu con số hàng
trăm mà các chữ số là khác nhau?
Ta thấy ngay S A36 A52 6.5.4 5.4 120 20 100 số.
Ở đây, A 52 chính là số các chỉnh hợp chập 3 có số 0 đứng ở phía trước; con số
này không phải con số hàng trăm.
2.3.3. Tổ hợp.
Định nghĩa. Tổ hợp chập k của n phần tử là một nhóm gồm k phần tử lấy
trong n phần tử đã cho (không kể thứ tự).
Nếu ký hiệu C kn là số tổ hợp chập k của n phần tử thì dễ dàng thấy rằng:
A kn n.(n 1). ... .(n k 1)
C .Pk A
k
n
k
n C k
n (3)
Pk k!
Nếu chú ý rằng C kn là số nguyên thì ta có nhận xét thú vị sau đây: Tích của k
số tự nhiên liên tiếp nhau luôn chia hết cho tích của k số tự nhiên đầu tiên (k!).
Thí dụ 1.
Có 10 người thi đấu bóng bàn vòng tròn, hỏi có bao nhiêu trận đấu?
Cứ 2 người tạo nên 1 trận đấu, mỗi trận đấu là một tổ hợp chập 2 của 10.
Vậy số trận đấu là:
10.9
2
C10 45 trận
1.2
4
Các số tổ hợp C kn rất hay gặp trong toán rời rạc, ta thường gọi là hệ số tổ hợp.
Dưới đây là một số công thức đáng nhớ:
n!
Ckn (4)
k!.(n k)!
Ckn Cnn k (5)
Ckn Ckn 11 Ckn 1 ; (n k 0) (6)
Để có thể áp dụng công thức (4) và (5) cho mọi k n ta quy ước:
C0n Cnn 1 và 0! 1
- Công thức (6) với quy ước C0n 1 cho phép ta tính tất cả các hệ số tổ hợp chỉ
bằng phép cộng.
Nhị thức Newton:
n
(x y) Ckn .x k y n k
n
k 0
5
Nếu ký hiệu Lkn là số chỉnh hợp lặp chập k của n phần tử thì dễ dàng thấy
rằng mỗi thành phần của nó đều có n cách lựa chọn nên ta có công thức:
Lkn n k (11)
Chú ý rằng trong chỉnh hợp lặp số k không bị giới hạn bởi điều kiện k n
mà trái lại k có thể lấy giá trị lớn hơn n. Chẳng hạn như với 3 chữ số 1, 2, 3 ta
vẫn có thể lập được các con số hàng triệu gồm 7 chữ số:
1 222 333; 2 221 111; …
Thí dụ 2.
Từ các chữ số thuộc X {0, 1, 2, 3, 4, 5} có thể lập được bao nhiêu con số
hàng trăm?
Mỗi con số hàng trăm là một chỉnh hợp lặp chập 3 của 6 chữ số đã cho, loại
trừ các chỉnh hợp lặp có số 0 đứng trước.
Do đó ta có số các con số hàng trăm là:
s L36 L26 63 62 180 số
6
(1 1 3 4)! 9!
P(1, 1, 3, 4) 2520
1!1! 3!4! 3!4!
Nếu ta đặt n n1 n 2 ... n k thì sẽ có định lý sau đây:
Định lý 1.
Ký hiệu Cn (n1, n 2 , ..., n k ) là số cách chia n phần tử khác nhau thành k nhóm
với số các phần tử tương ứng là n1, n 2 , ..., n k . Nếu n i n j i j thì
Cn (n1, n 2 , ..., n k ) P(n1, n 2 , ..., n k ) .
Thí dụ 1.
Có bao nhiêu cách chia bộ bài tú lơ khơ 52 quân thành 4 phần tương ứng với
số quân là 10, 12, 14, 16.
Vì số quân của các phần khác nhau nên
52!
C52 (10, 12, 14, 16)
10!12!14!16!
Giả thiết n i n j i j là để cho các nhóm được tạo thành không có sự
trùng lặp. Nếu n1 n 2 ... n i (i k) tức là có i nhóm có số phần tử bằng
nhau thì công thức tính sẽ là:
P(n1, n 2 , ..., n k )
Cn (n1, n 2 , ..., n i , n i 1, ..., n k )
i!
Nghĩa là số cách chia nhóm sẽ giảm đi i! lần.
Thí dụ 2.
Chia 4 đối tượng a, b, c, d thành 2 nhóm, mỗi nhóm gồm 2 đối tượng thì chỉ
có 3 cách
(a, b) và (c, d)
(a, c) và (b, d)
(a, d) và (b, c)
Chú ý rằng nếu lấy ra 2 đối tượng từ 4 đối tượng thì có C24 6 cách, nhưng
chia thành 2 nhóm, mỗi nhóm 2 đối tượng thì lại chỉ có:
P(2, 2) 4! 24
C4 (2, 2) 3 cách như trên.
2! 2!. 2!2! 8
Thí dụ 3.
Có bao nhiêu cách chia bộ bài tú lơ khơ 52 quân thành 4 phần bằng nhau?
Khi đó mỗi phần có 13 quân nên:
P(13, 13, 13, 13) 52!
C52 (13, 13, 13, 13)
4! 4!. (13!)4
7
2.4.3. Tổ hợp lặp.
Định nghĩa. Tổ hợp lặp chập k của n phần tử là một nhóm gồm k phần tử lấy
(có thể lặp) trong n phần tử đã cho. Giống như trong chỉnh hợp lặp, số k có thể
lớn hơn n.
Ta ký hiệu số tổ hợp lặp chập k của n phần tử là R kn
Ta có R kn Cnk k 1
Thí dụ 1.
Hai quả cam, ba quả quýt, bốn quả chanh có thể coi như tổ hợp lặp chập 9 của
3 phần tử ; trong đó cam lặp 2 lần, quýt lặp 3 lần, chanh lặp 4 lần.
Thí dụ 2.
Có bao nhiêu cách chia 10 chiếc kẹo cho 5 em bé?
Mỗi cách chia là một tổ hợp lặp chập 10 của 5 phần tử, vậy số cách chia là:
14.13.12.11
5 C5 10 1 C14 C14
R10 1001 cách.
10 10 4
4!
Thí dụ 3.
Phương trình x1 x 2 x 3 x 4 8 ; x i 0 và nguyên ( i 1, 4 ) có bao
nhiêu nghiệm?
Mỗi nghiệm là một tổ hợp lặp chập 8 của 4 phần tử, vậy số nghiệm là:
11.10.9
R 84 C84 8 1 C11
8
C11
3
165 nghiệm.
3!
8
Bài 3. CÁC NGUYÊN LÝ ĐẾM
Mỗi bài toán đếm có một cấu trúc khác nhau nên chúng ta cần phải lựa chọn
phương pháp đếm phù hợp với cấu trúc của bài toán đó. Một số phương pháp
đếm có tính chất tổng quát cho một lớp bài toán, ta gọi nó là nguyên lý đếm.
Dưới đây là các nguyên lý quan trọng.
Thí dụ 1.
X {x1, x 2 , ..., x n }; A P(X) là tập lũy thừa của X. Tìm |A|.
Ta biết rằng P(X) là tập mọi tập con có thể có của X kể cả tập rỗng và bản
thân tập X. Ta ký hiệu A k là tập mọi tập con gồm k phần tử của X;
k 0, 1, 2, ..., n . Trong đó A 0 là tập rỗng. Ta thấy
A P(X) A0 A1 A2 ... An và Ai A j , i j
Áp dụng nguyên lý cộng thì sẽ có:
n
| A | | Ak |
k 0
n
Vì | A k | Cnk nên ta có | A | C
k 0
k
n 2n
1
Thí dụ 2.
Có bao nhiêu xâu nhị phân có độ dài 10?
Ký hiệu E {0, 1} ; A là tập các xâu nhị phân có độ dài 10 thì A E10 .
Vậy | A | 210 1024 .
3.3. Nguyên lý loại trừ
Nếu A B thì | A | | B | | B \ A |
Ta gọi đó là nguyên lý loại trừ
Thí dụ.
Có 8 nam và 10 nữ; có bao nhiêu cách chọn ra 6 người có cả nam và nữ?
- Nếu muốn áp dụng nguyên lý cộng ta làm như sau:
Ký hiệu A i là tập các nhóm 6 người có cả nam và nữ; trong đó có i nam
(1 i 5 ) thì ta có:
A A1 A2 A3 A4 A5 và Ai A j , i j
Vậy | A | | A1 | | A2 | | A3 | | A4 | | A5 |
Nhưng khi tính | Ai | ta phải áp dụng nguyên lý nhân.
6i
| Ai | C8i .C10 ; (1 i 5)
Vậy | A | C18.C10
5
C82.C10
4
C83.C10
3
C84.C10
2
C85.C10
1
2
| A | (| A1 | | A2 | | A3 |) (| A1 A2 | | A2 A3 | | A3 A1 |) | A1 A 2 A3 |
Ý nghĩa của công thức này là: Các phần tử thuộc giao của 2 tập được đếm 2
lần phải trừ đi một lần. Các phần tử x A1 A2 A3 được tính 3 lần trong
| A1 |, | A2 |, | A3 | và bị trừ đi 3 lần trong giao của các 2 tập
| A1 A2 |, | A2 A3 |, | A3 A1 | ; như vậy coi như chưa được đếm. Vậy phải bù
vào | A1 A2 A3 |
Trường hợp tổng quát: Nếu A A1 A2 ... An thì
| A | N1 N2 N3 ... (1)n Nn
n
Trong đó N1 | A |
i 1
i
N 2 | Ai A j |
i j
N3 |A
i j k
i A j Ak |
……………………
Nn | A1 A2 ... An |
Thí dụ 1.
Trong một lớp học, mỗi sinh viên đều biết ít nhất một ngoại ngữ. Có 30 sinh
viên biết tiếng Anh, 31 sinh viên biết tiếng Pháp, 32 sinh viên biết tiếng Nga, 15
sinh viên biết tiếng Anh và Pháp, 16 sinh viên biết tiếng Pháp và Nga, 17 sinh
viên biết tiếng Nga và Anh, 5 sinh viên biết cả 3 ngoại ngữ. Hỏi cả lớp có bao
nhiêu sinh viên?
Theo nguyên lý bù trừ ta có: N N1 N2 N3 nên
N (30 31 32) (15 16 17) 5 50 sinh viên.
Thí dụ 2.
Có bao nhiêu số nguyên dương, 1000 chia hết cho 2, 3 hoặc 5.
Ký hiệu A2 , A3 , A5 là tập các số tương ứng chia hết cho 2, 3, 5 và
A A 2 A3 A 5 .
Theo nguyên lý bù trừ:
| A | N1 N2 N3
Trong đó N1 | A2 | | A3 | | A5 |
N 2 | A 2 A3 | | A 2 A 5 | | A 3 A 5 |
N3 | A2 A3 A5 |
3
1000
Ta có: | A 2 | 500 trong đó [x] là phần nguyên của x.
2
1000
| A3 | 333;
3
1000
| A5 | 200;
5
N1 500 333 200 1033
1000
| A 2 A3 | 166 ;
6
1000
| A 2 A5 | 100 ;
10
1000
| A3 A5 | 66 ;
15
N2 166 100 66 332
1000
N3 | A 2 A3 A5 | 33.
30
Vậy | A | 1033 332 33 734 .
Thí dụ 3. Tìm số mất thứ tự.
Bỏ n bức thư vào n phong bì ghi sẵn địa chỉ. Tìm xác suất để không một bức
thư nào đúng địa chỉ.
Số cách bỏ thư là n!, số cách bỏ thư không bức thư nào đúng địa chỉ là D n thì
Dn
xác suất cần tìm là: P
n!
D n là số mất thứ tự. D n được tính theo nguyên lý bù trừ
Dn N N1 N2 ... (1)n Nn
Trong đó N n!
N k là số cách bỏ thư có ít nhất k lá thư đúng địa chỉ.
Dễ dàng thấy rằng Nk Cnk .(n k)! . Trong đó C kn là số cách chọn k bức
thư để bỏ đúng địa chỉ, còn (n k) bức thư còn lại ta bỏ một cách tùy ý, nghĩa
là có (n k)! cách. Trong (n k)! cách bỏ thư này vẫn có những thư đúng địa
n!
chỉ nên N k Cnk .(n k)! là số cách bỏ thư để có ít nhất k thư đúng địa
k!
chỉ.
Thay vào đó ta có:
4
n! n! n! n
(1) k
Dn n! ... (1) n n!.
1! 2! n! k 0 k!
1 1
Điều lý thú là khi cho n thì P e1
e 3
Số mất thứ tự D n tăng rất nhanh. Sau đây là một vài giá trị của D n
n 1 2 3 4 5 6 7 8 9 10
Dn 0 1 2 9 44 265 1854 14833 133496 1334961
5
Ký hiệu f (x i ) là số cách vượt cầu thang tương ứng với x i . Ta tính các f( x i ).
Dễ dàng thấy f (x1 ) 1 . Để tính f (x 2 ) ta thấy x 2 (1, 1, 2) nghĩa là có 4
bước: một bước 1 bậc, một bước 2 bậc và hai bước ba bậc.
Trong bốn bước này ta chọn một bước nào đó cho 1 bậc, có C14 4 cách. Sau
khi chọn bước này, còn lại 3 bước, ta chọn một bước cho 3 bậc: đó là C13 3
cách. Vậy f (x 2 ) 4.3 12 cách. Theo cách đó ta có:
f (x1 ) C33 1 f (x 7 ) C17 7
f (x 2 ) C14 .C13 12 f (x8 ) C18 8
f (x 3 ) C52 10 f (x 9 ) C36 20
f (x 4 ) C14 4 f (x10 ) C72 21
f (x 5 ) C15.C24 30 f (x11 ) C18 8
f (x 6 ) C16 .C15 30 f (x12 ) C99 1
Vậy số cách vượt cầu thang là:
12
S f (x i ) 149 cách.
i 1
6
Ta vẽ (n 1) đường thẳng có vị trí tổng quát, số phần mặt phẳng là Tn 1 . Vẽ
thêm đường thẳng thứ n, cắt (n 1) đường thẳng đã cho tại (n 1) giao điểm
khác nhau; các giao điểm này chia đường thẳng vẽ thêm thành n phần.
A n 1
A1 A2
Mỗi phần đường thẳng nằm trong 1 phần mặt phẳng tạo nên bởi (n 1)
đường thẳng ban đầu và chia đôi phần mặt phẳng đó, nghĩa là tạo thêm n phần
mặt phẳng nữa.
Vậy ta có:
Tn Tn 1 n
Ta biết rằng T0 1 nên
T1 T0 1 1 1
T2 T1 2 1 1 2
....................
Tn Tn 1 n 1 1 2 ... n
n(n 1)
Và tìm được Tn 1
2
Thí dụ 2. Bài toán họ nhà thỏ của Fibonacci (nhà toán học Ý 1170-1226).
Thả một cặp thỏ mới sinh (1 con đực, 1 con cái) lên một đảo hoang. Giả sử
khi được 2 tháng tuổi, chúng bắt đầu sinh sản, mỗi tháng một lứa, mỗi lứa sinh ra
1 cặp thỏ con. Các cặp thỏ con cũng sinh trưởng và sinh sản theo quy tắc trên.
Tìm số cặp thỏ trên đảo sau n tháng, biết rằng trong thời gian nghiên cứu không
có cặp thỏ nào bị chết bệnh hoặc bị săn bắt.
Giải:
7
Ký hiệu Tn là số cặp thỏ có ở tháng thứ n; số cặp thỏ này bằng số cặp thỏ có
ở tháng thứ (n 1) là Tn 1 cộng với số cặp thỏ mới sinh ra là Tn 2 .
Vậy ta có:
Tn Tn 1 Tn 2
Theo điều kiện ban đầu ta có:
T0 0
T1 1
Ta suy ra:
T2 T1 T0 1 1 2
T3 T2 T1 2 1 3
T4 T3 T2 3 2 5
Tiếp tục như vậy ta có dãy số: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, … gọi là dãy số
Fibonacci, dãy số đặc trưng cho một quá trình “sinh mà không tử”; một quá trình
có lẽ chỉ có trong thế giới tâm linh – thế giới của những linh hồn bất tử – mà
không có trong thế giới tiến hóa của muôn loài.
Nhưng nếu coi một sinh vật có đời sống “đủ dài” (ngoài tầm nghiên cứu của
Tn ) là “bất tử” thì dãy số Fibonacci lại liên quan đến nhiều vấn đề lý thú không
chỉ trong toán học mà trong cả sinh học, kiến trúc, nghệ thuật và cũng đã từng là
chìa khóa giải mã cho những vấn đề huyền bí trong những câu chuyện rất hấp
dẫn.
Quy luật của dãy số Fibonacci là một số hạng bất kỳ bằng tổng của hai số
hạng đứng liền trước nó.
8
1 5 1 5
Giải được c1 ; c2
2 5 2 5
Do đó ta có:
1 1 5
n 1 n 1
1 5
Tn
5 2 2
9
Bài 4. BÀI TOÁN LIỆT KÊ VÀ BÀI TOÁN TỒN TẠI
Cho tập A {a1, a 2 , ..., a n } . Từ các phần tử của A, ta tạo ra các cấu hình tổ
hợp theo một quy tắc nào đó và gọi B là tập tất cả các cấu hình tổ hợp đó. Bài
toán đặt ra là hãy liệt kê tất cả các cấu hình tổ hợp của B. Khác với bài toán đếm
là tìm số phần tử của B, trong bài toán này, ta phải lập một danh sách cấu hình
chỉ rõ từng phần tử của B. Rõ ràng là có nhiều cách liệt kê khác nhau, tuy nhiên
chúng phải bảo đảm 2 nguyên tắc sau đây:
Một là: Không bỏ sót, nghĩa là phần tử nào cũng phải được liệt kê.
Hai là: Không trùng lặp, nghĩa là không có phần tử nào được liệt kê quá một
lần.
Khó khăn của việc giải bài toán liệt kê là sự “bùng nổ tổ hợp” nghĩa là khi số
phần tử cần liệt kê là một số lớn. Thí dụ, tập B có 1 triệu phần tử, đây không phải
là con số lớn đối với các bài toán tổ hợp, và giả sử cứ 1 giây thì máy tính có thể
liệt kê được 1 phần tử thì ta phải làm việc trên máy tính trong 35 ngày, mỗi ngày
8 giờ.
Tuy nhiên, nếu số cấu hình tổ hợp không lớn thì cùng với máy tính, phương
pháp liệt kê lại có thể giải được một số bài toán khó mà cho đến nay người ta
cũng chưa tìm được phương pháp tổng quát để đếm các phần tử của B.
Thí dụ như có bao nhiêu cách xếp 8 quân hậu lên 1 bàn cờ vua sao cho chúng
từng đôi một không khống chế lẫn nhau (nghĩa là 2 quân hậu bất kỳ không được
đứng chung 1 hàng, 1 cột hay 1 đường chéo). Hoặc có bao nhiêu cách phủ kín
một bàn cờ vua bằng 32 quân đôminô.
4.2. THUẬT TOÁN SINH
Thuật toán sinh là một thuật toán có thể áp dụng để giải các bài toán liệt kê
các tổ hợp, thuật toán này dựa trên 2 giả thiết sau đây:
- Có thể xác định được một thứ tự toàn bộ trên tập các cấu hình tổ hợp cần
liệt kê, từ đó xác định được cấu hình tổ hợp đầu tiên và cấu hình tổ hợp
cuối cùng trong thứ tự đã xác định đó.
- Đưa ra được một thuật toán để từ một cấu hình hiện có, tìm được cấu hình
tiếp theo, nếu không tìm được cấu hình tiếp theo thì phải khẳng định được
(chứng minh được) cấu hình hiện có là cấu hình cuối cùng (nghĩa là không
còn một cấu hình nào khác ngoài các cấu hình đã liệt kê.)
Thí dụ. Liệt kê tất cả các dãy nhị phân có độ dài n.
Ta xếp các dãy này theo thứ tự tự nhiên, tức là theo thứ tự của số mà nó biểu
diễn, nghĩa là dãy đầu tiên gồm n số 0 và dãy cuối cùng gồm n số 1.
Như vậy dãy nhị phân được liệt kê theo thứ tự sau:
1
00...000 0
00...001 1
00...010 2
00...011 3
........................
11...111 2n 1
Thuật toán sinh có những hạn chế sau:
- Trong nhiều bài toán việc tìm cấu hình ban đầu thường không phải là đơn
giản, thậm chí ngay cả sự tồn tại một cấu hình như thế nhiều khi vẫn còn
là điều nghi vấn.
- Mặt khác việc sắp xếp thứ tự các cấu hình nhiều khi rất phức tạp, do đó
không phải một cấu hình kế tiếp nào cũng được sinh ra từ một cấu hình
hiện có một cách đơn giản.
Hãy xét thí dụ: Liệt kê tất cả các cách điền các chữ số nguyên dương (từ 1
đến 9) vào 9 ô vuông nhỏ trong một hình vuông lớn sao cho tổng các chữ số trên
mỗi hàng, mỗi cột và mỗi đường chéo đều bằng nhau.
Việc đưa ra một cấu hình đầu tiên tuy không đơn giản nhưng không đến nỗi
quá khó, chẳng hạn có thể đưa ra một cấu hình như dưới đây:
2 9 4
7 5 3
6 1 8
Việc sinh ra một cấu hình tiếp theo từ cấu hình này rất đơn giản và có nhiều
cách, chẳng hạn như: hoán vị 2 hàng biên hoặc 2 cột biên, chuyển vị qua đường
chéo chính hoặc phụ, quay hình vuông 900 theo chiều kim đồng hồ hoặc ngược
chiều kim đồng hồ, …. Nhưng khó khăn lại ở chỗ ta không biết sắp xếp các cấu
hình này theo thứ tự nào để biết được đâu là cấu hình cuối cùng, nghĩa là ta chưa
chỉ ra được thủ tục để kết thúc thuật toán.
Qua thí dụ trên ta thấy rằng thuật toán sinh có những hạn chế nên tính phổ
dụng không cao. Dưới đây ta xét một thuật toán có tính phổ dụng cao hơn.
4.3. THUẬT TOÁN QUAY LUI
Ý tưởng cơ bản của thuật toán này là để xây dựng 1 cấu hình gồm n thành
phần, người ta xây dựng dần các thành phần của cấu hình bằng cách thử lại tất cả
các khả năng. Giả sử cấu hình cần xây dựng có n thành phần là a1a 2 ... a n . Giả
thiết ở bước k ta đã xây dựng được (k 1) thành phần a1a 2 ... a k 1 và bây giờ
xác định thành phần a k . Ta duyệt tất cả các khả năng có thể đề cử cho a k và
2
đánh số các khả năng ấy là i 1, 2, ..., n k . Với mỗi khả năng i {1, 2, ..., n k } ta
kiểm tra xem i có chấp nhận được không.
Có thể xảy ra 2 trường hợp:
- Nếu chấp nhận i thì xác định a k theo i, sau đó nếu k n thì ta có một cấu
hình, nếu k n thì ta chuyển sang bước k 1 .
- Nếu i {1, 2, ..., n k } mà không có khả năng nào chấp nhận được thì ta
quay lại bước (k 1) để xác định a k 1 .
Điểm mấu chốt của thuật toán này bao gồm 2 điểm chính sau đây:
Một là: Đưa ra một danh sách mọi khả năng đề cử cho i, nghĩa là không được
bỏ sót một khả năng nào.
Hai là: Phải ghi nhớ tại mỗi bước đã đi qua, những khả năng nào đã được thử
để tránh trùng lặp. Rõ ràng những thông tin này phải được lưu trữ theo cơ cấu
“ngăn xếp” (stack: vào sau, ra trước).
Hai yêu cầu: không bỏ sót và không trùng lặp luôn luôn là những đòi hỏi
nghiêm khắc đối với bài toán đếm cũng như bài toán liệt kê.
Thí dụ 1.
Liệt kê các cách xếp 4 quân hậu lên một hình vuông gồm 16 ô vuông ( 4 4 )
sao cho các quân hậu đó từng đôi một không khống chế lẫn nhau.
Ta đánh dấu các cột bởi các chữ A, B, C, D và các hàng bởi các số 1, 2, 3, 4.
Đầu tiên ta xác định vị trí cho quân hậu ở cột A. Có 4 khả năng lựa chọn là
A1, A2 , A3 , A4 .
- Giả sử ta lựa chọn vị trí A1 . Khi đó các ô bị khống chế là
A2 , A3 , A4 , B1, B2 , C1, C3 , D1, D4 . Ta xóa các ô này bởi dấu (hình 3.1).
Bây giờ để lựa chọn vị trí cho quân hậu ở cột B, ta chỉ có 2 khả năng là
B3 , B4 .
Nếu chọn B3 ta có kết quả như hình 3.2 và nếu chọn B4 thì có kết quả như
hình 3.3.
Trên hình 3.2 không còn 1 ô trống nào để có thể xếp chỗ cho quân hậu trên
cột C.
Vậy việc chọn B3 là không chấp nhận được.
A B C D A B C D A B C D
1 ۩ 1 ۩ 1 ۩
2 2 2 ۩
3 3 ۩ 3
4 4 4 ۩
3
Trên hình 3.3, cột C chỉ còn 1 ô trống là C2 để xếp hậu, khi đó ô D2 , D3 đều
bị khống chế, nên không còn ô trống nào để xếp hậu trên cột D. Vậy việc chọn
B4 cũng không thể chấp nhận.
Do đó việc xếp hậu tại A1 không thể chấp nhận.
Do tính chất đối xứng của hình vuông nên việc xếp hậu tại A 4 cũng bị loại
trừ.
Vậy chỉ còn lại 2 khả năng là xếp hậu tại A 2 hoặc A 3 .
- Xếp hậu tại A 2 . Xem hình 3.4.
A B C D A B C D A B C D
1 1 1 ۩
2 ۩ 2 ۩ 2 ۩
3 3 3 ۩
4 4 ۩ 4 ۩
Khi đó chỉ còn một khả năng duy nhất để xếp hậu ở cột B, đó là B4 . Sau khi
xếp hậu ở B4 thì cũng chỉ còn một khả năng duy nhất để xếp hậu ở cột C, đó là
C1 .
Sau khi xếp hậu ở C1 thì cũng chỉ còn 1 khả năng duy nhất để xếp hậu ở cột
D, đó là D3 . (Xem hình 3.5, 3.6).
Vậy ta có được 1 cấu hình (hình 3.7).
Tương tự nếu chọn A 3 cho quân hậu đầu tiên thì ta có 1 cấu hình nữa (hình
3.8).
A B C D A B C D
1 ۩ 1 ۩
2 ۩ 2 ۩
3 ۩ 3 ۩
4 ۩ 4 ۩
Quá trình tìm lời giải theo thuật toán quay lui có thể mô tả bởi cây tìm kiếm
lời giải như dưới đây:
4
Gốc
Hình 3.9. Cây tìm kiếm lời giải theo thuật toán quay lui
Trên hàng thứ nhất là 4 khả năng lựa chọn vị trí cho quân hậu ở cột A.
Trên hàng thứ hai là các khả năng lựa chọn vị trí cho quân hậu ở cột B sau khi
vị trí của quân hậu ở cột A đã được lựa chọn (hàng 2 có 6 khả năng)
Trên hàng thứ 3 là các khả năng lựa chọn vị trí cho quân hậu ở cột C sau khi
vị trí của các quân hậu ở cột A và cột B đã được chọn. Hàng 3 chỉ có 4 khả năng,
nghĩa là có 2 trường hợp không lựa chọn được vị trí cho quân hậu ở cột C.
Trên hàng cuối cùng là các vị trí cho quân hậu ở cột D sau khi vị trí của các
quân hậu ở các cột A, B, C đã lựa chọn. Chỉ có 2 trường hợp, tương ứng với 2
cách xếp 4 quân hậu thỏa mãn điều kiện của bài toán đề ra.
Người ta còn có thể sử dụng “cây tìm kiếm lời giải” để liệt kê các dãy nhị
phân, liệt kê các hoán vị và các tổ hợp. Dưới đây ta xét một thí dụ để giải một bài
toán khác.
Thí dụ 2. Hãy liệt kê tất cả các con số hàng trăm gồm các chữ số khác nhau
được chọn từ tập A = {1, 3, 5, 7, 9} và tạo thành các dãy tăng (số hàng trăm < số
hàng chục < số hàng đơn vị).
Ta có cây tìm kiếm lời giải dưới đây:
1
5
3
3 7
5 7
7
5
5 9 9
7 9
9 9
7
7 9
Hình 3.11
5
Dễ dàng kiểm tra lại để thấy rằng số các con số này đúng bằng số tổ hợp
C35 10 .
Trong các bài toán đếm và bài toán liệt kê, người ta tập trung sự chú ý vào
việc đếm hoặc liệt kê các cấu hình tổ hợp thỏa mãn một số tính chất nào đó và
thừa nhận sự tồn tại của các cấu hình tổ hợp đó là hiển nhiên. Tuy nhiên có rất
nhiều bài toán, việc chỉ ra sự tồn tại của một cấu hình thỏa mãn những tính chất
cho trước là rất khó khăn. Chẳng hạn, một kỳ thủ trước một tình huống cụ thể của
một ván cờ, cần suy nghĩ xem liệu có một dãy các nước đi để chắc chắn thắng
được đối phương hay không. Nhiều khi ta không tìm được lời giải nhưng cũng
không khẳng định được là không có lời giải. Như vậy nội dung của bài toán tồn
tại khác hẳn với các bài toán đếm và liệt kê. Vấn đề đặt ra ở đây là: có hay không
một cấu hình tổ hợp thỏa mãn một số tính chất cho trước? Điều này kéo theo sự
khác nhau cả về phương pháp tư duy và thuật toán. Bài toán tồn tại xem như
được giải quyết nếu ta tìm được một cấu hình hoặc chứng minh được sự tồn tại
của cấu hình. Nhiều khi ta không tìm được một cách cụ thể cấu hình đó; mà chỉ
nêu ra được một cách xây dựng cấu hình, hoặc là chứng minh được rằng cấu hình
cần tìm là không có thì bài toán cũng coi như được giải quyết. Để thấy rõ nội
dung đa dạng và tính chất phức tạp của bài toán tồn tại, dưới đây ta hãy xét một
số bài toán cổ điển nổi tiếng.
Ab Ba Cc Dd
Bc Ad Db Ca
Cd Dc Aa Bb
Da Cb Bd Ac
6
Một lời giải cho trường hợp n 5 là:
Aa Bb Cc Dd Ee
Bc Ca Db Ec Ad
Cd De Ea Ab Bc
Dc Ed Ae Ba Cb
Eb Ac Bd Ce Da
Bài toán này do Euler đề xuất và ông mất khá nhiều thời gian cho bài toán
n 6 mà không đạt kết quả nên ông đưa ra một giả thuyết là bài toán này không
có lời giải, ngoài ra bài toán n 2 cũng không có lời giải nên Euler nêu lên một
giả thuyết tổng quát là bài toán với n 4k 2 thì không có lời giải. Giả thuyết
này của Euler tồn tại suốt gần hai thế kỷ.
Mãi đến năm 1901, Tarri - một nhà toán học Pháp - đã chứng minh được rằng
với n 6 bài toán không có lời giải bằng cách duyệt tất cả các khả năng xếp, và
đến năm 1960, ba nhà toán học Mỹ là Boce, Parker và Srikanda mới tìm được
phương pháp xây dựng hình vuông la tinh trực giao cho các trường hợp:
n 4k 1 với k 1, 2, 3, ... ; còn các trường hợp khác vẫn còn là những thách
thức hóc búa với trí tuệ loài người.
7
4.4.3. Bài toán hình lục giác huyền bí.
Bài toán này do Cliford Adams đề ra năm 1910, nội dung như sau:
Hãy điền các số từ 1 đến 19 vào 19 ô hình lục giác (như hình vẽ) sao cho tổng
các số theo 3 chiều của các cạnh hình lục giác đều bằng nhau.
Hơn nửa thế kỷ sau, năm 1962, Adams đã công bố lời giải như hình vẽ dưới
đây. Điều bất ngờ đây lại là lời giải duy nhất nếu bỏ qua những lời giải được suy
ra từ một phép biến hình đơn giản, chẳng hạn quay hình lục giác một góc 600.
15
14 13
9 8 10
6 4
11 5 12
1 2
18 7 16
17 19
3
Hình 4.1
8
Vì các cầu thủ xếp vòng tròn, mỗi nhóm gồm 4 cầu thủ đứng liền nhau nên
mỗi cầu thủ được xếp vào 4 nhóm khác nhau, do đó khi tính tổng các số ghi trên
áo của tất cả các nhóm thì số áo của mỗi cầu thủ được tính 4 lần. Vậy
20.21
S 4.(1 2 ... 20) 4. 840
2
Từ kết quả trên suy ra tổng các số ghi trên áo của mỗi nhóm đều phải bằng
42. Điều này không thể xảy ra vì 2 nhóm kề nhau thì khác nhau 1 cầu thủ nên
không thể có tổng các số ghi trên áo của họ bằng nhau được.
Mệnh đề đã được chứng minh.
Có một số bài toán tồn tại mà lời giải của nó có thể khái quát hóa cho một lớp
khá rộng các bài toán, nên người ta trình bày các bài toán đó dưới dạng một định
lý gọi là định lý tồn tại.
9
Bà i 5 . CÁC BÀI TOÁN TỔ HỢP TỐI ƯU
Cho A là một tập hữu hạn, B là tập các cấu hình tổ hợp được tạo ra từ các
phần tử của A, F(x) là một hàm xác định trên B. Giả sử B và tất nhiên B
cũng là một tập hữu hạn. Bài toán đặt ra là: Tìm x* B sao cho:
F(x* ) F(x) x B hoặc F(x* ) F(x) x B
Trong bài toán này: F(x) gọi là hàm mục tiêu, B gọi là tập xác định của bài
toán, mỗi x B gọi là một phương án; x * nếu có, gọi là phương án tối ưu;
F(x* ) gọi là giá trị tối ưu. Dưới đây ta hãy xét một vài bài toán tiêu biểu cho lớp
các bài toán này.
1
n
B a i x i b; x i {0, 1}, i = 1, n
i 1
Ở đây mỗi x(x1, x 2 , ..., x n ) B là một phương án, tương ứng với dãy nhị
phân có độ dài n; do đó | B | 2n . Bài toán trên cũng có thể viết:
F(x) c, x max
xB
Đặc điểm của bài toán tổ hợp tối ưu là miền xác định của bài toán là một tập
rời rạc, nên thuật toán giải các bài toán tổ hợp tối ưu hoàn toàn khác với thuật
toán tìm cực trị của một hàm n biến trên một tập compact mà chúng ta đã biết
trong giải tích các hàm nhiều biến.
Dưới đây ta cũng xét một vài thuật toán tiêu biểu.
5.2. THUẬT TOÁN DUYỆT TOÀN BỘ
Giả sử phải giải bài toán: F(x) min, max; x B trong đó B là tập rời
rạc. Để giải bài toán này trước tiên ta liệt kê các phần tử của B; sau đó với mỗi
x B ta tính F(x); và so sánh các giá trị của F(x) để tìm ra phương án tối ưu.
Thuật toán đó gọi là thuật toán duyệt toàn bộ hay thuật toán điểm diện.
Nếu số phần tử của B là nhỏ thì thì thuật toán này rất có hiệu quả và dễ hiểu.
Nếu |B| là khá lớn thì thuật toán này rất khó thực hiện, ngay cả việc thực hiện
trên các máy tính hiện đại nhất. Chẳng hạn như trong bài toán người du lịch với
n 15 thì ta có | B| 15! 1307674368000 phương án.
Nếu mỗi giây máy tính duyệt được 1 triệu phương án thì máy tính phải làm
việc trong thời gian liên tục là 1 307 674 giây, tương ứng với 3 700 giờ làm việc
liên tục hay 154 ngày liên tục. Đó là một điều không khả thi.
Tuy nhiên cũng cần nhấn mạnh rằng có không ít bài toán tổ hợp tối ưu, chúng
ta chưa có một thuật toán hữu hiệu nào ngoài thuật toán duyệt toàn bộ, khi đó
trong quá trình liệt kê, chúng ta cần tận dụng những thông tin thu được ở mỗi
bước để loại bỏ những phương án mà chắc chắn không phải là tối ưu. Một trong
các giải pháp như thế được giới thiệu dưới đây với tên gọi “thuật toán nhánh
cận”.
5.3. THUẬT TOÁN NHÁNH CẬN
Do đó ta cũng có
(B) F(x); x B
Nếu tìm được x* B mà f (x* ) (B) thì x * là phương án tối ưu. Nếu
không ta chuyển sang bước 1.
Bước 1:
Chia B thành một phân hoạch B1, B2 , ..., Br . Để dễ trình bày và không kém
phần tổng quát ta có thể lấy r 2 ; nghĩa là chia B thành 2 tập B11 và B12 mà:
B B11 B12 và B11 B12
Sau đó ta tìm các cận dưới (B11 ) và (B12 ) , sự phân nhánh này tạo thành
một cây và các cận dưới tăng dần (B1i ) (B), (i 1, 2)
Giả sử (B11 ) (B12 ) và tìm được x* B11 mà f (x* ) (B11 ) thì x * là
phương án tối ưu; nếu không thì chuyển sang bước sau.
Bước k:
Giả sử ở bước (k 1) ta có một phân hoạch Bik 1 trong đó
i {1, 2, ..., rk 1} và giả thiết rằng:
(Bkt 1 ) min (Bik 1 )
i
Ở bước k ta chia Bkt 1 thành một phân hoạch B1k và Bk2 ; và giả sử ta đánh số
lại các đỉnh treo cũ và các đỉnh treo mới từ 1 đến rk và giả sử rằng:
(Bsk ) min (Bik ); i {1, 2, ..., rk }
i
Nếu tìm được x B mà f (x* ) (Bsk ) thì x * là phương án tối ưu; nếu
* k
s
1
(B11 ) (B12 )
B
1 B12
B12 B22
3
Hình 5.1
Vì số phần tử của B là hữu hạn nên khả năng xấu nhất là sự phân nhánh phải
thực hiện cho đến khi mỗi đỉnh treo chỉ chứa một phần tử, như vậy thuật toán
cũng sẽ kết thúc sau một số hữu hạn bước.
Quá trình của thuật toán là thực hiện xen kẽ sự phân nhánh và tìm cận nên
thuật toán được gọi tên là thuật toán nhánh cận (Branches anh Bounds).
Hiệu quả của thuật toán phụ thuộc chủ yếu vào việc chọn hàm non G(x) có sát
với F(x) hay không và việc tìm cực tiểu của nó có dễ dàng không, cũng như sự
phân nhánh có cho phép ta nhanh chóng tìm ra phương án tối ưu không.
Nếu việc tìm cực tiểu của G(x) trên các tập con, tức là tìm cận dưới của F(x)
trên tập con đó lại rất khó khăn phức tạp thì thuật toán trở nên vô nghĩa. Ngược
lại nếu vì mục đích tìm cận dưới một cách dễ dàng, ta chọn hàm non G(x) quá xa
với F(x) tức là | F(x) G(x) | khá lớn thì rất dễ dẫn đến tình huống phải phân
nhánh cho đến khi mỗi đỉnh treo chỉ chứa một phần tử, khi đó thuật toán này
cũng không hơn gì thuật toán duyệt toàn bộ vì ta phải xem xét đến từng phương
án của tập B. Chính vì vậy mà sự phân nhánh và tìm cận phải căn cứ vào đặc thù
về cấu trúc của bài toán mà lựa chọn cho thích hợp, không có giải pháp vạn năng
cho mọi bài toán.
5.4. THUẬT TOÁN QUY HOẠCH ĐỘNG RỜI RẠC
Ở đây F(x) là một hàm N biến nhưng biểu diễn được thành tổng của N hàm
một biến, điều này cho phép chúng ta biến bài toán tĩnh đã cho thành một bài
toán động:
n
Fn (x) g i (x i ) max (hoặc min) (2)
i 1
n
a x
i 1
i i b; x i 0, (i 1, N)
Tức là ta không giải bài toán với một trị số N cố định, mà giải bài toán với
những giá trị của n thay đổi: n 1, 2, ..., N .
4
Khi đó với n 1 ta có:
F1 (x) g1 (x1 ) max
0 a1x1 b
Với n 2 ta có:
F2 (x) g1 (x1 ) g 2 (x 2 ) max
0 a1x1 a 2 x 2 b
Khi n N thì bài toán (2) trở thành bài toán (1) đã cho.
Ta ký hiệu
n
Fn (b) max g i (x i ) (3)
i 1
n
0 aixi b
i 1
Khi đó nguyên lý của quy hoạch động dựa trên phương trình truy toán dưới
đây:
Fn (b) max{g n (x n ) Fn 1(b a n x n )} (4)
0 a n x n b, (n 1, 2, 3, ...)
Theo công thức này muốn tìm Fn (b) thì phải tìm Fn 1 (b) , nghĩa là ta phải bắt
đầu từ việc tìm F1 (b) .
Ý nghĩa của nguyên lý này là biến một quá trình tối ưu hóa thành một quá
trình nhiều giai đoạn và sự tìm kiếm tối ưu toàn cục phải dựa vào sự tìm kiếm tối
ưu từng giai đoạn; còn về mặt toán học nó cho phép ta thay thế một bài toán tìm
cực trị của một hàm n biến thành n bài toán tìm cực trị của hàm một biến và
đương nhiên việc tìm cực trị của hàm một biến bao giờ cũng dễ hơn.
5.4.2. Áp dụng thuật toán quy hoạch động giải bài toán cái túi.
Mô hình toán học của bài toán cái túi có dạng:
F(x) c1x1 c2 x 2 ... c N x N max
0 a1x1 a 2 x 2 ... a N x N b
x i {0, 1}, (i = 1, N)
Phương trình truy toán của bài toán này có dạng:
Fn (b) max{cn x n Fn 1 (b a n x n )}
0 anxn b
x n {0, 1}
Thí dụ.
Giải bài toán sau:
F(x) 14x1 8x 2 28x3 42x 4 45x5 20x 6 30x 7 15x8 max
5
2x1 x 2 4x 3 7x 4 8x 5 6x 6 5x 7 3x 8 20
x i {0, 1}, i = 1, 8
Giải.
Căn cứ vào phương trình truy toán, ta lập được bảng số sau đây:
n 1 2 3 4 5 6 7 8
cn 14 8 28 42 45 20 30 15
an 2 1 4 7 8 6 5 3
b F1 (b) F2 (b) F3 (b) F4 (b) F5 (b) F6 (b) F7 (b) F8 (b)
0 0 0 0 0 0 0 0 0
1 0 8 8 8 8 8 8 8
2 14 14 14 14 14 14 14 14
3 14 22 22 22 22 22 22 22
4 14 22 28 28 28 28 28 28
5 14 22 36 36 36 36 36 36
6 14 22 42 42 42 42 42 42
7 14 22 50 50 50 50 50 50
8 14 22 50 50 50 50 52 52
9 14 22 50 56 56 56 58 58
10 14 22 50 64 64 64 66 66
11 14 22 50 70 70 70 72 72
12 14 22 50 78 78 78 80 80
13 14 22 50 84 84 84 84 84
14 14 22 50 92 92 92 92 92
15 14 22 50 92 95 95 95 95
16 14 22 50 92 95 95 95 95
17 14 22 50 92 101 101 101 101
6
Bảng 5.13
Từ bảng số này ta suy ra: maxF(x) F8 (20) 125 , đó là giá trị tối ưu.
Bây giờ ta còn phải tìm phương án tối ưu bằng cách xuất phát từ giá trị tối ưu
đã tìm được và sử dụng phương trình truy toán.
Ta thấy F8 (20) F7 (20) . Vậy x 8 0 .
Vì F7 (20) F6 (20) nên x 7 1.
Vì c7 30 và a 7 5 nên suy ra F6 (20 5) F6 (15) 125 30 95
Vì F6 (15) F5 (15) nên x 6 0
Vì F5 (15) F4 (15) nên x 5 1 .
Từ c5 45 và a 5 8 ta có F4 (15 8) F4 (7) 95 45 50
Vì F4 (7) F3 (7) nên x 4 0
Vì F3 (7) F2 (7) nên x 3 1 .
Từ c3 28 và a 3 4 ta có F2 (7 4) F2 (3) 50 28 22
Tiếp tục như trên sẽ suy ra x 2 1 và cuối cùng x1 1 .
Vậy phương án tối ưu là:
x1* x*2 x*3 x*5 x*7 1; x*4 x*6 x*8 0
Giá trị tối ưu là:
F(x* ) c1 c2 c3 c5 c7 14 8 28 45 30 125 F8 (20)
Và cũng dễ dàng kiểm tra lại:
a1 a 2 a 3 a 5 a 7 2 1 4 8 5 20 .
7
Bà i 6 . ĐỒ THỊ HỮU HẠN VÀ ỨNG DỤNG
x8 x2 x1
x5 x4 x9
x7
x3 x6 x10
Hình 6.1
xy
xy
2
x1 x2 x5 x4 x3
x3
x5
x4 x1 x2
Hình 6.4 Hình 6.5
Hình 6.4 là thí dụ về liên thông mạnh. Từ một đỉnh bất kỳ đều có đường đi
đến mọi đỉnh khác. Hình 6.5 là đồ thị liên thông yếu.
Nếu ta có G1 (X1, U1 ) và G 2 (X2 , U2 ) là hai đồ thị liên thông và
X1 X2 và U1 U2
thì đồ thị G(X, U) trong đó X X1 X2 và U U1 U2 là đồ thị không
liên thông nhưng có 2 thành phần liên thông.
x5
x4
Hình 6.6
b) Đồ thị bộ phận.
Nếu X X1 và U1 U thì G1 (X1, U1 ) là đồ thị bộ phận của
G (X, U) , tức là nếu ta bớt đi một số cung mà giữ nguyên số đỉnh thì ta có
được một đồ thị bộ phận.
3
6.1.5. Biểu diễn đồ thị bằng ma trận
a) Ma trận kề
Cho đồ thị G (X, U) trong đó X n . Ma trận A (a ij )n n là ma trận
kề của đồ thị G được xác định như sau:
1 khi (x i , x j ) U
a ij
0 khi (x i , x j ) U
Thí dụ.
x1 x2
x6
x3
x5 x4
Hình 6.7
Đồ thị cho ở hình 6.7, có ma trận kề như sau:
x1 x2 x3 x4 x5 x6
x1 0 1 1 0 0 0
x2 0 0 0 0 1 0
x3 0 0 0 0 0 0
x4 0 0 1 0 0 0
x5 1 0 0 1 0 0
x6 1 0 0 0 1 0
Ma trận kề xác định hoàn toàn cấu trúc của đồ thị. Số các số 1 trên đồ thị là số
cung của đồ thị. Số các số 1 trên hàng x i là số cung đi từ x i . Số các số 1 trên cột
x j là số các cung đến x j . Nếu tất cả các số trên dòng x i đều bằng 0 thì x i là
đỉnh ra của đồ thị (thí dụ x 3 ). Nếu tất cả các số trên cột x j đều bằng 0 thì x j là
đỉnh vào của đồ thị (thí dụ x 6 ).
Thí dụ.
x1 5 x2
8
7
x6
3
2
x3
4
4
6
x5 x4
Hình 6.8
Ma trận trọng số của đồ thị trên hình 6.8 có dạng như sau:
x1 x2 x3 x4 x5 x6
x1 0 5 7
x2 0 2
x3 0
x4 4 0
x5 3 6 0
x6 8 4 0
Việc biểu diễn đồ thị bằng ma trận tạo điều kiện cho việc giải các bài toán tìm
kiếm hoặc tối ưu trên đồ thị bằng máy tính điện tử.
6.2. ĐỒ THỊ VÔ HƯỚNG
5
thí dụ về đồ thị vô hướng. Chẳng hạn khi xem bản đồ giao thông thì mỗi nút giao
thông: giao điểm của 2 hoặc nhiều đường coi như 1 đỉnh; đường giao thông nối
liền 2 nút coi như một cạnh, không phân biệt nút đầu và nút cuối, mỗi cạnh cũng
có thể coi như 2 cung ngược chiều nhau. Do đó khi chuyển từ đồ thị có hướng
sang đồ thị vô hướng, có những khái niệm vẫn giữ nguyên (chẳng hạn đỉnh của
đồ thị); có những khái niệm phải đối tên cho phù hợp, để tránh lầm lẫn.
a) Một số khái niệm được đổi tên.
- Cung đổi thành cạnh
- Đường đi từ x đến y đổi thành xích nối x và y
- Mạch là đường đi khép kín đổi thành: chu trình là xích nối khép kín
Từ đó cũng suy ra:
- Xích sơ cấp là xích đi qua mỗi đỉnh một lần.
- Chu trình sơ cấp là một xích sơ cấp khép kín.
- Chu trình Euler là một chu trình đi qua tất cả các cạnh, mỗi cạnh một
lần.
- Chu trình Hamilton là chu trình đi qua tất cả các đỉnh, mỗi đỉnh một
lần.
b) Một số khái niệm giữ nguyên tên gọi, nhưng nội dung cần được xác định lại
cho phù hợp với đồ thị vô hướng.
- Hai đỉnh kề nhau là 2 đỉnh có cạnh nối.
- Hai cạnh kề nhau là 2 cạnh có một đỉnh chung.
- Nếu bớt đi một số đỉnh và những cạnh liên quan đến các đỉnh đó thì ta
được một đồ thị con.
- Nếu giữ nguyên các đỉnh và bớt đi một số cạnh ta được một đồ thị bộ
phận.
- Đồ thị vô hướng gọi là liên thông nếu mọi cặp đỉnh (x, y) đều có 1 xích nối.
Trong đồ thị vô hướng không có khái niệm liên thông mạnh và liên thông yếu.
6.2.2. Đồ thị đủ
Đồ thị G(X, V) gọi là đồ thị đủ nếu mọi cặp đỉnh đều kề nhau; nghĩa là
(x, y) V x, y X .
Nếu X n thì số cạnh sẽ là:
n(n 1)
V C2n
2
Định nghĩa trên cũng được dùng cho đồ thị có hướng G (X, U) , nhưng nội
dung cần được hiểu chính xác hơn; đó là với mọi cặp đỉnh (x, y) nếu cung
(x, y) U thì (y, x) U , nghĩa là mọi cặp đỉnh đều kề nhau.
Dễ dàng thấy rằng đồ thị đủ có các tính chất sau đây:
- Đồ thị đủ không có đỉnh cô lập.
- Đồ thị đủ là đồ thị liên thông.
- Mọi đồ thị con của đồ thị đủ cũng là đồ thị đủ.
6
6.3. ĐỒ THỊ EULER VÀ ĐỒ THỊ HAMILTON
Khái niệm bậc của đỉnh có ý nghĩa quan trọng trong việc nghiên cứu đồ thị
Euler và đồ thị Hamilton và từ đó giúp ta nghiên cứu các bài toán quan trọng
trong lý thuyết đồ thị.
x4 x3 x4 x3 x4 x3
H1 H2 H3
Hình 6.11
7
Trên hình 6.11:
H1 là đồ thị Euler vì có chu trình Euler (x1, x 2 , x 3 , x 4 , x1) ;
H 2 là đồ thị nửa Euler vì có xích Euler (x1, x 2 , x 3 , x 4 , x1, x 3 ) .
Còn H 3 không có chu trình Euler, cũng không có đường đi Euler.
Một điều quan trọng là làm thế nào để nhận biết một đồ thị đã cho có phải là đồ
thị Euler hay không. Muốn vậy ta chứng minh định lý sau đây:
b) Định lý Euler.
Đồ thị liên thông G(X, V) là đồ thị Euler khi và chỉ khi mọi đỉnh của G đều
có bậc chẵn.
C D
B
Hình 6.13
Trong nhiều năm, đây là bài toán khó. Người ta liệt kê rất nhiều hành trình
nhưng không tìm được lời giải. Tuy nhiên cũng không ai chứng minh được hành
trình thỏa mãn điều kiện trên là không có. Năm 1736 nhà toán học Thụy sĩ là
Euler đã công bố lời giải bài toán này, và đây cũng là ứng dụng đầu tiên của lý
thuyết đồ thị. Euler đã biểu diễn bản đồ trên hình 6.13 bởi một đồ thị phẳng dưới
đây, trong đó mỗi cạnh nối hai đỉnh tương ứng với 1 chiếc cầu.
8
A
C D
Hình 6.14
Hành trình đi qua tất cả 7 chiếc cầu, mỗi cầu 1 lần, tương ứng mỗi một chu
trình Euler của đồ thị (hình 6.14). Nhưng đồ thị này không phải là đồ thị Euler vì
có các đỉnh bậc lẻ (ở đây tất cả các đỉnh đều có bậc lẻ). Do đó hành trình thỏa
mãn các điều kiện đặt ra là không có. Bài toán đã được giải quyết.
a) Định nghĩa.
Đồ thị G(X, V) gọi là đồ thị Hamilton nếu nó liên thông và chứa một chu
trình đi qua tất cả các đỉnh, mỗi đỉnh một lần. Đồ thị trên hình 6.14 là đồ thị
Hamilton, vì có chu trình ACBDA đi qua tất cả các đỉnh mỗi đỉnh một lần. Cho
đến nay việc tìm điều kiện cần và đủ cho đồ thị Hamilton vẫn còn là một vấn đề
mở, nhưng có một kết quả nghiên cứu đáng chú ý là nếu ta tăng thêm số cạnh nối
các đỉnh của G đến một mức nào đó thì sẽ thu được một đồ thị Hamilton. Đó là
một điều kiện đủ, thể hiện bằng một định lý dưới đây.
Hình 6.15
10
6.4.3. Bài toán liệt kê cây
Cho một đồ thị vô hướng đủ, có n cạnh:
n(n 1)
G (X, V); X n; V
2
Vấn đề đặt ra là G(X, V) chứa bao nhiêu cây bao nhiêu trùm khác nhau. Nói
cách khác, nếu có n đỉnh thì có thể tạo ra bao nhiêu cây bao trùm khác nhau.
Trả lời câu hỏi này, ta có định lý sau đây:
a) Định lý Kelly (1889)
Với n đỉnh cho trước thì có đúng n n 2 cây bao trùm khác nhau.
Thí dụ. Với n 4 ta có T4 42 16 ; n 5 thì T5 53 125 .
11
Bà i 7 . CÁC BÀI TOÁN TỐI ƯU TRÊN ĐỒ THỊ
x1 2 x2
10 4 3
12 8
x6 13 x3
9 6 5
6
x5 7 x4
Các cạnh được sắp xếp theo dãy không giảm của độ dài:
{2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13}
Đầu tiên ta chọn các cạnh có độ dài 2 và 3, cạnh có độ dài 4 bị loại vì nó tạo
thành chu trình với hai cạnh đã chọn, ta chọn tiếp cạnh có độ dài 5, trong 2 cạnh có
dộ dài 6 ta chỉ chọn 1. Vì nếu chọn cả 2 thì chúng sẽ tạo thành chu trình; cạnh độ
1
dài 7 và 8 cũng bị loại vì lý do đó; ta chọn tiếp cạnh 9 là đủ 5 cạnh (vì có 6 đỉnh) và
thuật toán kết thúc.
Có 2 cây bao trùm ngắn nhất như hình dưới đây:
x1 2 x2 x1 2 x2
3 3
x6 6 x3 x6 x3
6
9 9
5 5
x5 x4 x5 x4
T1* T2*
(T1* ) (T1* ) 2 3 5 6 9 25
10 4 3
12 8
x6 13 x3
9 6 5
6
x5 7 x4
Giả sử ở bước 1 ta chọn:
Bước 1: X1 {x 3}, V1 {}
Bước 2: X2 {x 3 , x 2}, V2 {(x 3 , x 2 )} .
Bước 3: X3 {x 3 , x 2 , x1}, V3 {(x 3 , x 2 ), (x 2 , x1)} .
Bước 4: X4 {x 3 , x 2 , x1, x 4}
V4 {(x3 , x 2 ), (x 2 , x1 ), (x 3 , x 4 )}
Bước 5: X5 {x3 , x 2 , x1, x 4 , x 5}
V5 {(x3 , x 2 ), (x 2 , x1), (x 3 , x 4 ), (x1, x 5 )}
Bước 6: X6 {x3 , x 2 , x1, x 4 , x 5 , x 6}
V6 {(x3 , x 2 ), (x 2 , x1), (x 3 , x 4 ), (x1, x 5 ), (x 5 , x 6 )}
Kết thúc.
Trong ví dụ trên, vì số đỉnh và số cạnh không lớn, nên ta có thể tìm thấy một
cách trực quan. Trong trường hợp số đỉnh và số cạnh khá lớn, để thực hiện thuật
toán Prim một cách hiệu quả hơn, nghĩa là nhanh chóng tìm được đỉnh và cạnh để
bổ sung và cây bao trùm, ta thực hiện sự gán nhãn cho các đỉnh của đồ thị. Giả sử ở
bước khởi tạo ta chọn một đỉnh bất kỳ nào đó, chẳng hạn là x m ; khi đó nhãn của
x m là [0, x m ] . Số 0 biểu thị khoảng cách từ x m đến x m . Giả sử ở bước k, ta đã có
X k và x i Xk . Ta tìm min (x i , y) (x i , yi ) i
y Xk
3
Khi đó nhãn của x i là [ i , yi ] . Sau đó nếu r min i thì đỉnh x r được tuyển
và cạnh (x r , y r ) được bổ sung vào cây khung.
Trước hết ta biểu diễn đồ thị ở hình 6.21 bằng ma trận trọng số dưới đây:
x1 x2 x3 x4 x5 x6
x1 0 2 4 8 6 10
x2 2 0 3 12
x3 4 3 0 5 6 13
x4 8 5 0 7
x5 6 6 7 0 9
x6 10 12 13 9 0
Để phù hợp với thí dụ trên, ở bước khởi tạo ta chọn x 3 , khi đó tại các bước lặp,
nhãn của các đỉnh biểu thị bằng bảng dưới đây.
Ở bước 1; x 2 được chọn nên nhãn của nó là cố định trong các bước lặp tiếp
theo, ta ghi nhận điều đó bằng các dấu - ; còn x 2 được chọn, ta đánh dấu *.
Sau 6 bước thuật toán kết thúc, ta cũng có 2 lời giải tùy theo ở bước 4 ta chọn
cạnh (x1, x 5 ) hay (x 3 , x 5 ) .
Quá trình thực hiện thuật toán được ghi lại trong bảng dưới đây.
Bước x3 , x 2
[2, x1 ]* - - [5, x 3 ] [6, x 3 ] [12, x 2 ] (x 3 , x 2 )
2
Bước x 3 , x 2 , (x 3 , x 2 )
4 - - - - [6, x1 ]* [10, x1 ] x1 , x 4 (x 2 , x1 )
4
[6, x 3 ] (x 4 , x 3 )
(x 3 , x 2 )
x3, x 2 ,
Bước (x 2 , x1 )
- - - - -
x1 , x 4 ,
5 [9, x 5 ]* (x 4 , x 3 )
x5 (x 3 , x 5 )
(x 3 , x 2 )
x 3 , x 2 , (x 2 , x1 )
Bước - - - - - - x1 , x 4 , (x 4 , x 3 )
6
x 5 , x 6 (x 3 , x 5 )
(x 5 , x 6 )
5
Bước k: Tìm Lk {x X : 1x L1 L2 ... Lk 1} ; và x Lk ta gán
Thí dụ. Tìm đường đi ngắn nhất từ S đến Z trên đồ thị dưới đây:
12
1 4
5 4 10
7 6
13 12 5
S 3 6 Z
5 4 7
8 14
2 5
6
5 16
12
1 4
5 4 10
0 7 12 6 21 26
13 12 5
S 3 6 Z
5 4 7
8 14
2 5
6
8 14
Số ghi trong hình khuyên tại mỗi đỉnh là độ dài đường đi ngắn nhất từ S
đến đỉnh đó
6
Muốn tìm đường đi cụ thể thì ta bắt đầu từ Z và lan tỏa ngược lại để tìm các
đỉnh thuộc đường đi ngắn nhất kề với nó.
Giả sử x là đỉnh kề với Z. Nếu (x) (x, Z) (Z) thì x là đỉnh thuộc
đường đi ngắn nhất. Theo quy tắc này ta tìm được 2 đường đi ngắn nhất.
T1* (S, 1, 3, 4, Z) và T2* (S, 2, 5, 6, Z)
(T1* ) (T2* ) 26 .
Ý nghĩa của hàm (u) , đó là lượng hàng hóa tải qua cung u trong một đơn vị
thời gian, lấy giá trị nguyên, không âm, và không vượt quá tải năng t(u); tại mọi
đỉnh trung gian (không kể S và Z) tổng lượng hàng hóa đến một đỉnh nào đó bằng
lượng hàng hóa đi khỏi đỉnh ấy. Từ đó suy ra.
f () (u) (u)
u US u UZ
f () gọi là cường độ của luồng, đúng bằng tổng lượng hàng hóa chuyển đến Z.
Luồng (u) như trên là tồn tại; chẳng hạn (u) 0, u . Ta gọi là tập mọi
luồng (u) , rõ ràng
Bài toán đặt ra là: Tìm * sao cho
f (* ) f (),
* gọi là luồng vận tải cực đại của mạng vận tải đã cho.
b) Thuật toán Ford – Fulkerson (cải biên)
Trước khi trình bày thuật toán, ta hãy làm quen một số thuật ngữ sau đây:
- Cung u gọi là cung bão hòa nếu (u) t(u) .
7
- Đường đi từ S đến Z gọi là đường đầy nếu nó chứa ít nhất một cung
bão hòa.
- Luồng đạt giá trị cực đại, gọi tắt là luồng cực đại, nếu mọi đường đi từ
S đến Z đều là đầy.
Dựa vào những khái niệm như trên, thuật toán Ford – Fulkerson có thể mô tả
như sau:
Bước 1: Chọn một đường đi nào đó từ S đến Z, gọi là T1 và làm cho T1 trở
thành đầy. Ký hiệu f (T1 ) min t(u) .
u T1
Khi giải các bài toán cụ thể trên một mạng vận tải không phức tạp lắm, ta có thể
chọn đồng thời một số đường khác nhau từ S đến Z để xử lý cùng một lúc, điều này
giúp cho ta rút ngắn thời gian giải bài toán.
Thí dụ. Áp dụng thuật toán Ford – Fulkerson để tìm luồng cực đại trên mạng
vận tải dưới đây:
5
1 4
7
12 6 5 6
15 7 20
S 3 6 Z
3 10 7
9 10
2 5
6
1 4
2 1 2
1
1 1
S 3 6 Z
3 3
3 4
2 5
1
2 5
Đồ thị G 3 thỏa mãn các điều kiện kết thúc của thuật toán
6
Luồng cực đại có giá trị là: f ( ) *
f (T ) 5 7 6 5 7 3 33 .
i 1
i
9
Bà i 8 . MỘT SỐ VẤN ĐỀ VỀ LOGIC TOÁN
8.1.1. Mệnh đề
Trong ngôn ngữ thông thường, mệnh đề được hiểu như là một câu bao gồm
một số thành phần nhất định và nêu lên một nội dung nào đó, nhưng logic toán
chỉ quan tâm đến những câu mà ta có thể khẳng định được nó là đúng hay sai.
Thí dụ.
a) Những khẳng định sau đây là mệnh đề:
- Paris là thủ đô của nước Pháp.
- 5 là một số lớn hơn 3.
- Phương trình x 2 3x 2 0 vô nghiệm.
- 6 là số nguyên tố.
Hai mệnh đề đầu là đúng, ta nói chúng có giá trị 1; hai mệnh đề sau là sai,
chúng có giá trị 0.
1
c) Phép tuyển
Tuyển của 2 mệnh đề A và B ký hiệu là A B (đọc là A hoặc B) là một
mệnh đề chỉ lấy giá trị 0 khi cả A và B có giá trị 0.
A B AB
0 0 0
0 1 1
1 0 1
1 1 1
A B AB
0 0 0
0 1 1
1 0 1
1 1 0
d) Phép kéo theo
A kéo theo B là một mệnh đề, ký hiệu là A B (đọc là nếu A thì B) chỉ lấy
giá trị sai khi A đúng, B sai.
Bảng giá trị của A B như sau:
2
A B AB
0 0 1
0 1 1
1 0 0
1 1 1
Theo bảng giá trị này thì: nếu A là sai thì A B luôn luôn đúng cho dù B
đúng hay sai; còn nếu A là đúng thì A B chỉ đúng khi B đúng.
Trong phép toán này thì A coi như điều kiện đủ của B hay B là điều kiện cần
của A.
Trong các phép toán trên thì ba phép toán: phủ định, tuyển, hội là các phép
tính cơ bản, còn các phép toán còn lại được suy ra từ các phép toán trên, chẳng
hạn A B và A B cùng có bảng giá trị như nhau, nên ta có thể viết
A B A B.
A B A AB
0 0 1 1
0 1 1 1
1 0 0 0
1 1 0 1
3
Các biến mệnh đề x, y, z được gán những mệnh đề khác nhau: A, B, C;
nhưng các mệnh đề A, B, C chỉ lấy các giá trị 0 hoặc 1 nên cuối cùng các biến
mệnh đề cũng chỉ lấy các giá trị 0 hoặc 1, các biến mệnh đề cũng còn gọi là biến
Boole.
8.2.2. Định nghĩa 2
Hai biểu thức logic (hoặc 2 dạng mệnh đề) E và F gọi là tương đương logic
nếu nó có cùng bảng chân lý như nhau. Khi ấy ta viết:
E F hay E F
Như đã chứng minh ở trên x y x y .
8.2.3. Định nghĩa 3
a) Dạng mệnh đề là một hằng đúng nếu nó luôn lấy giá trị 1.
b) Dạng mệnh đề là một hằng sai nếu nó luôn lấy giá trị 0.
Dễ dàng thấy rằng hai mệnh đề E và F là tương đương logic khi và chỉ khi
E F là một hằng đúng.
Nếu chỉ chú ý đến phép kéo theo 1 chiều thì ta có định nghĩa sau đây:
8.2.4. Định nghĩa 4
Dạng mệnh đề F được gọi là hệ quả logic của dạng mệnh đề E nếu E F là
một hằng đúng.
8.3. CÁC QUY TẮC THAY THẾ LOGIC
8.3.1. Quy tắc 1
Giả sử E f (F1, F2 ,..., Fn ) là biểu thức logic được xây dựng từ các biểu thức
mệnh đề tùy ý thì E f (F1 , F2 ,..., Fn ) vẫn là một hằng đúng.
Nhờ cách thay thế này ta có thể phức tạp hóa hoặc đơn giản hóa một biểu
thức của một hằng đúng.
Ngoài 2 qui tắc trên ta còn sử dụng 10 biểu thức tương đương logic (còn gọi
là 10 quy luật logic) để rút gọn một dạng mệnh đề cho trước.
4
Với x, y, z là các biến mệnh đề, 1 là hằng đúng; 0 là hằng sai, ta có các quy
luật logic sau đây:
x (y z) (x y) z
6. Luật kết hợp
x (y z) (x y) z
x (y z) (x y) (x z)
7. Luật phân bố
x (y z) (x y) (x z)
x (x y) x
8. Luật hấp thu
x (x y) x
xyxy
9. Luật De Morgan
xyxy
Luật phủ định của
10. xx
phủ định
Ta có thể kiểm tra các luật trên bằng cách lập các bảng giá trị của chúng để so
sánh.
Thí dụ. Ta có thể áp dụng liên tiếp quy tắc thay thế thứ nhất để có được các tương
đương logic sau đây:
[x (x y)] y [x (x y)] y [(x x) (x y)] y
[0 (x y)] y (x y) y (x y) y (x y)] y
= x (y y) x 1 1
Vậy [x (x y)] y là một hằng đúng.
Trong các chứng minh toán học, người ta thường xuất phát từ một số khẳng
định đúng cho trước mà ta thường gọi là giả thiết hay tiền đề và áp dụng các quy
tắc suy diễn logic để suy ra một khẳng định nào đó mà ta gọi là kết luận; đó là hệ
5
quả logic của giả thiết. Chẳng hạn xuất phát từ các mệnh đề p1, p2 , ..., pn và q là
hệ quả logic của chúng thì dạng mệnh đề dưới đây là một hằng đúng.
(p1 p2 ... pn ) q .
Phép suy diễn trên được mô hình hóa bởi sơ đồ sau:
p1
p2
pn
q
Dưới đây là những phép suy diễn cơ bản, từ đó người ta có thể tích hợp chúng
để tạo ra những phép suy diễn phức tạp hơn. Mỗi phép suy diễn cơ bản là một
hằng đúng mà chúng ta có thể kiểm tra bằng cách lập bảng giá trị của nó.
p
q
Thí dụ.
- Nếu n là số chẵn thì n chia hết cho 2.
- Mà n là số chẵn.
- Suy ra n chia hết cho 2.
Người ta có thể áp dụng quy tắc này cùng với phương pháp thay thế logic để
đơn giản hóa các bước suy luận.
8.4.2. Quy tắc Syllogism (Phương pháp tam đoạn luận)
Quy tắc Syllogism được thể hiện bởi hằng đúng sau:
[(p q) (q r)] (p r)
hoặc sơ đồ:
pq
qr
p r
Thí dụ
6
p: hai tam giác vuông có 1 cạnh bằng nhau và 1 góc nhọn bằng nhau.
q: hai tam giác có 1 cạnh bằng nhau kèm giữa 2 góc bằng nhau.
r: hai tam giác bằng nhau.
Vậy p r : Hai tam giác vuông có một bằng nhau và một góc nhọn bằng
nhau thì bằng nhau.
p
8.5. VỊ TỪ VÀ LƯỢNG TỪ
7
8.5.1. Định nghĩa 1.
Khẳng định p(x) gọi là một vị từ nếu:
- Bản thân p(x) không phải là mệnh đề.
- Nếu thay x bởi một phần tử a A thì p(a) là một mệnh đề, mệnh đề đó có
thể đúng hoặc sai, x được gọi là biến tự do của vị từ p(x) .
Thí dụ. p(x) : x là số nguyên tố. Đây là một vị từ.
Ta thấy:
p(1), p(2), p(5), p(7) là các mệnh đề đúng có 1 biến tự do x.
Còn p(4), p(6), p(15) là các mệnh đề sai.
8
8.6. HÀM ĐẠI SỐ LOGIC
n
số các hàm đại số logic khác nhau của n biến là 22 , chẳng hạn với n 3 thì có
8 bộ giá trị khác nhau của biến và 28 256 hàm đại số logic khác nhau của 3
biến.
Các hàm đại số logic phụ thuộc thực sự vào các biến được gọi là hàm đại số
logic sơ cấp; với n 2 ta có các hàm thông dụng sau đây:
x y f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
0 0 0 0 0 1 1 1 1 1 0 0
0 1 1 0 1 1 0 0 1 0 1 0
1 0 1 0 1 0 0 0 1 1 0 1
1 1 1 1 0 1 1 0 0 1 0 0
Trong đó:
f1 x y Tuyển của x và y
f2 x y Hội của x và y
f3 x y Tuyển loại của x và y
9
f4 x y Hàm kéo theo (x kéo theo y)
f5 x y Gọi là hàm tương đương
f6 x y Gọi là hàm Vebb của x và y (x y x y)
f7 x | y Gọi là hàm Sheffer của x và y (x | y x y)
f8 x y
f 9 f8 x y
f10 f 4 (x y) x y
Trong các hàm trên quan trọng nhất là hàm tuyển và hội. Các hàm khác được
suy ra từ hàm tuyển, hội cùng với phép toán phủ định.
Ta thấy rằng mỗi một biểu thức logic, ta có thể lập được bảng giá trị của nó,
do đó nó có một hàm đại số logic tương đương logic với biểu thức logic đó,
nghĩa là chúng có cùng một bảng giá trị như nhau. Nói gọn lại mỗi một biểu thức
logic tương ứng với một hàm đại số logic; và ngược lại mỗi hàm đại số logic
cũng có thể cho bởi một biểu thức logic.
Bằng các phép thay thế logic, ta có thể thấy rằng một hàm đại số logic có thể
cho bởi nhiều biểu thức logic có dạng khác nhau (nhưng có cùng bảng giá trị như
nhau). Vì vậy ta quan tâm đến những dạng nào có ít phép toán nhất.
7.6.3. Tìm dạng chuẩn tắc của các hàm đại số logic
a) Tìm dạng tuyển chuẩn tắc
Ta tiến hành theo trình tự sau đây:
- Lập bảng giá trị của hàm đại số logic.
- Tìm các hội sơ cấp.
- Tìm tuyển của các hội sơ cấp.
Thí dụ.
Tìm dạng tuyển chuẩn tắc của hàm đại số logic cho bởi biểu thức logic sau
đây:
F(x, y, z) (x | y) (y z)
- Trước tiên ta lập bảng giá trị của F(x, y, z) .
0 0 1 1 1 1 H1 x y z
0 1 0 1 1 1 H2 x y z
0 1 1 1 0 0
1 0 0 1 0 0
1 0 1 1 1 1 H3 x y z
1 1 0 0 1 1 H4 x y z
1 1 1 0 0 1 H5 x y z
x y z F(x, y, z)
0 0 0 0 T1 x y z
0 1 1 0 T2 x y z
1 0 0 0 T3 x y z
Ta biết rằng tuyển của các mệnh đề có giá trị 0 khi mọi mệnh đề lấy giá trị 0,
nên ta dễ dàng tìm được:
T1 x y z
T2 x y z
T3 x y z
và do đó dạng hội chuẩn tắc của F(x, y, z) là
F(x, y, z) T1 T2 T3
(x y z) (x y z) (x y z) .
12
Ta cũng thấy rằng dạng tuyển chuẩn tắc và hội chuẩn tắc mà chúng ta vừa tìm
được đều là dạng chuẩn tắc đầy đủ.
7.6.4. Biểu diễn các hàm đại số logic chỉ bằng 2 phép tính
Dạng chuẩn tắc của một hàm đại số logic cho dù có bao nhiêu biến cũng chỉ
có 3 phép tính: tuyển, hội và phủ định. Ta tìm cách biểu diễn một hàm đại số
logic chỉ bằng 2 phép tính: hoặc là tuyển và phủ định hoặc là hội và phủ định.
a) Chỉ có dấu tuyển và phủ định
Muốn vậy ta phải làm mất các dấu hội chứa trong biểu thức của F(x, y, z) ;
ta chỉ việc áp dụng luật phủ định của phủ định và luật DeMorgan.
A A và A B A B
Thí dụ
F(x, y, z) (x y z) (x y z) (x y z)
(x y z) (x y z) (x y z)
(x y z) (x y z) (x y z)
b) Chỉ có dấu hội và phủ định
Ta sẽ làm mất dấu tuyển bằng cách áp dụng 2 công thức:
A A và A B A B
Thí dụ
F(x, y, z) (x y z) (x y z) (x y z)
(x y z) (x y z) (x y z)
(x y z) (x y z) (x y z)
8.7. CỔNG LOGIC VÀ TỔNG HỢP CÁC MẠCH LOGIC
Có thể sử dụng các phép toán mệnh đề và hàm đại số logic để mô hình hóa
các mạch trong các thiết bị điện tử nói chung và trong máy tính nói riêng. Mỗi
máy tính có nhiều mạch, mỗi mạch có thể mô hình hóa bởi các quy tắc của các
phép toán mệnh đề. Các phần tử cơ bản của một mạch gọi là một cổng, mỗi cổng
thực hiện một phép toán mệnh đề. Có 3 loại cổng tương ứng với 3 phép toán
mệnh đề. Các cổng mà ta nghiên cứu ở đây chỉ phụ thuộc đầu vào mà không phụ
thuộc vào trạng thái của mạch; đó là những mạch không có khả năng nhớ, những
mạch như vậy gọi là các mạch tổ hợp.
8.7.1. Cổng NOT
Cổng NOT tương ứng với phép toán phủ định, nếu đầu vào là x thì đầu ra là
x , nó có vai trò như một bộ đảo mạch. Cổng NOT được mô tả bởi hình dưới đây:
x x
NOT
13
8.7.2. Cổng AND. Cổng AND thực hiện phép hội, đầu vào có thể nhận nhiều
biến, đầu ra là hội của các biến đó và được mô tả bởi hình dưới đây:
x
xyz
y
z
AND
8.7.3. Cổng OR
Cổng OR thực hiện phép tuyển, đầu vào có thể nhận nhiều biến, đầu ra là
tuyển của các biến đó. Cổng OR được mô tả bởi hình dưới đây
x
xyz
y
z
OR
8.7.4. Thiết kế mạch logic thực hiện một hàm đại số logic cho trước
Ta biết rằng một hàm đại số logic cho trước, bao giờ cũng có thể tìm được
dạng chuẩn tắc của nó. Trong dạng chuẩn tắc chỉ có 3 phép tính phủ định, tuyển
và hội, các phép tính này tương ứng với các cổng NOT, OR và AND nên ta có
thể sử dụng các cổng này để thiết kế một mạch logic để thực hiện hàm đại số
logic đã cho.
Thí dụ. F(x, y, z) (x y z) (x y z) (x y z)
AND
x
x y z
y
z OR
AND
x
x y z F(x, y, z)
y
xz
AND
x
x y z
y
z
14