You are on page 1of 23

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 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


Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Mụ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

2
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Lờ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.

3
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

I.Tìm hiểu về giải thuật tìm kiếm A *


1.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,

4
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Và 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.
c. Mô tả thuật toán
A* lưu giữ một tập các lời giải chưa hoàn chỉnh, nghĩa là các đường đi qua đồ
thị bắt đầu từ nút xuất phát. Tập lời giải này được lưu trong một hàng đợi ưu
tiên ( priority queue). Thứ tự ưu tiên gán cho một đường đi x được quyết định
bởi hàm f(x) = g(x) + h(x)

5
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Trong đó 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
var p := lấy_phần_tử_đầu_tiên(q)
var x:=nút cuối cùng của p
if x in đóng
continue
if x = đích
return p
bổ sung x vào tập đóng
foreach y in các_đường_đi_tiếp_theo(p)
đưa_vào_hàng_đợi(q,y)
return failure

Trong đó các_đường_đi_tiếp_theo(p) trả về tập hợp các đường đi tạo bởi


việc kéo dài p thêm một nút kề cạch. Giả thiết rằng hàng đợi được sắp xếp tự
độ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
6
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

khô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
e.Độ phức tạp thuật toán
Độ phức tạp thời gian của A* phụ thuộc vào đáng giá heuristic. Trong trường
hợp xấu nhất, số nút được mở rộng theo hàm mũ của độ dài lời giải, nhưng nó
sẽ là hàm đa thức khi hàm heuristic h thỏa mãn điều kiện sau

|ℎ(𝑥) − ℎ∗ (𝑥)| ≤ 𝑂(𝑙𝑜𝑔 ℎ∗ (𝑥 ))

Trong đó ℎ∗ là heuristic tối ưu, nghĩa là hàm cho kết quả là chi phí chính xác để
đ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)

7
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

II.Bài toán tìm đường (PathFinding)

1.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.

8
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Để đơ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.

Bắt đầu tìm kiếm

Sau khi chúng ta đã đơn giản hóa khu vực tìm kiếm thành việc quản lý một số
nút, bước tiếp theo sẽ là tiến hành tìm kiếm một con đường đi ngắn nhất. Chúng
ta làm điều này bằng cách bắt đầu tại điểm A, kiểm tra các ô liền kề và nói
chung là tìm kiếm bên ngoài cho tới khi tìm tới điểm đích.

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
9
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

sẽ đượ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*.

Hàm lượng giá

Chìa khóa để xác định hình vuông để sử dụng khi tìm ra con đường là phương
trình sau:

F(n) = G(n) + H(n)

Trong đó:

10
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

• 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ự

11
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

cố gắng để ước lượng khoảng cách còn lại trên đường ( mà thường là xa hơn).
Ước lượng của chúng ta gần như khoảng cách còn lại thực tế, và thuật toán sẽ
cho kết quả tìm kiếm nhanh hơn. Nhưng chúng ta không thể đánh giá quá cao
ước lượng này, nó không đảm bảo cho chúng ta luôn tìm ra con đường ngắn
nhất.

Về mặt kĩ thuật , phương pháp Manhattan là không thể chấp nhận vì nó hơi
đánh giá quá cao khoảng cách còn lại. Nhưng chúng ta sử dụng ước lượng này
vì nó rất dễ và đơn giản hơn nhiều kĩ thuật khác.

F được tính bằng G và H. Các kết quả bước đầu trong việc tìm kiếm được minh
họa trong hình dưới đây. F, G, H được đếm và viết trong mỗi hình vuông. F
được viết ở trên, G bên trái và H bên phải.

Tiếp tục tìm kiếm

Tiếp tục tìm kiếm , chúng ta chỉ đơn giản là chọn ô vuông có giá trị F thấp nhất
từ danh sách mở. Sau đó tiếp tục làm như sau:

4. Chuyển nó từ danh sách mở sang danh sách khép kín.


5. Kiểm tra các ô vuông liền kề. Bỏ qua những ô vuông nằm trong danh
sách đóng hoặc các ô vuông có trạng thái unwalkable ( tường, nước…)
thêm ô vuông vào danh sách mở khi ô vuông đó chưa nằm trong danh
sách mở. Làm cho ô vuông được chọn là mẹ của các ô vuông mới.
6. Nếu nó nằm trong danh sách mở, kiểm tra xem nếu con đường từ hình
vuông hiện nay đến hình vuông này có phải là tốt hơn ( sử dụng G để so
sánh). Nếu như vậy, thay đổi phụ huynh của hình vuông này đến hình
vuông hiện nay, và tính toán lại G, F. Ngược lại không làm gì.

12
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Điều này sẽ được giải thích cụ thể hơn dưới đây:

Trong chín ô vuông ban đầu, chúng ta có 8 ô trong danh sách mở khi ô đầu tiên
được đưa vào danh sách đóng. Trong số 8 ô này ô có F thấp nhất là = 40. Vì vậy
chúng ta sẽ chọn ô này như hình vuông tiếp theo của con đường và ô này được
tô viền màu xanh trong hình minh họa:

