Professional Documents
Culture Documents
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
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
Nhập/ xuất
Đ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
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
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
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
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
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
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)