You are on page 1of 82

CSE: Faculty of Computer Science and Engineering

Thuyloi University

CHƯƠNG 2
GIẢI QUYẾT VẤN ĐỀ BẰNG TÌM KIẾM
TS. Nguyễn Thị Kim Ngân
Email: ngannguyen@tlu.edu.vn

Có tham khảo bài giảng của TS. Nguyễn Văn Nam, khoa CNTT, TLU
1
Nội dung

 Biểu diễn bài toán bằng không gian trạng thái


 Giải quyết vấn đề bằng tìm kiếm
Nội dung

 Biểu diễn bài toán bằng không gian trạng thái


 Giải quyết vấn đề bằng tìm kiếm
Biểu diễn bài toán bằng không gian trạng
thái
Một bài toán được phát biểu theo dạng 5 thành phần:
 Trạng thái bài toán
 Trạng thái đầu
 Trạng thái đích
 Các phép chuyển trạng thái
 Chi phí của các phép chuyển trạng thái
Bài toán đong nước
Sử dụng ba can 3 lít, 5 lít và 9 lít, làm thế nào để đong được 7 lít nước
Bài toán này được phát biểu lại theo 5 thành phần:
 Trạng thái: Số nước có trong 3 can lần lượt là a, b, c (a ≤ 3, b ≤ 5, c ≤ 9), khi
đó bộ ba (a, b, c) là trạng thái của bài toán
 Trạng thái đầu: (0, 0, 0) // cả ba can đều rỗng
 Trạng thái đích (-, -, 7) // can thứ 3 chứa 7 lít nước
 Phép chuyển trạng thái: từ trạng thái (a,b,c) có thể chuyển sang trạng thái
(x,y,z) thông qua các thao tác như làm rỗng 1 can, chuyển từ can này sang
can kia đến khi hết nước ở can nguồn hoặc can đích bị đầy
 Chi phí của mỗi phép chuyển trạng thái là 1

Phạm Hoàn Thọ, Phạm Thị Lê Anh, Giáo trình trí tuệ nhân tạo, 2011
Bài toán đong nước
Không gian trạng thái
Bài toán đong nước
Lời giải có chi phí 5
Bài toán di chuyển 8 số (8-puzze)
 Cho bàn cờ kích thước 3 x 3, có 8 quân cờ đánh số từ 1 đến 8 và một ô trống
 Có thể chuyển một quân cờ có chung cạnh với ô trống sang ô trống
 Tìm dãy các phép chuyển để từ Trạng thái ban đầu về Trạng thái đích

2 8 3 1 2 3
1 6 4 8 4
7 5 7 6 5
Trạng thái đầu Trạng thái đích
Bài toán di chuyển 8 số (8-puzze)
Phát biểu bài toán dưới dạng 5 thành phần như
sau:
 Biểu diễn trạng thái: mảng 2 chiều kích thước 2 8 3 1 2 3
3x3, phần tử của mảng lưu số hiệu quân cờ (từ
1 6 4 8 4
0 đến 8, 0 là vị trí trống)
7 5 7 6 5
 Trạng thái đầu (hình vẽ)
Trạng thái đầu Trạng thái đích
 Trạng thái đích (hình vẽ)
 Phép chuyển trạng thái: đổi chỗ ô có số hiệu 0
với một trong các ô có cùng cạnh
 Chi phí: mỗi phép chuyển có chi phí 1
Bài toán di chuyển 8 số (8-puzze)
Không gian trạng thái của bài
toán
 Mỗi nút là 1 trạng thái
 Mỗi cạnh ứng với 1 phép
chuyển đổi trạng thái
Bài toán tháp Hà Nội
Cho 3 cọc 1,2,3. Ở cọc 1 ban đầu có n đĩa, sắp theo thứ tự to dần từ trên xuống
dưới. Tìm cách chuyển n đĩa đó sang cọc 3 sao cho:
 Mỗi lần chỉ chuyển 1 đĩa
 Ở mỗi cọc không cho phép đĩa to nằm trên đĩa con