Đầu tiên chúng ta chuyển ô vuông này từ danh sách mở vào danh sách đóng ( có
viền màu xanh). Sau đó chúng ta kiểm tra các ô vuông liền kề. Ta thấy ngay bên
cạch là một ô vuông của tường và một ô vuông của danh sách đóng, chỉ còn lại
4 ô vuông khác đã trong danh sách mở. Vì vậy chúng ta phải kiểm tra các
đường dẫn tới ô vuông bất kỳ tốt hơn sử dụng ô vuông này để đến đó, sử dụng
giá trị G để so sánh.Chúng ta hãy nhìn vào ô vuông bên trên ô vuông được
chọn. Điểm G của nó là 14. Nếu chúng ta đi qua ô vuông được chọn đến ô
vuông này thì điểm G=20 cao hơn 14, vì vậy đây không phải là con đường tốt
hơn.

Khi chúng ta lặp lại quá trình này cho 4 ô vuông liền kề đã có trong danh sách
mở, chúng ta nhận thấy rằng không có đường dẫn cải thiện bằng cách đi qua ô
vuông hiện nay, vì vậy chúng ta không làm bất cứ điều gì. Bây giờ chúng ta
nhìn vào các ô vuông liền kề, chúng ta đang thực hiện với những ô vuông này
và sẵn sàng chuyển sang ô vuông tiếp theo.

Tiếp theo trong bảy hình vuông còn lại trong danh sách mở ta chọn một ô có chi
phí thấp nhất F. Và điều đặc biệt là có 2 ô vuông với giá trị F=54. Nó thực sự
không quan trọng ta sẽ chọn hình vuông được lựa chọn cuối cùng khi bổ sung
vào danh sách mở.

13
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Lúc này, khi chúng ta kiểm tra các ô vuông bên cạnh chúng ta gặp ngay 1 ô
vuông là bức tường, vì vậy chúng ta bỏ qua ô này. Chúng ta cũng bỏ ngay ô
vuông ngay bên dưới bức tường bởi vì chúng ta không thể có một hình vuông
trực tiếp từ ô hiện tại mà không cắt ngang qua bức tường gần đó. Chúng ta thực
sự cần phải đi xuống đầu tiên và sau đó di chuyển xung quanh qóc của ô vuông
tường này.

Vậy là 5 hình vuông khác. Hai ô vuông bên dưới ô vuông hiện thời không phải
là đá nằm trong danh sách mở , vì vậy chúng ta thêm chúng và ô vuông hiện nay
trở thành cha mẹ của chúng. Ba ô vuông khác, hai là sách có trong danh sách
đóng( ô vuông ban đầu và ô vuông trên ô vuông hiện tại). cùng bên trái ngay
lập tức của hình vuông hiện tại, được kiểm tra xem G là bất kỳ thấp hơn nếu bạn
đi qua ô vuông hiện tại để đến ô vuông này. 30 >24. Như vậy chúng ta đã hoàn
tất và chuyển sang kiểm tra ô vuông tiếp theo trong danh sách.

Chúng ta lặp lại quá trình cho đến khi hình vuông mục tiê vào danh sách khép
kín. Lúc này nó trông như hình minh họa sau:

14
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Để xác định được đường đi, ta chỉ cần bắt đầu từ ô vuông mục tiêu màu đỏ, và
làm việc di chuyển ngược lại từ một hình vuông men của nó, theo các mũi tên.
Điều này sẽ đưa ta tới ô vuông bắt đầu, và đó là con đường mà ta cần tìm. Di
chuyển từ ô vuông bắt đầu A đên ô vuông mục tiêu B chỉ đơn giản là vấn đề di
chuyển từ trung tâm của mỗi ô vuông (nút) đến trung tâm của ô vuôn tiếp theo
trên con đường tới mục tiêu.

Tóm tắt phương pháp sử dụng giải thuật A* vào bài toán tìm đường.

1. Thêm ô vuông bắt đầu (hoặc nút) vào danh sách mở.
2. Lặp lại các bước như sau
a) Tìm những ô vuông có chi phí F thấp nhất trong danh sách mở. Gọi là
ô vuông hiện thời.
b) Chuyển nó vào danh sách đóng
c) Đối với * ô vuông bên cạnh ô vuông hiện nay…
• Nếu nó không phải là nút walkable hoặc nó nằm trong danh
sách đóng bỏ qua nó, nếu không làm như sau:
• Nếu nó không nằm trong danh sách mở thêm nó vào danh sách
mở. Làm cho ô vuông hiện nay làm cha mẹ của ô vuông này.
Ghi lại các giá trị F, G , H của ô vuông.
• Nếu nó nằm trong danh sách mở, kiểm tra xem nếu con đường
từ hình vuông hiện nay đến hình vuông này có phải là tốt hơn (
sử dụng G để so sánh). Nếu như vậy, thay đổi phụ huynh của
hình vuông này đến hình vuông hiện nay, và tính toán lại G, F.
Ngược lại không làm gì.

