You are on page 1of 61

Chương 2.

Thuật toán – Thuật giải


algorithm vs. heuristic

Khoa CNTT Huflit

1
Nội dung
1. Thuật toán?
2. Thuật toán vs Thuật giải
3. Thuật giải Heuristic & các nguyên lý
4. Tìm kiếm chiều sâu & Tìm kiếm chiều rộng
5. Tìm kiếm leo đồi
6. Tìm kiếm ưu tiên tối ưu
7. Một số thuật giải cơ bản
Thuật toán (Algorithm)
• Trong khoa học máy tính, thuật toán được định nghĩa là một
dãy hữu hạn các bước không mập mờ và có thể thực thi được,
quá trình hành động theo các bước này phải dừng và cho
được kết quả như mong muốn.
• Cách thức/ quy trình thực hiện hoàn thành một công việc xác định cụ
thể nào đó.
VD Cộng 2 số, tính tổng dãy Fibonaci, …
Đặc trưng của Thuật toán
1. Tính đúng đắn / chính xác
2. Tính dừng / kết thúc
3. Tính xác định
4. Tính hiệu quả (effectiveness)
5. Tính phổ quát (generalliness)
Đặc trưng của Thuật toán …
[1] Tính đúng đắn
Đảm bảo kết quả đúng sau khi thực hiện đối với bộ dữ liệu đầu
vào.
[2] Tính dừng
Dừng → Sau hữu hạn các bước thực hiện.
Đặc trưng của Thuật toán …Tính dừng
Tính tổng các số nguyên dương lẻ trong khoảng từ 1 đến n

B1. Hỏi giá trị của n.


B2. S = 0
B3. i = 1
B4. Nếu i = n+1 thì sang bước B8, ngược lại sang bước B5
B5. Cộng thêm i vào S
B6. Cộng thêm 2 vào i
B7. Quay lại bước B4.
B8. Tổng cần tìm chính là S.
Đặc trưng của Thuật toán …
[3] Tính xác định
- Rõ ràng, cụ thể
- Không nhập nhằng, gây hiểu lầm → hiểu, cài đặt
"không mập mờ" và "có thể thực thi được"
[4] Tính hiệu quả
- Giải quyết trong thời gian, điều kiện cho phép
- Đáp ứng yêu cầu người dùng
[5] Tính phổ quát
Có thể giải quyết được một lớp bài toán tương tự
Đặc trưng của Thuật toán …Tính phổ quát

VD: Có n hộp có khối lượng khác nhau và một cái cân dĩa.
Hãy chỉ ra cách cân để tìm được hộp có trọng lượng nặng
nhất.
Vấn đề này là thể hiện của một bài toán tổng quát:
Cho một tập hợp A hữu hạn và một thứ tự toàn phần trên A. Hãy
xây dựng thuật toán tìm phần tử lớn nhất của A.
Cách biểu diễn thuật toán

02 cách phổ biến


[1] Mô tả các bước thực hiện của thuật toán.
[2] Sử dụng sơ đồ thuật toán.
Cách biểu diễn thuật toán
[1] Mô tả các bước thực hiện của thuật toán
- Ngôn ngữ tự nhiên
- Mã giả (Pseudocode): Lai ghép ngôn ngữ tự nhiên với mã của
ngôn ngữ lập trình
VD. Mô tả các bước thực hiện của thuật toán
tìm USCLN của hai số nguyên – NN tự nhiên
• Input: Hai số nguyên a, b
• Output: USCLN của a và b
• Thuật toán:
• Bước 1: Nếu a = b thì USCLN là a
• Bước 2: Nếu a > b thì tìm USCLN của a - b và b, quay lại Bước 1
• Bước 3: Nếu a < b thì tìm USCLN của a và b - a, quay lại Bước 1
VD. Mô tả các bước thực hiện của thuật toán
tìm USCLN của hai số nguyên – Mã giả
• Input: Hai số nguyên a, b
• Output: USCLN của a và b
• Thuật toán:
WHILE (a ≠ b) DO
IF (a > b) THEN
a = a – b;
ELSE
b = b – a;
END WHILE
RETURN a;
Một số từ khóa mã giả cơ bản
IF <Điều kiện> THEN …ENDIF
IF <Điều kiện> THEN ... ELSE ... ENDIF
WHILE <Điều kiện> DO … ENDWHILE
DO … UNTIL <Điều kiện>
DISPLAY …
RETURN …
Cách biểu diễn thuật toán
[2] Sử dụng sơ đồ thuật toán (flowchart)
Dùng các ký hiệu hình học để biểu diễn quá trình thực hiện