Trạng thái đầu Trạng thái đích


Bài toán tháp Hà Nội
Phát biểu bài toán dưới dạng 5 thành phần (n=3):
 Biểu diễn trạng thái: (x1, x2, x3), xi {1, 2, 3} }
 Trạng thái đầu : (1,1,1)
 Trạng thái đích: (3, 3, 3)
 Phép chuyển trạng thái: mỗi lần chuyển một đĩa sao cho đĩa nhỏ hơn luôn nằm trên đĩa lớn hơn
 Chi phí: mỗi phép chuyển có chi phí 1

Trạng thái đầu Trạng thái đích


Bài toán tháp Hà Nội
1
1
1
1 1
1 1
2 3
Không gian trạng thái (n=3)
1 1
3 2
2 3
1 1 1 1
3 3 2 2
3 1 1 2
2 3
3 2
3 2
2 3 3
2
3 2 2
3
2 3 1
1 3 3
2 2
1 1 3
2
2 3 1
1 3
2 2 3 3 3
2 2
1 1 1 3 3
2 2 1
1 1 2 2 3
2 3 3
Nội dung

 Biểu diễn bài toán bằng không gian trạng thái


 Giải quyết vấn đề bằng tìm kiếm
Phương pháp
● Là tìm đường đi từ TT đầu tới một TT đích Trạng thái đầu
trong KGTT
− Lời giải: tập các phép chuyển gắn với
đường đi tìm được. Đã duyệt
CLOSE
● Các chiến lược tìm kiếm khác nhau bởi thứ OPEN
tự phát triển các nút để duyệt (cách chọn 1 Đang chờ
duyệt
trạng thái tiếp theo của để duyệt)
● Các thông tin được sử dụng để tìm đường: Thêm vào
chờ duyệt
− Quá khứ: đánh giá chi phí đường đi từ
gốc tới nút đang duyệt
− Tương lai: ước lượng chi phí đường đi
Trạng thái đích
từ nút đang duyệt tới đích
Các chiến lược tìm kiếm
Không có Có thông tin
thông tin định Tìm kiếm hướng dẫn
hướng

Tìm kiếm với tri


Tìm kiếm mù
thức bổ xung
Các chiến lược tìm kiếm
Không có Có thông tin
thông tin định Tìm kiếm hướng dẫn
hướng

Thông tin quá


khứ + tương
Tìm kiếm với tri lai
Tìm kiếm mù
thức bổ xung
Thông tin
tương lai
Thông tin
tương lai
(heuristic) Tìm kiếm Tìm kiếm Tìm kiếm
kinh nghiệm tối ưu có đối thủ
Tìm kiếm mù
● Tìm kiếm không có định hướng: không có thông tin đánh giá (quá khứ, tương lai) của
các trạng thái
● Từ trạng thái ban đầu, các trạng thái được phát triển theo 1 quy tắc lựa chọn cứng nhắc
nào đó cho tới khi:
− Gặp được 1 trạng thái đích →tìm kiếm thành công
− Duyệt hết không gian trạng thái→tìm kiếm thất bại
● Các chiến lược tìm kiếm mù:
− Tìm kiếm theo chiều rộng (Breadth-First-Search: BFS)
− Tìm kiếm theo chiều sâu (Depth-First-Search: DFS)
− Tìm kiếm theo chiều sâu hạn chế (Limited Depth-First-Search: LDFS)
− Tìm kiếm sâu lặp (Depth Deepening-Search: DDS)
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
Trạng thái đầu
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

Trạng thái đích.


H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

Trạng thái đích.


H I J
Tìm kiếm thành công
Tìm kiếm theo chiều rộng
● Tập trạng thái chờ duyệt “OPEN”: Queue
● Trạng thái nào được sinh ra trước thì được phát triển trước
● Duyệt hết các nút ở cùng độ sâu rồi mới duyệt tới các nút ở độ sâu tiếp theo

A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

Đường đi: ACGI


