You are on page 1of 39

Chương 2

GIẢI QUYẾT VẦN ĐỀ


BẰNG TÌM KIẾM

1
Nội dung
1. Giải quyết vấn đề và khoa học trí tuệ nhân tạo,
2. Biểu diễn vấn đề dưới dạng bài toán tìm kiếm
trong không gian trạng thái,
3. Tìm kiếm không có thông tin,
4. Tìm kiếm có thông tin: tìm tham lam, A*.
5. Tìm kiếm cục bộ
6. Tìm kiếm trong một số ứng dụng cụ thể: thiết
kế VLSI, lập lịch,.v.v.
2
Giải quyết vấn đề và khoa học AI
 Tại sao phải tìm kiếm
 Tìm kiếm là tìm lời giải hợp lý cho một vần đề hay
bài toán.
 Yêu cầu của việc tìm kiếm là hiệu quả:
 Giải quyết bài toán tìm kiếm cần mang tính tổng
quát.
 Thuận lợi trong áp dụng cho nhiều lĩnh vực
 Khó khăn của việc tìm kiếm hiện đại là không gian tìm
kiếm có kích thước lớn
3
Giải quyết vấn đề và khoa học AI
 Tại sao phải tìm kiếm
 Nhiều bài toán cần đến đến việc tìm kiếm:
 Trò chơi
 Lập thời khóa biểu
 Tìm đường đi
 Lập kế hoạch
 Học máy,
 Xử lý ngôn ngữ tự nhiên

4
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm trong không gian trạng thái
 Các thành phần của bài toán tìm kiếm:
 Tập trạng thái Q: không gian trạng thái.
 Tập các trạng thái xuất phát S (S  Q), S  . Việc
tím kiếm bắt đầu từ một trong các trạng thái thuộc S.
 Tập các trạng thái đích G (G  Q), G  . Các trạng
thái thuộc G có thể được cho tường minh hoặc không.
 Các toán tử (hành động hay chuyển động): là ánh xạ
P: Q  Q, dịch trạng thái này sang trạng thái khác.
 Giá thành c: Q x Q  R. Đi từ A đến B có giá thành c:
c(A, B)
5
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm trong không gian trạng thái
 Các thành phần của bài toán tìm kiếm:
Ví dụ: Cho đồ thị có tập đỉnh
{A, B, C, D, E, F, G, H, I}
và tập cạnh nối các đỉnh.
Tìm đường đi từ A đến B.
 Các đỉnh gọi là các
trạng thái thuộc Q
 AS
 BG
6
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm trong không gian trạng thái
 Các tiêu chuẩn đánh giá thuật toán tìm kiếm:
 Độ phức tạp tính toán (Time complexity): khối lượng
tính toán cần thực hiện để tìm ra lời giải.
 Yêu cầu bộ nhớ (Space complexity): số lượng trạng
thái cần lưu trữ đồng thời trong bộ nhớ khi thực hiện
thuật toán.
 Tính đầy đủ (Completeness): nếu có lời giải thì thuật
toán có tìm ra được; nếu không tìm được thì không
có tính đầy đủ.
 Tính tối ưu (Optimality): có thể tìm ra lời giải tốt nhất
trong số các lời giải có thể có. 7
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm trong không gian trạng thái
 Thuật toán tìm kiếm tổng quát:
Search(Q, S, G, P)
Input: Q, S, G, P
Output: Trạng thái đích
Khởi tạo: O  S
While(O  ) do
1. Chọn node n  O, xóa n khỏi O
2. Nếu n  G
Return đường_đi_đến_n
3. Thêm P(n) vào O
Return không_có_lời_giải

8
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm trong không gian trạng thái
 Cây tìm kiếm:
 Xuất phát từ thuật toán tìm kiếm tổng quát. Mỗi trạng
thái là một node trên cây.
 Trạng thái xuất phát tương ứng với gốc cây, những
trạng thái được mở rộng trở thành các node thế hệ
tiếp theo.
 Quy ước, mỗi node đã được duyệt sẽ không được
duyệt lại lần nữa  không cần lưu node đã duyệt.
 Node mở (node biên): có thể mở rộng tiếp
 Node đóng: node đã được mở rộng, cần xóa node
này khỏi danh sách các node mở. 9
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm trong không gian trạng thái
 Cây tìm kiếm:
 Ví dụ: Cho bảng kích thước 3x3 và các số từ 1 đến 8