Nhập/ xuất

Bắt đầu/ kết thúc Trả về giá trị

Điều
Rẽ nhánh
kiện Khối xử lý

Luồng xử lý
VD. Sơ đồ thuật toán tìm trị tuyệt đối của số nguyên

• Input: Số nguyên n
• Output: Giá trị tuyệt đối của n
• Thuật toán:
Tiêu chí đánh giá thuật toán
• Đánh giá độ tốt/ xấu của các thuật toán cùng loại
• Đơn giản, dễ hiểu, dễ cài đặt
• Thời gian thực hiện và tài nguyên sử dụng
• Thông thường so sánh các thuật toán dựa vào độ phức tạp về
thời gian thực thi: độ phức tạp của thuật toán (algorithm
complexity)
→ ước lượng số phép tính cần thực hiện
Độ phức tạp thuật toán
Cách tính Ðộ phức tạp
• Qui tắc cộng
Nếu T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương
trình P1 và P2; và
T1(n)=O(f(n)), T2(n)=O(g(n)) thì thời gian thực hiện của đoạn hai
chương trình đó nối tiếp nhau là:
T(n)=O(max(f(n),g(n)))
Độ phức tạp thuật toán
Cách tính Ðộ phức tạp
• Qui tắc nhân
Nếu T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương trình P1và
P2 và T1(n) = O(f(n)), T2(n) = O(g(n)) thì thời gian thực hiện của đoạn hai
đoạn chương trình đó lồng nhau là
T(n) = O(f(n).g(n))
Độ phức tạp thuật toán
Cách tính Ðộ phức tạp: Qui tắc tổng quát
Thời gian thực hiện của mỗi lệnh gán, READ, WRITE là O(1). Thời gian
thực hiện của một chuỗi tuần tự các lệnh được xác định bằng qui tắc
cộng. Như vậy thời gian này là thời gian thi hành một lệnh nào đó lâu nhất
trong chuỗi lệnh. Thời gian thực hiện cấu trúc IF là thời gian lớn nhất thực
hiện lệnh sau THEN hoặc sau ELSE và thời gian kiểm tra điều kiện.
Thường thời gian kiểm tra điều kiện là O(1).
Thời gian thực hiện vòng lặp là tổng (trên tất cả các lần lặp) thời gian
thực hiện thân vòng lặp. Nếu thời gian thực hiện thân vòng lặp không đổi
thì thời gian thực hiện vòng lặp là tích của số lần lặp với thời gian thực
hiện thân vòng lặp.
VD Cho một dãy số a có n phần tử a1, a2, ...an. Hãy xây
dựng thuật toán để tìm con số lớn nhất trong dãy a.
1. Ghi nhớ amax = a1
2. i = 2
3. Nếu (i < n+1) thì thực hiện các bước sau, ngược lại sang
bước 5
3.1. Nếu (ai > amax ) thì
3.1.1. Ghi nhớ amax = ai
3.2. Tăng i lên 1
4. Trở lại bước 3
5. Phần tử lớn nhất dãy a chính là amax . Kết thúc.
VD. Thuật toán sắp xếp mảng một chiều bằng
phương pháp đổi chỗ trực tiếp
• Input: Mảng một chiều a, kích thước N
• Ouput: Mảng a có thứ tự tăng dần
• Thuật toán:
Bước 1: i=1;
Bước 2: j = i+1;
Bước 3:
Trong khi j<=N thực hiện
Nếu a[j]<a[i]: Hoán vị a[i], a[j];
j=j+1;
Bước 4: i = i+1;
Nếu i<N: Lặp lại Bước 2
Ngược lại: Kết thúc.
VD. Thuật toán sắp xếp mảng một chiều bằng
phương pháp chọn trực tiếp
• Input: Mảng một chiều a, kích thước N
• Ouput: Mảng a có thứ tự tăng dần
• Thuật toán:
Bước 1: i = 1;
Bước 2: Tìm phần tử a[vtmin] nhỏ nhất trong dãy a[i] … a[N]
Bước 3: Hoán vị a[vtmin] và a[i]
Bước 4:
i = i+1
- Nếu i < N: lặp lại Bước 2
- Ngược lại: Kết thúc.
ĐN hình thức về độ phức tạp thuật toán