H I J
Tìm kiếm theo chiều rộng
● Bài tập: Tìm đường đi và trình tự duyệt các đỉnh
− Trạng thái đầu: 1
− Trạng thái đích: 12

Bước lặp u kề(u) OPEN


0 1
1 1 2,3,11 11,3,2
2 11 1,12,13 3,2,12,13
3 3 1,4 2,12,13,4
4 2 1,4,6 12,13,4,6
5 12
Tìm kiếm theo chiều rộng
L: trạng thái đã được sinh ra và chờ
father(v) = u, nếu cha của đỉnh v là u
Tìm kiếm theo chiều rộng
● Giả sử:
− Cây tìm kiếm có nhân tố nhánh (số nút con tối đa của 1 đỉnh) là b
− Lời giải của bài toán là đường đi có độ dài d
● Độ phức tạp thời gian:
− Số nút duyệt = 1 + b + b2 + … + bd-1 + k = O(bd)
− Trong đó k là số lượng nút ở độ sâu d tính đến nút trạng thái đích
● Độ phức tạp bộ nhớ:
● Số nút lưu trong danh sách OPEN để chờ duyệt
● = số đỉnh kề với các đỉnh của cây tìm kiếm ở mức d
− = số đỉnh của cây tìm kiếm ở mức d+1
− = O(bd+1)
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu
chưa tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

H I J
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

Trạng thái đích.


H I J
Tìm kiếm thành công
Tìm kiếm theo chiều sâu
● Tập trạng thái chờ duyệt “OPEN”: Stack
● Trạng thái sâu nhất (được đưa vào Open mới nhất) thì được phát triển trước
● Duyệt hết các nút con cháu, … rồi mới đi lên duyệt các nút ở cùng độ sâu nếu chưa
tìm thấy
A Chưa duyệt

Đang duyệt
B C D
Chờ duyệt (Open)

E F G Đã duyệt (Close)

Đường đi ACGI
H I J
Tìm kiếm theo chiều sâu
● Bài tập: Tìm đường đi và trình tự duyệt các đỉnh
− Trạng thái đầu: 1
− Trạng thái đích: 12
Bước lặp u kề(u) OPEN
0 1
1 1 2,3,11 11,3,2
2 11 1, 13, 12 12,13,3,2
3 12
Tìm kiếm theo chiều sâu
● Procedure Depth_First_Search
− 1. Khởi tạo Open = {trạng thái ban đầu};
− 2. while true do
● 2.1 If (Open rỗng) then
− {thông báo thất bại; stop};
● 2.2 Loại trạng thái u ở đầu danh sách Open;
● 2.3 If (u là trạng thái kết thúc) then
− {thông báo thành công; stop};
● 2.4 Thêm các nút trạng thái kề với u vào đầu danh sách Open
Tìm kiếm theo chiều sâu
● Độ phức tạp bộ nhớ
− Chỉ cần lưu các nút con (kề) chưa được phát triển của các đỉnh
nằm trên đường đi từ gốc tới đích
− Số nút cần lưu = b + b + … + b = d.b = O(b.d)
● Độ phức tạp thời gian
− Trường hợp tốt nhất (nghiệm là đỉnh ngoài cùng bên trái ở mức
d):
● Số nút duyệt = d
− Trường hợp xấu nhất (nghiệm là đỉnh ngoài cùng bên phải ở mức
d)
● Số nút duyệt = 1 + b + b2 + … + bd-1 + k = O(bd)
● k là vị trí của trạng thái đích ở độ sâu d
So sánh
Chiều rộng Chiều sâu
Open FIFO (Queue) LIFO (Stack)
Hiệu quả Khi trạng thái đích nằm gần Khi trạng thái đích nằm
gốc của cây tìm kiếm sâu trong cây tìm kiếm và
có một phương án chọn
hướng đi chính xác
Độ phức Tốn nhiều bộ nhớ hơn
tạp Có cùng độ phức tạp thời gian
về mặt lý thuyết nhưng chậm
hơn trong thực tế
Kết quả Chắc chắn tìm ra kết quả nếu Không tìm ra nghiệm
có trong không gian lặp hoặc
không gian có độ sâu vô
hạn
Vấn đề của tìm kiếm theo chiều sâu
A
● Không gian tìm kiếm có thể có độ sâu
vô hạn hoặc lặp trạng thái.
B C