15
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

d) Dừng lại khi


• Thêm hình vuông mục tiêu vào danh sánh khép kín, con đường
đã được tìm thấy hoặc
• Không tìm thấy hình vuông mục tiêu, và danh sách mở rộng
trống, trong trường hợp này không có đường

III. Cài đặt chường trình demo

1.Giới thiệu chương trình

Chương trình PathFinding Demo được cài đặt như mô tả ở trên. Khi sử dụng
phần mềm chúng ta kích chuột trái vào ô chọn làm tường, chuột giữa vào ô
chọn làm điểm bắt đầu, chuột phải vào ô chọn làm đích. Sau đó chọn hàm
heristic. Ngoài hàm heuristic Manhattan đề cập ở trên còn bổ sung thêm hai
hàm heristic là Closest Heuristic và Closest Squared Heuristic. Tiếp theo chọn
nút tìm đường và xem kết quả: đường đi ngắn nhất là đường màu xanh và có mô
tả quá trình tìm kiếm ở bên phải.

16
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

2.Cấu trúc chương trình


Sơ đồ use case
Thêm các ô
tường
Thêm điểm đầu

Thêm điểm cuối

Người dùng
Chọn hàm
heuristic

Xem các thông số Tìm đường


và quá trình tìm
kiếm

17
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Sơ đồ class

Cài đặt các hàm heuristic


Manhanttan Heuristic

Ước lượng chi phí từ nút hiện tại tới nút đích theo đường ngang và dọc bỏ qua
các vật cản.

this.h=Math.abs(fx-target.fx)*10+Math.abs(fy-target.fy)*10;

Closest Heuristic

Ước lượng theo chi phí đi theo đường chim bay từ nút hiện tại tới nút đích.

this.h=(int) Math.sqrt((fx-target.fx)*(fx-target.fx)*100+(fy-target.fy)*(fy-
target.fy)*100);

Closest Squared Heuristic

Ước lượng theo diện tích hình chữ nhật tạo bởi x, y của nút hiện tại và nút đích

this.h=(int) ((fx-target.fx)*(fx-target.fx)*100+(fy-target.fy)*(fy-target.fy)*100);

18
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

3.Demo chương trình

Hướng dẫn Vẽ tường , điểm đầu , điểm đích, cách sử dụng phần mềm

19
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Thống kế một số trường hợp và đánh giá các hàm heuristic

Chi phí Số nút tới Số nút đã duyệt


đích
Manhanttan Heuristic 56 3 28

Closest Heuristic 56 3 24

Closest Squared 56 3 18
Heuristic

Trung bình 56 3 21

20
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Chi phí Số nút tới Số nút đã duyệt


đích
Manhanttan Heuristic 110 8 65

Closest Heuristic 110 8 74

Closest Squared 110 8 26


Heuristic

Trung bình 110 8 55

21
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

Chi phí Số nút tới Số nút đã duyệt


đích
Manhanttan Heuristic 172 13 50

Closest Heuristic 172 13 50

Closest Squared 172 13 40


Heuristic

Trung bình 172 13 46

Nhận xét: Qua ba thử nghiệm trên cho thấy, với cùng một trường hợp , hàm
Closest Squared Heuristic có chi phí tìm kiếm tối ưu nhất, sau đó là hàm
Manhanttan Heuristic còn hàm Closest Heuristic có chi phí tồi nhất.

22
Báo cáo bài tập cá nhân Tìm hiểu giải thuật A * Nghiêm Đình Mừng

IV.Kết luận và hướng phát triển.


Báo cáo đã nêu phân tích rõ giải thuật tìm kiếm A* với tri thức bổ sung. Thấy
được sự tối ưu của việc vận dụng các hàm heuristic khác nhau vào việc giải
quyết vấn đề bài toán thực tế. Báo cáo cho thấy mức độ tối ưu của các hàm
heuristic là không giống nhau, do vậy bài toán A* luôn có nhiều lời giải và đặt
ra yêu cầu phải tìm ra 1 hàm heuristic để giải quết vấn đề tối ưu hơn.

Qua báo cáo bài tập lớn này, em đã hiểu sâu hơn về giải thuật tìm kiếm với tri
thức bổ sung A*, vận dụng được lý thuyết vào trong thực tế. thu được nhiều
kiến thức và kinh nghiệm quí giá.

Hướng phát triển tiếp theo của em là tìm thêm các hàm heuristic mới, nâng cao
hiệu năng tìm kiếm, cải thiện khả năng tương tác , phân tích của ứng dụng. Ứng
dụng bài toán để giải quyết các vấn đề thực tiễn trong đời sống, xã hội.

V.Tài liệu tham khảo


1. Bài giảng trí tuệ nhân tạo của thầy Phạm Văn Hải

2. website

3. website

4. website

23

You might also like