1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nhóm nasa Đề tài thuật toán a*

17 1 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 17
Dung lượng 1,1 MB

Nội dung

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 4

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

Open: = {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 6

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

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

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

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

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

if (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 14

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

4.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 17

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

Ngày đăng: 04/12/2024, 17:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w