được xếp vào 8 ô một cách ngẫu nhiên, còn lại một ô
trống. Có thể di chuyển số ở cạnh ô trống tới ô trống
theo một trong bốn hướng (lên/xuống/trái/phải). Hãy
tìm các bước di chuyển để biến đổi trạng thái ban
đầu thành trạng thái kết thúc

10
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm trong không gian trạng thái
 Cây tìm kiếm:

11
Tìm kiếm không có thông tin
 Là phương pháp duyệt không gian trạng thái chỉ sử dụng
các thông tin theo phát biểu của bài toán tìm kiểm tổng
quát trong quá trình tìm kiếm.
 Có nhiều thuật toán cho bài toán này:
 Tìm kiếm theo chiều rộng (Breadth First Search –
BFS)
 Tìm kiếm theo giá thành thống nhất (Uniform Cost
Search – UCS)
 Tìm kiếm theo chiều sâu (Depth First Search – DFS)
 Tìm kiếm sâu dần (Iterative Deepending Search –
IDS)
 Tìm theo hai hướng (Bidirectional Search – BS)
12
Tìm kiếm không có thông tin
 Tìm theo chiều rộng (Breadth First Search – BFS)
 Chọn node nông nhất (gần node gốc nhất) để mở
rộng.
 Phát triển các đỉnh lần lượt theo mức 0, 1… Khi
tất cả các đỉnh ở một mức được phát triển xong
rồi mới phát triển những đỉnh ở mức tiếp theo.
 Tại mỗi mức, ta sẽ chọn đỉnh để phát triển là đỉnh
được sinh ra trước nhất so với các đỉnh chờ phát
triển khác

13
Tìm kiếm không có thông tin
 Tìm theo chiều rộng (Breadth First Search – BFS)
 Ví dụ: Cho không gian trang thái như hình. Tìm dãy các
phép biến đổi để biến đổi 1 thành 2.

8
1 4

5
6

10
9

2
7
3

14
Tìm kiếm không có thông tin
 Tìm theo chiều rộng (Breadth First Search – BFS)
 Chuyển không gian trạng thái đã cho thành cây tìm kiếm
BFS.

5 8 9

4 7 10 3

15
Tìm kiếm không có thông tin
 Tìm theo chiều rộng (Breadth First Search – BFS)
 Các bước thực hiện.

Bước lặp Open Close

Khởi tạo (1,null) // đỉnh 1 có cha là null Rỗng


1 (5,1),(8,1),(9,1) //5 cha là 1 1
2 (8,1),(9,1),(4,5),(7,5),(10,5) 1,5
3 (9,1),(4,5),(7,5),(10,5) 1,5,8
4 (4,5),(7,5),(10,5),(3,9) 1,5,8,9
5 (7,5),(10,5),(3,9) 1,5,8,9,4
6 (10,5),(3,9),(2,7) //mở được 2 => ngừng 1,5,8,9,4,7
16
Tìm kiếm không có thông tin
 Tìm theo chiều rộng (Breadth First Search – BFS)

bool Breadth_First_Search {
if (trạng thái ban đầu là trạng thái kết thúc)
return true; //tìm kiếm thành công
khởi tạo danh sách open chỉ chứa đỉnh bắt đầu;
khởi tạo danh sách close rỗng;
while (true){
if (open = ) return false; //tìm kiếm thất bại
chọn và loại đỉnh u ở đầu danh sách open;
close  u;
for (mỗi đỉnh v kề u) {
if (v  close và v  open) {
father(v) = u;
if (v là đỉnh kết thúc)
return true; //tìm kiếm thành công
thêm v vào cuối danh sách open; }}}}
17
Tìm kiếm không có thông tin
 Tìm theo chiều rộng (Breadth First Search – BFS)
 Đỉnh sinh ra trước sẽ được phát triển trước, do đó
danh sách open được xử lý như hàng đợi (queue)
 Nếu có đường đi từ trạng thái ban đầu tới trạng thái
đích thì thuật toán tìm kiếm theo bề rộng sẽ luôn tìm
ra với số phép biến đổi ít nhất.
 Nếu không có đường đi từ trạng thái ban đầu tới
trạng thái đích và không gian trạng thái hữu hạn, thì
thuật toán sẽ dừng và thông báo tìm kiếm thất bại.

