Microsoft Word Báo cáo bài tập cá nhân docx TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG BÁO CÁO BÀI TẬP CÁ NHÂN HỌC PHẦN TRÍ TUỆ NHÂN TẠO Đề tài TÌM HIỂU GIẢI THUẬT A SAO[.]
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
BÁO CÁO BÀI TẬP CÁ NHÂN
HỌC PHẦN: TRÍ TUỆ NHÂN TẠO
Đề tài
TÌM HIỂU GIẢI THUẬT A SAO VÀ BÀI TOÁN TÌM ĐƯỜNG
Sinh viên thực hiện : Nghiêm Đình Mừng MSSV: 20111848
Lớp: CNTT-TT 2.3
Giáo viên hướng dẫn: TS Phạm Văn Hải
Hà Nội – tháng 11 năm 2013
Trang 2Mục Lục
Lời nói đầu
I Tìm hiểu giải thuật A*
II Bài toán tìm đường (PathFinding)
1 Nêu bài toán
2 Mô tả bài toán
3 Ứng dụng giải thuật A * vào bài toán
III Cài đặt chương trình
1 Giới thiệu chương trình
2 Cấu trúc chương trình
3 Hình ảnh mô tả
IV Kết luận
Trang 3Lời mở đầu
Trí tuệ nhân tạo đang trở thành một môn học phổ biến và ngày càng có nhiều ứng dụn trong khoa học và đời sống hiện nay.Trí uệ nhân tạo được ứng dụng trong lập trình game, các chương trình xử lý phân tích toán học phức tạp… Trong các lĩnh vực của trí tuệ nhân tạo tìm kiếm luôn là một mảng được quan tâm hàng đầu và có nhiều thành tựu nghiên cứu.Vì vậy em chọn đề tài nghiên cứu về tìm kiếm tối ưu và một thể hiện đặc trưng của nó là giải thuật A* minh họa trong bài toán tìm đường
Trong bài tập chắc chắn không tránh khỏi những thiếu sót rất mong được sự góp
ý chỉ bảo thêm của thầy
Trang 41.Tìm kiếm ưu tiên tối ưu (best-first search)
Ưu điểm của tìm kiếm theo chiều sâu là không phải quan tâm đến sự mở rộng của tất cả các nhánh Ưu điểm của tìm kiếm chiều rộng là không bị sa vào các đường dẫn bế tắc (các nhánh cụt) Tìm kiếm ưu tiên tối ưu sẽ kết hợp 2 phương pháp trên cho phép ta đi theo một con đường duy nhất tại một thời điểm, nhưng đồng thời vẫn "quan sát" được những hướng khác Nếu con đường đang đi "có vẻ" không triển vọng bằng những con đường ta đang "quan sát" ta sẽ chuyển sang đi theo một trong số các con đường này Để tiện lợi ta sẽ dùng chữ viết tắt BFS thay cho tên gọi tìm kiếm ưu tiên tối ưu
Thuật giải BEST-FIRST SEARCH
1 Đặt OPEN chứa trạng thái khởi đầu
2 Cho đến khi tìm được trạng thái đích hoặc không còn nút nào trong OPEN, thực hiện :
2.a Chọn trạng thái tốt nhất (Tmax) trong OPEN (và xóa Tmax khỏi OPEN)
2.b Nếu Tmax là trạng thái kết thúc thì thoát
2.c Ngược lại, tạo ra các trạng thái kế tiếp Tk có thể có từ trạng thái Tmax Đối với mỗi trạng thái kế tiếp Tk thực hiện :
Tính f(Tk); Thêm Tk vào OPEN
BFS khá đơn giản Tuy vậy, trên thực tế, cũng như tìm kiếm chiều sâu và chiều rộng, hiếm khi ta dùng BFS một cách trực tiếp Thông thường, người ta thường dùng các phiên bản của BFS là AT, AKT và A*
2.Giải thuật tìm kiếm A*
a) Khái niệm
Trong khoa học máy tính, A* ( đọc là A sao) là một thuật toán tìm kiếm trong
đồ thị Thuật toán này tìm kiếm một đường đi từ một nút khởi đầu tới một nút đích cho trước ( hoặc tới một nút thỏa mãn điều kiện đích) Thuật toán này sử dụng một “đánh giá heuristic” để xếp loại từng nút theo ước lượng về tuyến đường tốt nhất đi qua nút đó Thuật toán này duyệt các nút theo thứ tự của đánh giá heuristic này Do đó, thuật toán A* là một ví dụ của tìm kiếm theo lựa chon
tốt nhất (best-first search)
Thuật toán A* được mô tả lần đầu vào năm 1986 bởi Peter Hart, Nils Nilson,
Trang 5Và Bertram Raphael Trong bài cáo của họ, thuật toán được gọi là thuật toán A; khi sử dụng thuật toán này với một đánh giá heuristic thích hợp sẽ thu được hoạt động tối ưu, do đó mà có tên A*
Năm 1967, Nils Nisson phát minh ra một phương pháp tiếp cận dựa trên khám phá để tăng tốc độ của thuật toán Dijkstra Thuật toán này được gọi là A1 Năm
1967 Bertram Raphael đã cải thiện đáng kể thuật toán này, nhưng không thể hiển thị tối ưu Ông gọi thuật toán này là A2 Sau đó năm 1968 Peter E Hart đã giới thiệu một đối số chứng minh A2 là tối ưu khi sử dụng thuật toán này với một đánh giá heuristic thích hợp sẽ thu được hoạt động tối ưu Chứng minh của ông về thuật toán cũng bao gồm một phần cho thấy rằng các thuật toán A2 mới
là thuật toán tốt nhất có thể được đưa ra các điều kiện Do đó ông đặt tên cho thuật toán mới là A*( A sao , A-star)
b) Ý tưởng thuật toán
Xét bài toán tìm đường – bài toán mà A* thường được dùng để giải A* xây dựng tăng dần tất cả các tuyến đường từ điểm xuất phát cho tới khi nó tìm thấy một đường đi chạm tới đích Tuy nhiên, cũng như tất cả các thuật toán tìm kiếm
có thông tin ( informed tìm kiếm thuật toán), nó chỉ xây dựng các tuyến đường
“có vẻ” như dẫn về phía đích
Để biết những tuyến đường nào có khả năng sẽ dẫn tới đích, A* sử dụng một
“đánh giá heuristic” về khoảng cách từ điểm bất kỳ cho tới đích Trong trường hợp tìm đường đi , đánh giá này có thể là khoảng cách đường chim bay – một cách đánh giá thường dùng cho khoảng cách của đường giao thông
Điểm khác biệt của A* đối với tìm kiếm theo lựa chọn tốt nhất đó là nó còn tính đến khoảng cách đã đi qua Điều đó làm cho A* “đầy đủ” và “tối ưu”, nghĩa là , A* sẽ luôn tìm thấy đường đi ngắn nhất nếu tồn tại một đường đi như thế A* không đảm bảo sẽ chạy nhanh hơn các thuật toán tìm kiếm đơn giản hơn Trong một môi trường dạng mê cung , cách duy nhất để tìm đến đích có thể là trước hết phải đi về phía xa đích và cuối cùng với quay lại Trong trường hợp này, việc thử các nút theo thứ tự “gần đích hơn thì thử trước” có thể gây tốn nhiều thời gian
Trang 6Trong đó g(x) là chi phí của đường đi cho đến thời điểm hiện tại, nghĩa là tổng trọng số của các cạnh đã đi qua h(x) là hàm đánh giá heuristic về chi phí nhỏ
nhất để đến đích từ x Ví dụ nếu “chi phí” được tính là khoảng cách đã đi qua, khoảng cách đường chim bay giữa hai điểm trên một bản đồ là một đánh giá heuristic cho khoảng cách còn phải đi tiếp
Hàm f(x) có giá trị càng thấp thì độ ưu tiên của x càng cao ( do đó có thể sử dụng một cấu trúc heap tối thiểu để cải đặt hàng đợi ưu tiên này)
function A* (điểm xuất phát, đích)
var đóng := tập rỗng
var q := tạo_hàng_đợi ( tạo_đường_đi(điểm_xuất_phát))
while q không phải tập rỗng
động bởi các giá trị của hàm f
“Tập hợp đóng” (đóng) lưu giữ tất cả các nút cuối cùng của p ( các nút mà các đường mới đi đã được mở rộng tại đó) để tránh việc lặp lại các chu trình ( việc
này cho ra thuật toán tìm kiếm theo đồ thị) Đôi khi hàng đợi được gọi một cách
tương ứng là “tập mở” Tập đóng có thể được bỏ qua (ta thu được thuật toán tìm kiếm theo cây) nếu ta đảm bảo được rằng tồn tại một lời giải hoặc nếu hàm
các_đường_đi_tiếp_theo được chỉnh để loại bỏ các chu trình
d Các tính chất
Cũng như tìm kiếm theo chiều rộng (breadth-fist search), A* là thuật toán đầy
đủ (complete) theo nghĩa rằng nó sẽ luôn tìm thấy một lời giải nếu bài toán có lời giải
Nếu hàm heuristic h có tính chất thu nạp được (admissible), nghĩa là nó không
bao giờ đánh giá cao hơn chi phí nhỏ nhất thực sự của việc đi tới đích, thì bản
thân A* có tính chất thu nạp được (hay tối ưu) nếu sử dụng một tập đóng Nếu
Trang 7không sử dụng tập đóng tì hàm h phải có tính chất đơn điệu ( hay nhất quán) thì
A* mới có tính chất tối ưu Nghĩa là nó không bao giừo đánh giá chi phí từ một
nút kề nó cao hơn chi phí thực Phát biểu một cách hình thức, với mọi nút x,y trong đó y là nút tiếp theo của x:
ℎ(𝑥) ≤ 𝑔(𝑦) − 𝑔(𝑥) + ℎ(𝑦)
A* còn có tính chất hiệu quả một cách tối ưu với mọi hàm heuristic h, có nghĩa
là không có thuật toán nào cũng sử dụng hàm heristic đó mà chi phí phải mở
rộng ít nút hơn A*, trừ khi có một sớ lời giải chưa đầy đủ mà tại đó h dự đón
chính xác chi phí của đường đi tối ưu
Thuật toán Dijkstra là một trường hợp đặc biệt của A* trong đó đánh giá
heuristic là một hàm hằng h(x) = 0 với mọi x
đi từ x tới đích Nói cách khác, sai số của h không nên tăng nhanh hơn lôgarit của “heuristic hoàn hảo” ℎ∗ - hàm trả về khoảng cách thực từ x tới đích
Vấn đề sử dụng bộ nhớ A* còn rắc rối hơn độ phức tạp thời gian Trong trường hợp xấu nhất, A* phải ghi nhớ số lượng nút tăng theo hàm mũ Một số biến thể của A* đã được phát triển để đối phó với hiện tượng này, một trong số đó là A* lặp sâu dần, A* bộ nhớ giới hạn, A* bộ nhớ giới hạn đơn giản
Một thuật toán tìm kiếm có thông tin khác cũng có tính chất tối ưu và đầy đủ
nếu đánh giá heuristic của là thu nạp được ( adminssible) Đó là tìm kiếm đệ quy theo lựa chọn tốt nhất ( recursive best- fist search – RBFS)
Trang 81.Mô tả bài toán
Bài toán tìm đường (PathFinding) là bài toán tìm đường đi ngắn nhất giữa hai điểm Về bản chất đó là một phương pháp tìm đường tìm kiếm một đồ thị bằng cách bắt đầu từ một đỉnh và khám phá các nút liền kề cho đến khi tìm đến nút đích với đường đi là ngắn nhất Nếu ta duyệt theo chiều rộng về nguyên tắc sẽ tìm được con đường nếu có đủ thời gian Ở đây sử dụng một phương pháp khác
đó là “khám phá” đồ thị để có được xác xuất đến đích sớm hơn Cũng giống như khi ta phải đi bộ tới một căn phòng Thay vì kiểm tra tất cả các con đường tới phòng đó có thể có, ta sẽ đi theo hướng của căn phòng và chỉ đi chệch khỏi hướng con đường để tránh tắc nghẽn , và làm sai lệnh là nhỏ nhất có thể
Hai vấn đề chính của bài toán tìm đường là tìm một con đường giữa hai nút trong một biểu đồ và tìm ra con đường ngắn nhất tối ưu Các thuật toán cơ bản như duyệt theo chiều rộng hay duyệt sâu dần sẽ tìm kiếm tất cả các khả năng có thể xảy ra, bắt đầu từ nút cho trước, họ lặp qua tất cả các con đường tiềm năng
cho đến khi chúng đạt đến nút đích Các thuật toán chạy trong O(|V| + |E|), có
thời gian tính toán tuyến tính trong đó V là số đỉnh, E là số cạnh giữa các đỉnh
Về vấn đề tìm con đường ngắn nhất tối ưu Các thuật toán như A* và thuật toán Dijkstra với chiến lược loại bỏ các đường dẫn không thể, các thuật toán có thể
đạt tới thời gian tính toán thấp O( |E| log (|V|))
2.Ứng dụng giải thuật A* trong bài toán tìm đường
Giả sử chúng ta có một người muốn đi từ điểm A đến điểm B và có một bức tường ngăn cách hai điểm Điều này được minh họa dưới đây, với màu xanh lá cây là điểm khởi đầu A, điểm màu đỏ là điểm kết thúc B còn các ô vuông có màu xanh lá cây là bức tường ở giữa
Trang 9Để đơn giản cho việc tìm kiếm chúng ta chia khu vực tìm kiếm thành các ô vuông, đó là bước đầu tiên để giải bài toán pathfinding Cụ thể là chúng ta sẽ
mô tả khu vực tìm kiếm bằng một mảng hai chiều đơn giản Mỗi phần tử trong mảng đại diện cho một ô vuông trên bản đồ, và có trạng thái được ghi nhận là
walkable (đi được) và unwalkable ( không đi được) Con đường tìm được là các
hình vuông từ A đến B VÀ khi con đường được tìm thấy chúng ta sẽ cho người
đó di chuyển từ tâm của hình vuông này tới tâm của hình vuông khác cho tới đích
Những điểm trung tâm của hình vuông sẽ được gọi là các “nút” Tại sao ta không chỉ cần gọi là các hình vuông? Bởi vì ta có thể phần chia khu vực tìm đường của chúng ta vào một các gì đó khác hình vuông, có thể là hình chữ nhật, tam giác, lục giác hoặc hình bất kì… Và các nút có thể đặt ở bất cứ nơi nào trong hình thể đó - ở trung tâm, dọc theo cạnh, hoặc bất cứ nơi nào Nhưng ở đây chúng ta sử dụng hình vuông với các nút là tâm hình vuông vì nó là đơn giản nhất
Qua trình tìm kiếm bắt đầu như sau:
1 Bắt đầu ở điểm khởi đầu A và thêm nó vào “danh sách mở” của các hình vuông được xem xét Danh sách mở giống như là một danh sách mua sắm Ngay bây giờ chỉ có một phần tử trong danh sách nhưng danh sách
Trang 10sẽ được thêm nhiều hơn sau này Nó chứa hình vuông có thể nằm trong con đường bạn muốn đi, nhưng có thể không Về cơ bản đây là một danh sách các hình vuông mà cần phải được kiểm tra
2 Nhìn vào tất cả các ô vuông có thể đi đến tiếp giáp với điểm khởi đầu, bỏ qua các bức tường, vật cản… Thêm chúng vào danh sách mở Đối với mỗi hình vuông, lưu điểm A là “vuông cha mẹ” của nó Hình vuông cha
mẹ này là quan trọng đối với chúng ta khi muốn theo dõi con đường cần tìm Điều này sẽ được giải thích kĩ hơn
3 Xóa hình vuông khởi đầu khỏi danh sách mở, và thêm nó vào một “danh sách đóng” của các hình vuông mà chúng ta không cần phải xem xét lại đến lúc này
Tại thời điểm này , ta có hình minh họa sau đây Trong hình minh họa, hình vuông màu xanh đậm là hình vuông bắt đầu Nó được trình bày trong ánh sáng màu xanh để chỉ ra rằng hình vuông đã được thêm vào danh sách đóng Tất cả các ô vuông liền kề hiện nay trên danh sách mở của hình vuông để được kiểm tra, và họ được trình bày trong màu xanh lá cây Môi hình vuông có một con trỏ màu xám mà điểm trở lại là cha mẹ của nó, đó là hình vuông bắt đầu
Tiếp theo , chúng ta chọn một trong các hình vuông liền kề trong danh sách mở
và nhiều hơn hoặc ít lặp lại quá trình trước đó, như mô tả dưới đây Nhưng và hình vuông nào để chúng ta chọn để được chi phí thấp nhất F? Để giải quyết vấn đề này chúng ta phải sử dụng đến thuật giải A*
Trang 11• G(n) là chi phí di chuyển kể từ điểm xuất phát A đến một hình vuông nút
n trên trong quá trình tim kiếm
• H(n) là ước lượng chi phí di chuyển ước tính từ hình vuông nút n tới điểm đích cuối cùng, điểm B Tại sao chỉ là ước lượng vì chúng ta không thể biết thực tế cho đến khi tìm thấy con đường, bởi vì tất cả các lạo vật cản ( nước , lửa, đá…) Để có thể tính được H ta sử dụng một ước lượng
heuristic sẽ trình bày sau
Con đường mà chúng ta tạo được bằng cách liên tục đi qua danh sách mở của chúng ta và chọn những hình vuông với số điểm F thấp nhất Quá trình này sẽ được mô tả ở phần sau của báo cáo Đầu tiên chúng ta sẽ nhìn nhận chặt chẽ hơn việc tính phương trình như thế nào
Như mô tả ở trên, G là chi phí thấp nhất để di chuyển từ điểm khởi đầu cho đến hình vuông hiện tại Trong ví dụ này chúng ta sẽ chỉ định chi phí từ một ô vuông đến 1 ô vuông liền kề nằm ngang hoặc thẳng đứng là 10, và đến 1 ô vuông theo đường chéo là 14 Chúng ta sử dụng những con số này bởi vì khoảng cách thực tế di chuyển theo đường chéo là căn bậc 2, hoặc khoảng 1.1414 lần so với theo chiều ngang hoặc theo chiều dọc Chúng ta sử dụng 10 hoặc 14 để đơn giản Tỉ lệ này là tương đối chính xác và tránh được tính toán căn bậc hai cũng như số thập phân Điều này không phải do chúng ta không thể tính trực tiếp được mà do sử dụng bộ số như thế này sẽ nhanh hơn nhiều trong việc tính toán tăng tốc độ xử lý cho máy tính
Khi đang tính toán chi phí G(n) cùng một con đường cụ thể cho một hình vuông nút n, cách tìm ra chi phí a khi đến hình vuông đó là có thể lấy chi phí của mẹ sau đó thêm 10 hoặc 14 tùy thuộc vào việc nó là đường chéo hay là trực giao ( không phải là đường chéo) vớ hình vuông cha mẹ
Ước lượng heuristic
Có nhiều cách tìm H(n), trong báo cáo này chúng ta tính ước lượng heuristic theo phương pháp Manhattan Theo phương pháp này H sẽ được tính bằng tổng
số ô vuông di chuyển theo chiều ngang và theo chiều dọc để đạt được mục tiêu
từ ô vuông hiện tại, bỏ qua chuyển động chéo và bỏ qua bất kì trở ngại có thể có trên đường Sau đó chúng ta nhân tổng só với 10, chi phí của chúng ta để di chuyển một hình vuông theo chiều ngang học theo chiều dọc
Phương pháp này gần như là một kiểu ước lượng “đường chim bay” từ ông
vuông hiện tại tới đích, nhưng thực sự không phải Ở đây, chúng ta đang thực sự