B C

...
Vấn đề của tìm kiếm theo chiều sâu
Nhánh cây
● Không gian tìm kiếm có thể có độ sâu A
vô hạn hoặc lặp trạng thái.
tìm kiếm
đầu tiên B C
● Khi đó, DFS có thể bị mắc kẹt ở nhánh
vô hạn và không tìm ra nghiệm.
D
● Khắc phục:
− Chỉ phát triển các nút chưa được A Trạng thái đích
phát triển.
B C
● Thêm biến trạng thái boolean
duyệt(u).
D
− Hạn chế độ sâu của giải thuật: tìm
kiếm theo chiều sâu hạn chế.
...
Tìm kiếm theo chiều sâu hạn chế
Chỉ tìm kiếm (theo chiều sâu) trong 1 giới hạn độ sâu nào đó. Các nút nằm ở độ sâu sâu hơn không
được xét duyệt

Procedure Depth_Limited_Search(l)
begin
1. Khởi tạo Open = {trạng thái ban đầu u0};
depth(u0) = 0;
2. while true do
2.1 If (Open rỗng) then
{thông báo thất bại; stop};
2.2 Loại trạng thái u ở đầu danh sách Open;
2.3 If (u là trạng thái kết thúc) then
{thông báo thành công; stop};
2.4 If (depth(u)<l) then
for (mỗi trạng thái v kề u) do
● Thêm v vào đầu danh sách Open;
● depth(v) = depth(u) + 1;
end
Tìm kiếm sâu lặp
● Còn gọi là tìm kiếm sâu dần
● Là tìm kiếm theo chiều sâu hạn chế với giới hạn độ sâu tăng dần
từ 0 tới một mức max
● Quá trình tìm kiếm:
− Tìm kiếm theo độ sâu ở mức giới hạn d nào đó (bắt đầu từ
d=0)
− Nếu không tìm thấy nghiệm, tìm kiếm theo độ sâu ở mức giới
hạn độ sâu d+1
Tìm kiếm sâu lặp
● Procedure Depth_Deepening_Search(max)
● begin
for (i = 0 to max) do{
● Depth_Limited_Search(i);
● if (thành công) then exit;
}
● end
Tìm kiếm sâu lặp
● Nếu nghiệm có độ sâu d và cây có nhân tố nhánh b thì ta đã thực hiện các thủ tục
DLS(0), DLS(1), …, DLS(max)
● Độ phức tạp thời gian
− Số đỉnh phải phát triển ở mức 0 là 1, lặp max+1 lần
− Số đỉnh phải phát triển ở mức 1 là b, lặp max lần
− Số đỉnh phải phát triển ở mức 2 là b2, lặp d=max-1 lần
− …
− Số đỉnh phải phát triển ở mức max là bmax, lặp 1 lần
− Số đỉnh duyệt = (max+1).1 + max.b + (max-1).b2 + … + 2.bmax-1 + 1.bmax = O(bmax)
− Nếu d<= max thì số đỉnh duyệt là O(bd)
So sánh các giải thuật tìm kiếm mù
Chiều rộng Chiều sâu Chiều sâu hạn Sâu lặp
chế
Hoàn thành Có Không Không Không
Thời gian O(bd) O(bd) O(bl) O(bmax)

Không gian O(bd+1) O(b.d) O(b.l) O(b.max)

● Hoàn thành: là khả năng luôn tìm thấy nghiệm nếu có.
− Chiều sâu: không tìm thấy nếu không gian lặp trạng thái hoặc có chiều sâu vô hạn
− Chiều sâu hạn chế: không tìm thấy nếu nghiệm nằm sâu hơn giới hạn
− Sậu lặp: không tìm thấy nếu nghiệm nằm sâu hơn độ sâu tìm kiếm tối đa

You might also like