• Gọi f và g là các hàm không giảm được định nghĩa trên tập số nguyên
dương
• Hàm f(N) là O(g(N)) (hay f(N)=O(g(N)) nếu tồn tại hằng số c và N0

∀𝑵 > 𝑵𝟎 ; 𝒇 𝑵 < 𝒄. 𝒈(𝑵)


Thuật toán vs. Thuật giải
Tuy nhiên
• Nhiều bài toán chưa tìm ra một cách giải theo kiểu thuật toán/ không
biết là có tồn tại thuật toán?
• Nhiều bài toán đã có thuật toán nhưng không chấp nhận được vì thời
gian quá lớn/ điều kiện khó đáp ứng.
• Nhiều bài toán được giải theo những cách giải vi phạm thuật toán
nhưng vẫn chấp nhận được.
Thuật toán vs. Thuật giải
• Tiêu chuẩn: tính xác định và tính đúng đắn được mở rộng
→Tính xác định thay đổi: giải thuật đệ quy và ngẫu nhiên
→Tính đúng không còn bắt buộc: cách giải gần đúng
→Chấp nhận các cách giải thường cho kết quả tốt (nhưng không phải
lúc nào cũng tốt) nhưng ít phức tạp và hiệu quả.
Thuật toán vs. Thuật giải
“giải một bài toán bằng thuật toán tối ưu đòi hỏi máy tính thực
hiện nhiều năm”
hay
“một giải pháp gần tối ưu mà chỉ cần máy tính chạy trong vài ngày
hoặc vài giờ”
Khái niệm thuật giải
• Cách giải chấp nhận được nhưng không hoàn toàn đáp ứng đầy đủ
các tiêu chuẩn của thuật toán thường được gọi là các thuật giải
→Dễ dàng hơn trong việc tìm kiếm phương pháp để giải quyết các bài
toán được đặt ra
→Trong AI thường sử dụng cách giải theo kiểu Heuristic.
Đặc điểm thuật giải Heuristic
• Thường tìm được lời giải tốt (nhưng không chắc là lời giải tốt nhất)
• Dễ dàng và nhanh chóng đưa ra kết quả hơn so với giải thuật tối ưu
→ chi phí thấp hơn.
• Thể hiện khá tự nhiên, gần gũi với cách suy nghĩ và hành động của
con người.
Các chiến lược Heuristic
1. Nguyên lý vét cạn thông minh
2. Nguyên lý tham lam (Greedy)
3. Nguyên lý thứ tự
4. Hàm Heuristic
Các chiến lược Heuristic
[1] Nguyên lý vét cạn thông minh
Tìm cách giới hạn lại không gian tìm kiếm/ thực hiện một kiểu dò tìm
đặc biệt dựa vào đặc thù của bài toán để nhanh chóng tìm ra mục tiêu.
[2] Nguyên lý tham lam
Chọn lựa hành động tối ưu cho phạm vi cục bộ của từng bước trong
quá trình tìm kiếm lời giải.
Các chiến lược Heuristic
Toán tiểu học
Các chiến lược Heuristic
[3] Nguyên lý thứ tự
Dựa trên một cấu trúc thứ tự hợp lý của không gian khảo sát nhằm
nhanh chóng đạt được một lời giải tốt.
[4] Hàm Heuristic
Hàm đánh giá thô, giá trị của hàm phụ thuộc vào trạng thái hiện tại
của bài toán tại mỗi bước giải.
Giá trị của hàm → chọn được cách hành động tương đối hợp lý trong
từng bước của thuật giải.
Các bài toán tiêu biểu
• Bài toán hành trình ngắn nhất – Nguyên lý Greedy.
• Bài toán phân việc – Nguyên lý thứ tự.
• Bài toán Ta-canh – Hàm Heuristic.
Bài toán hành trình ngắn nhất
Travelling Salesman Problem - TSP
• Cho trước một danh sách các điểm giao hàng và khoảng cách
giữa chúng.
• Nhân viên giao hàng xuất phát từ một điểm cho trước.
• Tìm đường đi ngắn nhất sao cho tất cả các điểm phải được giao
hàng và mỗi điểm chỉ ghé đúng một lần.
Ý tưởng
• Từ điểm xuất phát, liệt kê tất cả đường đi từ điểm xuất phát cho đến
n điểm → chọn đi theo con đường ngắn nhất.
• Khi đã đi đến một điểm, chọn đi đến điểm kế tiếp cũng theo nguyên
tắc trên.
• Lặp lại quá trình cho đến lúc không còn điểm nào để đi.
Xuất phát từ điểm A → đường đi?
Bài tập 1
Phân tích bài toán TSP:
• Thiết kế cấu trúc dữ liệu biểu diễn: dữ liệu đầu vào & dữ liệu phục vụ
trong quá trình xử lý .
• Các phương thức xử lý.
Bài toán phân việc
• Một công ty nhận được hợp đồng gia công m chi tiết máy J1, J2, ..., Jm
• Công ty có n máy gia công lần lượt là M1, M2, ..., Mn. Mọi chi tiết đều có
thể được gia công trên bất kỳ máy nào.
• Khi đã gia công một chi tiết trên một máy thì công việc sẽ tiếp tục cho
đến lúc hoàn thành. Ðể gia công một công việc Ji trên một máy bất kỳ
cần một thời gian tương ứng là ti
• Làm sao xong toàn bộ chi tiết trong thời gian sớm nhất.
Bài toán phân việc
▪ Giả sử có 3 máy M1, M2, M3 và 6 công việc với thời gian là t1=2,
t2=5, t3=8, t4=1, t5=5, t6=1.
▪ Phương án có thể có:
Phương án tối ưu

t3 = 8
M1

t2 = 5 t1 = 2
M2

t3 = 5 t4 = 1
M3

t6 = 1
Ý tưởng
• Sắp xếp các công việc theo thứ tự giảm dần về thời gian gia công.
• Lần lượt sắp xếp các việc theo thứ tự đó vào máy còn dư nhiều thời
gian nhất.
M1 J1
M2 J4
M3 J2 J3
Bài tập 2
• Giả sử có 3 máy M1, M2, M3 và 5 công việc có thời gian thực hiện
tương ứng như sau: j1=3, j2 = 2, j3 = 2, j4 = 3, j5 = 2.
• Áp dụng nguyên lý thứ tự phân công các công việc vào các máy.
Bài tập 3
Phân tích bài toán phân công công việc:
• Thiết kế cấu trúc dữ liệu biểu diễn: dữ liệu đầu vào & dữ liệu phục vụ
trong quá trình xử lý
• Các phương thức xử lý
• Viết chương trình cho bài toán
Bài toán Ta-canh (8-puzzle)
• Trò chơi bao gồm một hình vuông kích thước 3x3 ô
• Có 8 ô có số, mỗi ô có một số từ 1 đến 8
• Một ô còn trống
• Mỗi lần di chuyển chỉ được di chuyển một ô nằm cạnh ô trống về phía
ô trống.
3 1 4
7 6
8 2 5
Bài toán Ta-canh – Ví dụ

1 3 1 2 3
4 2 5 ? 4 5 6
7 8 6 7 8
Bài toán Ta-canh – Ví dụ
1 3
4 2 5
7 8 6
1 left

1 3
4 2 5
7 8 6
2 up

1 2 3 1 2 3 1 2 3
5 left 6 up
4 5 4 5 4 5 6
7 8 6 7 8 6 7 8
Bài toán Ta-canh
Từ một trạng thái ban đầu bất kỳ, làm sao đưa được về trạng thái cuối
là trạng thái mà các ô được sắp lần lượt từ 1 đến 8 theo thứ tự từ trái
sang phải, từ trên xuống dưới, ô cuối dùng là ô trống

3 1 4 1 2 3
7 6 ? 4 5 6
8 2 5 7 8
Bài toán Ta-canh
3 1 4 1 2 3
7 6 ? 4 5 6
8 2 5 7 8

• Tại mỗi thời điểm có 4 cách di chuyển (trên, dưới, trái, phải của ô trống)
• Vấn đề là chọn ô nào để di chuyển
VD ô số 2, 1, 6 hay 7?
Bài toán Ta-canh
• Gọi T0 là trạng thái đích của bài toán
• Gọi Tk là trạng thái hiện tại đang xét
• V(i, j) là giá trị của ô (i, j) – Số thể hiện trên ô (ô trống có giá trị 0)
Bài toán Ta-canh
• Hàm ưu tiên Hamming:
Fk = tổng các ô sai lệch vị trí so với trạng thái đích

3 1 4 1 2 3
7 6 4 5 6
8 2 5 7 8

T0
1 2 3 4 5 6 7 8
1 1 1 1 1 0 1 1

Fk = 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 = 7
Bài toán Ta-canh
• Hàm ưu tiên Manhattan: Fk = tổng các d(i, j) của những ô (i, j) khác
trống:
Hàm trạng thái Tk
Với d(i, j) là số ô cần di chuyển để con số tại ô (i, j) về đúng vị trí của nó
ở trạng thái T0
Bài toán Ta-canh – Hàm Manhattan
3 1 4 1 2 3
7 6 4 5 6
8 2 5 7 8
T0

1 2 3 4 5 6 7 8
1 2 2 3 2 0 1 1

Fk = 1 + 2 + 2 + 3 + 2 + 0 + 1 + 1 = 12
1 2 3

Bài toán Ta-canh 4 5 6


7 8
Giả sử chọn di chuyển ô số 1 T0

3 1 4 3 4
7 6 7 1 6
8 2 5 8 2 5

1 2 3 4 5 6 7 8
2 2 2 3 2 0 1 1

➔ Fk (1) = 2 + 2 + 2 + 3 + 2 + 0 + 1 + 1 = 13
1 2 3

Bài toán Ta-canh 4 5 6


7 8
Giả sử chọn di chuyển ô số 7 T0

3 1 4 3 1 4
7 6 7 6
8 2 5 8 2 5

1 2 3 4 5 6 7 8
1 2 2 3 2 0 2 1

➔ Fk (7) = 1 + 2 + 2 + 3 + 2 + 0 + 2 + 1 = 13
1 2 3

Bài toán Ta-canh 4 5 6


7 8
Giả sử chọn di chuyển ô số 6 T0

3 1 4 3 1 4
7 6 7 6
8 2 5 8 2 5

1 2 3 4 5 6 7 8
1 2 2 3 2 1 1 1

➔ Fk (6) = 1 + 2 + 2 + 3 + 2 + 1 + 1 + 1 = 13
1 2 3

Bài toán Ta-canh 4 5 6


7 8
Giả sử chọn di chuyển ô số 2 T0

3 1 4 3 1 4
7 6 7 2 6
8 2 5 8 5

1 2 3 4 5 6 7 8
1 1 2 3 2 0 1 1

➔ Fk (2) = 1 + 1 + 2 + 3 + 2 + 0 + 1 + 1 = 11
1 2 3

Bài toán Ta-canh 4 5 6


7 8
Fk (1) = 13 T0
Fk (7) = 13
Fk (6) = 13
Fk (2) = 11 Chọn ô di
chuyển sao cho
➔ Chọn di chuyển ô số 2 trạng thái mới có
Fk nhỏ nhất
Bài tập 4
• Tìm phương án sắp xếp tối ưu cho bài toán sau (dùng hàm ưu tiên
Hamming và Manhattan cho mỗi trường hợp)

1 3 1 2 3
2 4 6 4 5 6
7 8 5 7 8

1 2 3 1 2 3
4 5 6 4 5 6
8 7 7 8
Phát hiện không có lời giải?
Xét thứ tự giá trị các ô từ trên xuống dưới và trái sang phải (dòng tính
từ 0)
• Đối với trường hợp kích thước lẻ: Số cặp ngược là số lẻ -> Không có
lời giải
• Đối với trường hợp kích thước chẵn: Tổng số cặp ngược với vị trí dòng
chứa ô trống là số chẵn -> Không có lời giải
Lời giải?
1 2 3
Thứ tự các ô số: 1 2 3 4 6 8 5 7
4 6
→ Số cặp ngược lẻ: 6-5, 8-5, 8-7
8 5 7

1 2 3 4
5 6 7 Thứ tự các ô số:
1 2 3 4 5 6 7 8 9 10 11 13 14 15 12
8 9 10 11
→ Dòng chứa ô trống: 1
13 14 15 12 → Số cặp ngược: 3 (13-12, 14-12, 15-12)
Bài tập 5
• Phân tích cấu trúc dữ liệu
• Các phương thức xử lý
• và viết chương trình giải bài toán Tacanh (tính số lần di chuyển để
chuyển từ trạng thái ban đầu về trạng thái đích – nếu có lời giải)

You might also like