18
Tìm kiếm không có thông tin
 Tìm theo chiều rộng (Breadth First Search – BFS)
 Giả sử mỗi đỉnh khi được phát triển sẽ sinh ra b đỉnh
kề (b gọi là hệ số nhánh) và đỉnh kết thúc ở mức d
của cây tìm kiếm. Số đỉnh tối đa phải xét:
1 + b + b2 +... + bd-1 + bd
 Độ phức tạp theo thời gian của BFS là: O(bd)
 Độ phức tạp theo bộ nhớ của BFS là: O(bd)

19
Tìm kiếm không có thông tin
 Tìm theo giá thành thống nhất (Uniform Cost Search –
UCS)
 Còn được gọi là thuật toán Dijkstra: Chọn node mở
rộng có giá thành nhỏ nhất để mở rộng.
 Cho không gian trạng thái như hình. Tìm dãy phép
biến đổi S thành G có giá thành nhỏ nhất

20
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm không có thông tin – tìm kiếm mù
 Tìm theo giá thành thống nhất (Uniform Cost Search –
UCS)
 Cây tìm kiếm USC

21
Tìm kiếm không có thông tin
 Tìm theo giá thành thống nhất (Uniform Cost Search –
UCS)
• Khởi tạo: {[S, 0]}
• Lặp 1: {[SA, 1 ] , [SG, 12]}
• Lặp 2: {[SAC, 2], [SAB, 4], [SG, 12]}
• Lặp 3: {[SACD, 3], [SAB, 4], [SACG, 4],
[SG, 12]}
• Lặp 4: {[SAB, 4], [SACG, 4], [SACDG, 6],
[SG, 12]}
• Lặp 5: {[SACG, 4], [SACDG, 6], [SABD, 7],
[SG, 12]}
• Lặp 6: chọn được dãy biến đổi SACG.

22
Tìm kiếm không có thông tin

 Tìm theo giá thành thống nhất (Uniform Cost Search –


UCS)

1.Chọn node n có giá thành nhỏ nhất


thuộc O, xóa n khỏi O
2.Nếu n thuộc G thì trả về đường đi đến
n
3.Thêm P(n) và giá thành đường đi tới n
vào O

23
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
 Tại mỗi bước, đỉnh được chọn để phát triển là đỉnh
được sinh ra sau cùng trong số các đỉnh chờ phát
triển.
 Trong thuật toán tìm kiếm theo bề rộng, ta sửa
“thêm v vào cuối danh sách open” thành “thêm v
vào đầu danh sách open” thì sẽ có Thuật toán tìm
kiếm theo độ sâu.

24
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
 Ví dụ: Cho không gian trang thái như hình. Tìm dãy
các phép biến đổi để biến đổi 1 thành 2.

8
1 4

5
6

10
9

2
7
3

25
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
 Chuyển không gian
trạng thái đã cho 1

thành cây tìm


kiếm DFS. 5 8 9

2
26
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
 Các bước thực hiện

Bước lặp Open Close


Khởi tạo (1,null) // đỉnh 1 có cha là null Rỗng
1 (9,1),(8,1),(5,1) //5 cha là 1 1
2 (3,9),(8,1),(5,1) 1,9
3 (7,3),(8,1),(5,1) 1,9,3
4 (2,7),(8,1),(5,1) //mở được 2 => ngừng 1,9,3,7

27
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
bool Breadth_First_Search {
if (trạng thái ban đầu là trạng thái kết thúc)
return true; //tìm kiếm thành công
khởi tạo danh sách open chỉ chứa đỉnh bắt đầu;
khởi tạo danh sách close rỗng;
while (true){
if (open = ) return false; //tìm kiếm thất bại
chọn và loại đỉnh u ở đầu danh sách open;
close  u;
for (mỗi đỉnh v kề u) {
if (v  close và v  open) {
father(v) = u;
if (v là đỉnh kết thúc)
return true; //tìm kiếm thành công
thêm v vào đầu danh sách open; }}}}
28
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
 Do đỉnh sinh ra sau sẽ được phát triển trước, nên
danh sách open được xử lý như ngăn xếp (stack).
 Nếu có trạng thái kết thúc và không gian trạng thái
hữu hạn, thì thuật toán tìm kiếm theo độ sâu sẽ tìm ra.
 Nếu không gian trạng thái vô hạn thì có thể không tìm
