A* là giải thuật tìm kiếm trong đồ thị, tìm đường đi từ một đỉnh hiện tại đến đỉnh dich co str dung ham đề ước lượng khoảng cách hay còn gọi là hàm Heuristic.. Từ trạng thái hiện tại A*
Trang 1
BO CONG THUONG TRUONG DAI HOC CONG THUONG TP.HCM
KHOA CONG NGHE THONG TIN
oo 3 Ot
NHOM NASA
DE TAI: THUAT TOAN A*
TP.HCM, ngay 4 thang 9 ndéim 2024
Trang 2
BO CONG THUONG TRUONG DAI HOC CONG THUONG TP.HCM
KHOA CONG NGHE THONG TIN
oo 3 Ot
NHOM NASA
DE TAI: THUAT TOAN A*
GVHD Thanh Vién Đoàn Thị Thảo Ngân Mai Võ Minh Thư Phạm Huy Trung
Trần Đình Toàn
3
2001222867
2001225219
2001225688
TP.HCM, ngày 4 tháng 9 năm 2024
Trang 3
MUC LUC
IL TÌM HIẾU VÀ TRÌNH BẢY THUẬT TOÁN A* 2-55 cs©cssessecsscsesse 4
1.1 Heuristic và hàm Heuristic là gì2 - L1 11 11H n1 n1 tru 4
1.2 Thuật toán A* là gì? - 5s 221 2222212212211 re 4 1.3 Mô tả thuật toán A* 0 522 2122112212221 1122111212211 ru 4 1.4 Ưu điểm, nhược điểm của thuật toán Á* 5 SE tk nghe 5 1.4.1 Ưu điểm của thuật toán Á*: ác tt 1n rung 5 1.4.2 Nhược điểm của thuật toán A*: cc ccccccccccccceccssessessessvssesstesessesesseessesteeeees 6
IIL CODE MINH HQA CHO THUẬT TOÁN -ss-5s<ecssvssesrsersesrsersers 8
IV ỨNG DỤNG THUẬTT TOÁN - +6 5< se ssEseSxEESeExErkevxerkeesersersessex 14 4.1 VÍ đụ 2 5 21222 2212211211221 1221112121212 eree 14
4.1.1 Trong game và mô phỏng: - - 1 Q0 21222111 1111221521111 1115 2111 tre 14 4.1.2 Trong lập trình robof: - 222 1221122112111 15212251 1151115181 ru 14 4.1.3 Trong các ứng dụng bản đồ và định vị: - nn n se Hhre 14
4.2 Ứng dụng A* để giải Sokoban 2 5 TH EEHgH HH ưu 15 TÀI LIỆU THAM KHAO cccscssssssssssssssssssssssessscsscssscsncssscsscsesssacseseaesasseeacssseseacsaseass 17
Trang 4I TIM HIEU VA TRINH BAY THUAT TOAN A*
1.1 Heuristic va ham Heuristic la gi?
Heuristic la phuong phap giải quyết vẫn đề dựa trên phỏng đoán, ước chừng, kinh nghiệm trực giác để tìm ra giải pháp gần như là tốt nhất và nhanh chóng
Hàm Heuristic là hàm ứng với mỗi trạng thái hay mỗi sự lựa chọn một giá trị ý nghĩa đối với vấn đề dựa vào giá trị hàm này ta lựa chọn hành động
1.2 Thuật toán A* la gi?
A* là giải thuật tìm kiếm trong đồ thị, tìm đường đi từ một đỉnh hiện tại đến đỉnh
dich co str dung ham đề ước lượng khoảng cách hay còn gọi là hàm Heuristic
Từ trạng thái hiện tại A* xây dung tat cả các đường đi có thê đi dùng hàm ước lược
khoảng cách (hàm Heuristic) để đánh giá đường đi tốt nhất có thê đi Tùy theo mỗi dạng
bài khác nhau mà hàm Heunistic sẽ được đánh giá khác nhau A* luôn tìm được đường đi ngăn nhất nếu tồn tại đường đi như thé
A* lưu giữ một tập các đường đi qua đồ thị, từ đỉnh bắt đầu đến đỉnh kết thúc, tập
các đỉnh có thể đi tiếp được lưu trong tập Open
Thứ tự ưu tiên cho một đường đi được quyết định bởi hàm Heuristic duoc danh
gia f(x) = g(x) + h(x)
¢ g(x) la chi phi của đường đi từ điểm xuất phát cho đến thời điểm hiện tại + h(x) là hàm ước lượng chỉ phí từ đỉnh hiện tại đến đỉnh đích f(x) thường có giá trị càng thấp thì độ ưu tiên cảng cao
1.3 Mô tá thuật toán A*
o_ Open: tập các trạng thái đã được sinh ra nhưng chưa được xét đến
6_ Close: tập các trạng thái đã được xét đến
6_ Cosf(p, q): là khoảng cách giữa p, q
o_ ø(p): khoảng cách từ trạng thái đầu đến trạng thái hiện tại p
o h(p): gia tn được lượng giá từ trạng thái hiện tại đến trạng thải đích
© fp)=g(p) + h(p)
Trang 5Open: = {s}
» Close: = {}
+ Bước 2:
while (Open !={})
» Chon trang thái (đỉnh) tốt nhất p trong Open (xóa p khỏi Open)
+ _ Nếu p là trạng thái kết thúc thì thoát
» _ Chuyến p qua Close và tạo ra các trang thái kế tiếp q sau p 4% Nếu q đã có trong Open
- Nếu g(q)> g(p) + Cost(p, q)
* g(q) = g(p) + Cost(p, q)
* f(q) = g(a) + h(q)
* prev(q) = p (dinh cha cua q la p) Nếu q chưa có trong Open
" #(q)= g(p) † cost(p, q)
" f{(q)= g(q) † h(q)
" prev(q) =p
- Thém q vao Open
% Nếu q có trong Close
= Neu g(q) > g(p) + Cost(p, 4)
* Bo q khỏi Close
¢ Thém q vao Open + Bước 3: Không tìm được
1.4 Ưu điểm, nhược điểm của thuật toán A*
1.4.1 Ưu điểm của thuật toán A*:
Đảm bảo tìm kiếm đường đi tối ưu với ít hơn số lượng bước so với các phương
pháp tìm kiếm thông thường
Có thê áp dụng cho cả các lưới trạng thái có kích thước lớn và các đồ thị phức tạp Cho phép chúng ta xác định các ràng buộc và giới hạn trạng thái trong quá trình
Trang 61.4.2 Nhược điểm của thuật toán A*:
‹« _ Yêu cầu bộ nhớ lớn, đặc biệt đối với các bài toán có không gian trạng thái lớn
hoặc vô hạn
Chi phí tính toán cao do sử dụng công thức phức tạp
Cần có kiến thức đầy đủ về bài toán và ước lượng đề đảm bảo kết quả tối ưu
Trang 7I Vi DU MINH HQA CHO THUAT TOÁN
Trang 8
4, l43, K32, F53
HI CODE MINH HỌA CHO THUẬT TOÁN
A,H A,H,G A,H,G
Trang 960 53 36 35 35 19 26 38 2307
File Input2.txt
11
0110000015000
110 900000000
09010000000
00102000000
000201100000
0000110 160005
00000 1603007
150 000030700
000000070290
000000002907
00000570070
Trong đó:
- — 11 là số đỉnh
- _ Ma trận kề ở dưới lưu mỗi liên hệ giữa 2 đỉnh và độ dài 2 đỉnh đó trong đồ thị theo
thứ tự của các đỉnh
#include <fstream>
#include <iostream>
using namespace std;
struct Node
int index; //so thu tu
intg; — // khoang cach tu dinh ban dau den dinh hien ta
int f; //f=h+9g;
Trang 10int parent; // dinh cha
int a[100][100];
Node p[100];
Node Open[100];
Node Close[100];
void ReadInputFilel(int* b, int& n)
{
fstream fs1("Input1.txt");
if (Iffs1.is_open())
{
cout << "Khong the mo duoc file!";
else
fs1 >> n;
for (int i= 0; i < n; i++)
fs1 >> bị];
fs1.close();
}
void ReadInputFile2(int a[100][100], int& n, int& start, int& finsh)
‘ fstream fs2("Input2.txt");
if (Ifs2.is_open())
‘ cout << "Khong the mo duoc file!";
else
fs2 >> n >> start >> finsh;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
} fs2 >> alilljl:
}
fs2.close();
void RhowMatrix(int a[100][100], int n)
' for (int i= 0; i < n; i++)
for (int j = 0; j <n; j++)
cout << afi][j] << "\t":
Trang 11}
int Count(int n, Node* Open)
{
int count = 0;
for (inti = 0; i < n; i++)
if (Open[i].color == 1)
count++;
return count;
}
int Find(int n, Node* Open)
{
for (inti = 0; i < n; i++)
if (Openfi].color == 1)
return i;
return -1;
int FindMin(int n, Node* Open)
{
int minindex = Find(n, Open);
int min = Open[minIndex].f;
for (inti = 0; i <n; i++)
if (Opentfi].f < min && Open[i].color == 1) {
minindex = i;
min = Openi[il.f;
}
return minlndex;
}
void Init(int n, int* b)
for (inti = 0; i <n; i++)
pli].index = i;
pli].color = 0;
pLi].g = bli]:
pli].parent = 0;
p[ï].f = pH].g;
pH].h = 0;
}
int FindPoint(int n, Node* q, int o)
for (inti = 0; i <n; i++)
if (q[i].index == 0)
return i;
return -1;
Trang 12void AStar(int a[100][100], int n, int start, int finsh, int b[])
{
int | = 0;
Openi[l] = p[start];
OpeniI].color = 1;
Operi[I].f = Open[l].h + Openi[l].g;
I++;
int w = 0;
while (Count(l, Open) != 0) // kiem tra xem tap Open co con phan tu nao khong int k = FindMin(n, Open); // tim vi tri nho nhat trong Open
Openi[k].color = 2; // cho diem tim duoc vao Close
Close[w] = Open[k];
Close[w].color = 2;
w+;
p[FindPoint(n, p, Open[k].index)].color = 2;
If (FindPoint(n, p, Open[k].index) == finsh)
{
cout << "Duong di qua la" << endl:
cout << finsh << "\t";
int y = FindPoint(w, Close, finsh);
int u = Close[y].parent;
while (u != start)
{
y = FindPoint(w, Close, u);
u = Close[y].parent;
cout << u << "\t";
}
break;
else
{
for (int i= 0; i< n; i++)
if (a[FindPoint(n, p, Open[k].index)][i] != 0 && pli].color == 0) // neu chua co trong Open va Close
Open[l] = pÏ]›
Open[l].color = 1;
Openi[I].h = a[FindPoint(n, p, Open[k].index)][i] +
Open[k].h; // tỉnh h khoang cach ngan nhat tu dinh bat dau den dinh hien tai
Open[I].f = Open[I].g + Open[I].h;
Open[I].parent = FindPoint(n, p, Open[k].index); pH].color = 1;
I++;
}
if (a[FindPoint(n, p, Open[k].index)][i] != 0 && pfi].color == 1) // neu dinh da co trong Open
int h = FindPoint(l, Open, pl[i].index);
Node tempNode = pli];
tempNode.color = 1;
tempNode.h = a[FindPoint(n, p, Open[k].index)][i] + Open[k].h;
tempNode.parent = k;
Trang 13if (tempNode.f < Open[h].f) // neu f trang thai hien tai be hon trang thai cap nhat truoc do
Open[h] = tempNode;
}
if (a[FindPoint(n, p, Open[k].index)][i] != 0 && pli].color == 2) // neu dinh da co trong Close
int h = FindPoint(I, Close, p[i].index);
Node tempNode = pli];
tempNode.color = 1;
tempNode.h = a[FindPoint(n, p, Open[k].index)][i] + Open[k].h;
tempNode.parent = k;
tempNode.f = tempNode.h + tempNode.g;
if (tempNode.f < Close[h].f) // neu f trang thai hien tai be hon trang thai truoc do
{ Openi[l] = tempNode; // them vao Open Close[h].color = 1; // danh dau dinh do thuoc Open I++;
} } }
}
}
}
int main()
int n;
int start;
int finish;
int b[100];
ReadInputFile1(b, n);
ReadInputFile2(a, n, start, finish);
Init(n, b);
cout << "Dinh bat dau" << endl:
cout << start << endl;
cout << "Dinh ket thuc" << endl:
cout << finish << endl:
AStar(a, n, start, finish, b);
return 0;
}
Trang 14IV UNG DUNG THUAT TOAN
4.1 Ví dụ
Thuật toán A* tìm đường đi rất hiệu quả, được ứng dụng rộng rãi trong nhiều lĩnh vực khác nhau Dưới đây là một số ví dụ về các chương trình và ứng dụng sử dụng thuật
toán A*:
4.1.1 Trong game và mồ phỏng:
Game chiến thuật thời gian thực (RTS): Cac don vi trong game str dung A* dé tìm đường đi ngắn nhất đến mục tiêu, tránh chướng ngại vật và kẻ địch
Game nhập vai (RPG): Nhân vật trong game sử dụng A* đề tìm đường đến các
địa điểm, hang động hoặc đề trốn thoát khỏi kẻ thù
Game mô phỏng: Các nhân vật không chơi (NPC) trong các game mô phỏng sử dụng A* đề di chuyên tự nhiên và tương tác với môi trường
Trong lập trình robot:
Robot hút bụi: Robot sử dụng A* để lập kế hoạch đường đi, đảm bảo làm sạch
toàn bộ căn phòng một cách hiệu quả
Robot giao hang: Robot giao hàng sử dụng A* để tìm đường đi ngắn nhất đến địa điểm giao hàng, tránh các chướng ngại vật và người đi bộ
Robot khám phá: Robot khám phá sử dụng A* đề tìm đường đi trong các môi trường không xác định, chăng hạn như hang động hoặc các hành tinh khác
‹ Trong các ứng dung ban đồ và định vị:
Ứng dụng bản đồ: Các ứng dụng bản đồ như Google Maps, Waze sử đụng A* để
tính toán lộ trình ngắn nhất giữa điểm đi và điểm đến, đồng thời tính toán thời gian
di chuyên dựa trên tình hình giao thông hiện tại
Hệ thống định vị toàn cầu (GPS): GPS sử dụng A* để tìm đường đi ngắn nhất
cho các phương tiện giao thông, máy bay và tàu biển
14
Trang 154.2 Ứng dụng A* dé giai Sokoban
Video dung A* giai Sokoban
Khoi chay Sokoban
Chon level tro choi
Bạn có thể chơi thử
Trang 17TAI LIEU THAM KHAO
ShichiK1 Lê, "Thuật Giải A*”, 2020 Available: https:/Avww.iostream.co/article/thuat-giai-a- DVnHj
? Wikipedia, "Giải thuat tim kiếm A*" 2023 [Online] Available:
https://vi: wikipedia orgwiki/Gi9%E19%BA%A3i thu%E19%BA%ADY 19%C3%ACm ki
%EI%BA%BEm_A*
[3 Phạm Vĩnh Lộc, "Demo Sokoban with BFS and A*", 2021 [Online] Available:
https:/Avww youtube.com/watch? v=bK K74HN4T9c&t=4048
[4 L&ecire;, S (2020, August 8) Thudt Gidi A* IO Stream
https://www.iostream.co/article/thuat-giai-a-DVnHj |