ra, vì nếu thuật toán đi theo một nhánh vô hạn mà
trạng thái kết thúc không nằm trên nhánh này thì thuật
toán sẽ không dừng.

29
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
 Giả sử trạng thái kết thúc ở mức d và cây tìm kiếm có
hệ số nhánh là b. Trường hợp xấu nhất là trạng thái
kết thúc ở đỉnh ngoài cùng của mức d.
 Độ phức tạp theo thời gian của DFS là: O(bd)
 Khi một đỉnh u trên cây tìm kiếm theo độ sâu có các
đỉnh con đã mở thì đỉnh u có thể hủy.
 Độ phức tạp theo bộ nhớ của DFS là: O(bd)

30
Tìm kiếm không có thông tin
 Tìm theo chiều sâu (Depth First Search – DFS)
 Tìm kiếm theo độ sâu thường nhanh hơn tìm kiếm theo
bề rộng, vì tìm kiếm theo bề rộng phải xem xét toàn bộ
cây tìm kiếm tới mức d-1, rồi mới xem xét các đỉnh ở
mức d. Còn trong tìm kiếm theo độ sâu, có thể ta chỉ cần
xem xét một bộ phận nhỏ của cây tìm kiếm thì có thể đã
tìm ra trạng thái kết thúc.

31
Tìm kiếm không có thông tin
 Tìm kiếm sâu dần (Iterative Deepending Search – IDS)
 Tìm kiếm sâu dần là tìm kiếm với độ sâu hữu hạn.
 Tìm tương tự DFS, nhưng không vượt quá một giới
độ sâu cho trước nào đó.
 Giới hạn độ sâu được khởi đầu bằng một giá trị nhỏ,
sau đó tăng dần cho tới khi tìm được lời giải.
 Ví dụ: Giới hạn độ sâu ban đầu là 2. Nếu không tìm
được lời giải thì tăng lên 3. Tiếp tục cho đến khi tìm
được.

32
Tìm kiếm không có thông tin
 Tìm kiếm sâu dần (Iterative Deepending Search – IDS)

O  S //O là danh sách các node mở


C  0 //gán trị 0 cho giới hạn C
While(O  )
1. Thực hiện 3 bước:
 Lấy node n đầu tiên ra khỏi O
 Nếu n  G trả về Đường_đi_đến_n
 Nếu độ sâu (n)  C thì thêm P(n) vào đầu O
2. C++, O  S
Trả về Không_có_lời_giải

33
Tìm kiếm không có thông tin
 Tìm kiếm sâu dần (Iterative Deepending Search – IDS)
 Ví dụ:
 C=0

 C=1

 C=2

34
Biễu diễn vấn đề bằng bài toán
tìm kiếm
 Tìm kiếm sâu dần (Iterative Deepending Search – IDS)
 Ví dụ:
 C=3

35
Tìm kiếm không có thông tin
 Tìm kiếm sâu dần (Iterative Deepending Search – IDS)
 Thuật toán đầy đủ
 Thuật toán tối ưu
 Yêu cầu bộ nhớ nhỏ (b*d) do tại mỗi bước lặp thuật
toán thực hiện tìm kiếm sâu dần
 Mỗi lần gọi thủ tục tìm kiếm sâu hạn chế tới mức d,
nếu cây có nhân tố nhánh b thì số đỉnh cần phát triển
là:
1 + b + b2 + ... + bd
 Độ phức tạp về thời gian: O(bd)

36
Tìm kiếm không có thông tin
 Tìm theo hai hướng (Bidirectional Search – BS)
 Bắt đầu từ node xuất phát và bắt đầu từ node đích.
 Có hai cây tìm kiếm:
 Cây có node gốc là node xuất phát
 Cây có node gốc là node đích
 Tìm kiếm kết thúc khi lá của cây này trùng với lá của
cây kia.
 Khi tìm theo hai hướng cần sử dụng tìm theo chiều
rộng

37
Tìm kiếm không có thông tin
 Tìm theo hai hướng (Bidirectional Search – BS)

38
Tìm kiếm không có thông tin
 Tìm theo hai hướng (Bidirectional Search – BS)
 Khi kiểm tra xem node lá của cây này có trùng với
node lá của cây kia không sẽ tốn nhiều thời gian
 Giả sử tìm được lời giải  điểm gặp nhau là ở giữa
cây  chiều sâu mỗi cây là d/2
 Độ phức tạo theo thời gian là: O(bd/2)

39

You might also like