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

Đề cương chuyên Đề học phần trí tuệ nhân tạo Đề ti nghiên cứu về áp dụng thuật toán a* vo game ghép tranh

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

Tiêu đề Nghiên Cứu Về Áp Dụng Thuật Toán A* Vào Game Ghép Tranh
Tác giả Doãn Minh Tú, Lê Huy Đồng, Tạ Trần Trung Hiếu
Người hướng dẫn Vũ Văn Định
Trường học Trường Đại Học Điện Lực
Chuyên ngành Công Nghệ Thông Tin
Thể loại Đề Cương Chuyên Đề
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 28
Dung lượng 2,01 MB

Nội dung

Thuật toán áp dụng hàm đánh giá heuristic để sắp xếp từng núttheo ước lượng về hướng đi tôt nhất đi qua nút đó: Nút tốt nhất sẽ được ưu tiên duyêt trước nhằm tìm kiếm kết quả tốt nhất..

Trang 1

TRƯỜNG ĐẠI HỌC ĐIỆN LỰC

KHOA CÔNG NGHỆ THÔNG TIN

ĐỀ CƯƠNG CHUYÊN ĐỀ HỌC PHẦN

TRÍ TUỆ NHÂN TẠO

ĐỀ TI: NGHIÊN CỨU VỀ ÁP DỤNG THUẬT TOÁN A* VO

GAME GHÉP TRANH

Sinh viên thực hiện : DOÃN MINH TÚ

LÊ HUY ĐỒNG

TẠ TRẦN TRUNG HIẾU Giảng viên hướng dẫn : VŨ VĂN ĐỊNH

Trang 2

Hà Nội, ngày 7 tháng 12 năm 2023

PHIẾU CHẤM ĐIỂM ST

3 Lê Huy Đồng - Tìm hiểu code

- Xử lý dữ liệu , hoàn thiện báocáo

Giảng viên chấm 1:

Giảng viên chấm 2:

1

Trang 3

MỤC LỤC

LỜI MỞ ĐẦU 3

CHƯƠNG 1 THUẬT TOÁN A* 5

1.1 Giới thiệu thuật toán 5

1.2 Mô tả thuật toán 6

1.3 Cài đặt thuật toán 6

1.4 Ví dụ minh họa tìm đường đi từ A-Z 8

1.5 Đánh giá thuật toán 9

1.6 Ưu điểm của A* 9

1.7 Nhược điểm 9

CHƯƠNG 2 BI TOÁN GHÉP TRANH 10

2.1 Giới thiệu về bài toán ghép tranh 10

2.2 Áp dụng thuật toán A* vào ứng dụng ghép tranh 8 số 10

2.2.1 Khởi tạo lớp Node để mô tả trạng trái hiện tại 10

2.2.2 Hàm đánh giá 10

2.2.3 Hàm tìm ra vị trí tốt nhất của tập Open để phát triển 11

2.2.4 Hàm kiểm tra trong tập Close tồn tại trạng thái đó chưa 13

2.2.5 Hàm sinh ngẫu nhiên trạng thái đầu 13

2.2.6 Hàm tìm kiếm kết quả đưa về trang thái đích 18

2.2.7 Lưu các nút cha để lấy ra đường đi 20

2.2.8 Hàm tạo ra hướng đi 21

CHƯƠNG 3 CHƯƠNG TRÌNH 26

CHƯƠNG 4 KẾT LUẬN 27

TÀI LIỆU THAM KHẢO 28

2

Trang 4

LỜI MỞ ĐẦU

Thế giới hiện nay của chúng ta đã bước qua kỷ nguyên mới mang tên “Cách mạng công nghiệp lần thứ tư” với những cải tiến về công nghệ như viễnthông với mạng 5G, các dòng sản phẩm điện tử mới như điện thoại gập, nhữnglinh kiện mới cho máy tính và những sản phẩm công nghệ khác với sức mạnhvượt trội hơn những sản phẩm cũ mà lại vô cùng nhỏ gọn,… Trong đó ta khôngthể không kể tới trí tuệ nhân tạo – một chuyên ngành đang được rất nhiều cánhân, doanh nghiệp cũng như quốc gia quan tâm tới vì sự mới lạ cũng như độtiện lợi của nó trong cuộc sống hằng ngày

Đây là một lĩnh vực tuy không còn mới lạ, những ta có thể thấy lĩnh vựctrí tuệ nhân tạo vẫn đnag ngày càng phát triển và còn có thể tiến xa hơn nữatrong tương lai Hiện tại nó được xem là một lĩnh vực được các nhà đầu tư vàcác lập trình viên xem là một lĩnh vực có tiềm năng tiến xa hơn nữa trong tươnglai và được phát triển nó một cách mạnh mẽ và bùng nổ hơn

Hiện nay ta có thể sử dụng trí tuệ nhân tạo để có thể học tập thông qua việc lập trình, từ đó mà chúng ta có đề tài

3

Trang 5

CHƯƠNG 1 THUẬT TOÁN A*.

1.1 Giới thiệu thuật toán

Trong khoa học máy tính, A* là một thuật toán tìm kiếm trong đồthị Thuật toán này tìm đường đi từ nút khởi đầu tới một nút đích chotrước

Thuật toán áp dụng hàm đánh giá heuristic để sắp xếp từng núttheo ước lượng về hướng đi tôt nhất đi qua nút đó: Nút tốt nhất sẽ được

ưu tiên duyêt trước nhằm tìm kiếm kết quả tốt nhất Do đó, thuật toán A*

là thuật toán sử dụng thuật toán tìm kiếm tốt nhất đầu tiên với hàm đánhgiá f(u) thay vì h(u)

Hình 1 – Thuật toán A*

A* khác với best fist search ở chỗ thuật toán còn lưu lại chi phí mà

nó đã đi qua Điều đó làm cho A* đầy đủ và tối ưu, nghĩa là: 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 A* còn nhật lại cả đỉnh đã duyệt và các đỉnh chờ duyệt nếu hướng

đi mới tốt hơn

4

Trang 6

1.2 Mô tả thuật toán

Nếu u là một trạng thái hiện tại

Ta xác định hàm đánh giá: f(u) = g(u) + h(u)

• g(u) là chi phí từ nút gốc u0 tới nút hiện tại u

• h(u) là hàm đánh giá heuristic nhằm tínhchi phí nhỏ nhất có thể

để đến đích từ u

Hàm f(u) có giá trị càng thấp thì độ ưu tiên của u càng cao

• f(u) tổng chi phí ước lượng của đường đi qua nút hiện tại u đếnđích

1.3 Cài đặt thuật toán

OPEN: bao gồm tập các trạng thái đang được chờ để xét Trong tậpOPEN ta sẽ ưu tiên cho nút có chi phí bé nhất so với các nút còn lại trongtập OPEN để phát triển

CLOSE: tập chứa các trạng thái đã được xét đến Nếu có một trạngthái khác đang set mà trùng với trạng thái trong tập CLOSE và có tổngchi phí đường đi tốt hơn thì trạng thái đó sẽ thay thế trạng thái cũ trongtập CLOSE

Khi xét đến trạng thái u, trong OPEN bên cạnh việc lưu trữ 3 giá trị

cơ bản h, g, f để so sánh độ ưu tiên của trạng thái đó, A* còn lưu trữ thêmhai thông số sau:

 Cha của u (ký hiệu Father(v)): cho biết đường đi dẫn đến trạng tháiu

 Danh sách các trạng thái kề với u: chứa các trạng thái kế tiếp v củau

5

Trang 7

2.1 If OPEN rỗng {thông báo tìm thất bại; stop};

2.2 Loại trạng thái u ở đầu danh sách OPEN

2.3 If u là trạng thái đích {thông báo đã tìm thành công;stop;};

2.4 For mỗi trạng thái v kề u

}}

2.5 Sắp xếp OPEN theo thứ tự tăng dần của hàm đánh giá fsao cho trạng thái có giá trị của hàm f nhỏ nhất ở đầudanh sách

END

6

Trang 8

1.4 Ví dụ minh họa tìm đường đi từ A-Z

Trang 9

1.5 Đánh giá thuật toán

Độ phưc tạp thời gian của A* phụ thuộc vào hàm đánh giá heuristic.Tùy từng bài toán mà có hàm đánh giá khách nhau

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

Đọ phức tạp bộ nhớ A* còn rắc rối hơn độ phức tạp về thời thờigian Trong trường hợp xấu nhất, A* phải ghi nhớ số lượng nút tăng theohàm mũ

1.6 Ưu điểm của A*.

- Một thuật toán hiệu quả, tổng quát, linh động, tối ưu

- Thuật toán chứa cả tìm kiếm theo chiều sâu, tìm kiếm theo bềrộng và những hàm đánh giá Heuristic khác

-Tìm kiếm đến đích nhanh hơn với sự định hướng của hàmHeuristic

1.7 Nhược điểm

A* rất linh động nhưng vẫn gặp một khuyết điểm cơ bản đó làphải lưu lại các trạng thái đi qua nhằm so sánh với trạng thái hiên tại nêntốn khá nhiều bộ nhớ

CHƯƠNG 2 BI TOÁN GHÉP TRANH

2.1 Giới thiệu về bài toán ghép tranh.

Game ghép tranh(N-Puzzle) là một trò chơi khá hay và trí tuệ, nóđược biết đến với nhiều phiên bản và tên gọi khác nhau như: 8-puzzle,15-puzzle, Boss puzzle Bài toán N-puzzle là vấn đề cổ điển cho mô hình

8

Trang 10

thuật toán liên quan đến trí tuệ nhân tạo Bài toán đặt ra là phải tìm đường

đi từ trạng thái hiện tại tới trạng thái đích Ở đây ta xét bài toán ghéptranh với giao diện đơn giản nhất là bài toán 8 số

Ba•i toa•n gồm mô ‘t ma trận 3x3 ca•c tranh được đa•nh thứ tự từ 1 đến

8 Tra‘ng tha•i ban đầu, ca•c ô số được đa•nh thứ tự ngẫu nhiên, 1 ô trốngđánh số 0 Nhiê ‘m vu‘ cu’a ta la• pha’i sắp xếp từ vị trí 0 với các ô lân cậnsao cho đưa chu•ng trở về đu•ng thứ tự ( tra‘ng tha•i đi•ch)

2.2 Áp dụng thuật toán A* vào ứng dụng ghép tranh 8 số.

2.2.1 Khởi tạo lớp Node để mô tả trạng trái hiện tại

public class Node

{

public int [,] MaTran;// ma trận 8 số

public int SoManhSai;//số mảnh sai vị trí của ma trận

public int ChiSo;// chỉ số của node

public int Cha;// cha của node, để truy vét kết quả

public int fn;// chi phí đi đến node đó

}

2.2.2 Hàm đánh giá

Tùy vào từng bài toán , mỗi bài toán có hàm đánh giá khác nhau Trongbài toán ghép tranh thì hàm đánh giá sẽ dựa vào số mảnh sai so với vị tríđích cộng với chi phí đã đi tới nút đó

int soMiengSaiViTri( [,] MaTran)int

{

dung = 0;int

(MaTran[0, 0] == 1)if

9

Trang 11

2.2.3 Hàm tìm ra vị trí tốt nhất của tập Open để phát triển.

Đưa các nút vào tập Open , sau đó sắp xếp chúng sao cho vị trí tốt nhấtđứng đầu của danh sách

Nếu tồn tại 2 trạng thái có số mảnh sai = nhau

int viTriTotNhatOpen(List Node< > Open)

Trang 12

2.2.4 Hàm kiểm tra trong tập Close tồn tại trạng thái đó chưa.

bool danhSachDaCoMaTran( [,] a, List< [,]> Close)int int {

11

Trang 13

for int ( i = 0; i < Close.Count; i++)

{

(haiMaTranBangNhau(a, Close[i]))if {

2.2.5 Hàm sinh ngẫu nhiên trạng thái đầu.

// sinh một ma trận ngẫu nhiên để làm node bắt đầu public int [,] randomMaTran( kickThuoc)int {

[,] MaTran = int new int [kickThuoc, kickThuoc]; //khởi tạo ma trận 8 số

Trang 14

//tập Close lưu lại các hướng đã đi để đảm bảo sinh ra hướng đimới không trùng lặp

List<int[,]> Close = newList<int[,]>();

n = MaTran.GetLength(0);int

[,] Temp = int new int [n, n];

Array.Copy(MaTran, Temp, MaTran.Length);

Trang 15

MaTran[h, c] = MaTran[h - 1, c];

MaTran[h - 1, c] = 0;

(!danhSachDaCoMaTran(MaTran, Close))if {

h ;

Temp = new int [n, n];

Array.Copy(MaTran, Temp, MaTran.Length); Close.Add(Temp);

c ;

14

Trang 16

Temp = new int [n, n];

Array.Copy(MaTran, Temp, MaTran.Length); Close.Add(Temp);

h++;

Temp = new int [n, n];

Array.Copy(MaTran, Temp, MaTran.Length); Close.Add(Temp);

Trang 17

c++;

Temp = new int [n, n];

Array.Copy(MaTran, Temp, MaTran.Length); Close.Add(Temp);

Trang 18

}

2.2.6 Hàm tìm kiếm kết quả đưa về trang thái đích

public Stack< [,]> timKetQua( [,] MaTran, n)int int int {

Stack<int[,]> stkKetQua = newStack<int[,]>();

List<Node> Close = newList<Node>();

List<Node> Open = newList<Node>();

//khai báo và khởi tạo cho node đầu tiên Node tSo = newNode();

tSo.MaTran = MaTran;

tSo.SoManhSai = soMiengSaiViTri(MaTran); tSo.ChiSo = 0;

Trang 19

else

{

//sinh hướng đi của node hiện tại

List<Node> lstHuongDi = newList<Node>();

lstHuongDi = sinhHuongDi(tSo);

for int ( i = 0; i < lstHuongDi.Count; i++)

{

if(!haiNodeTrungNhau(lstHuongDi[i],Open)&& !haiNodeTrungNhau(lstHuongDi[i], Close))

/*nếu hướng đi đó tốt hơn thì sẽ được cập nhật lại,

ngược lại thì sẽ không cập nhật và chuyển từ Close sang Open*/ (soSanhTotHon(lstHuongDi[i], Close))if

{

Node temp = newNode();

temp = layNodeTrungTrongClose(lstHuongDi[i],Close);

18

Trang 20

Close.Remove(temp); Open.Add(temp);

}

}

}

}

}

//chọn vị trí có phí tốt nhất trong Open u = viTriTotNhatOpen(Open); }

}

//truy vét kết quả tỏng tập Close stkKetQua = truyVetKetQua(Close); return stkKetQua; }

2.2.7 Lưu các nút cha để lấy ra đường đi. //truy vét kết quả đường đi trong tập Close Stack<int[,]> truyVetKetQua(List<Node> Close) {

Stack<int[,]> ketQua = newStack<int[,]>();

t = Close[Close.Count - 1].Cha;int

Node temp = newNode();

ketQua.Push(Close[Close.Count - 1].MaTran);

19

Trang 21

2.2.8 Hàm tạo ra hướng đi

List<Node> sinhHuongDi(Node tSo)

Trang 22

Node Temp = newNode();

Temp.MaTran = new int [n, n];

Trang 23

Temp.SoManhSai = soMiengSaiViTri(Temp.MaTran); ChiSo++;

Temp = newNode();

Temp.MaTran = new int [n, n];

Array.Copy(tSo.MaTran, Temp.MaTran, tSo.MaTran.Length); }

//xét hàng ngang bắt đầu từ hàng thứ cuối cùng - 1 trở xuống (h < n - 1 && h >= 0)if

Trang 24

//sau khi thay đổi ma trận thì copy lại ma trận cha choMaTran để xét trường hợp tiếp theo

Temp = newNode();

Temp.MaTran = new int [n, n];

Array.Copy(tSo.MaTran, Temp.MaTran, tSo.MaTran.Length); }

Temp = newNode();

Temp.MaTran = new int [n, n];

Array.Copy(tSo.MaTran, Temp.MaTran, tSo.MaTran.Length); }

//Xét cột dọc bắt đầu từ cột cuối cùng -1 trở xuống

(c < n - 1 && c >= 0)if

23

Trang 25

{

// thay đổi hướng đi của ma trận

Temp.MaTran[h, c] = Temp.MaTran[h, c + 1]; Temp.MaTran[h, c + 1] = 0;

//cập nhật lại thông số của node

Temp.SoManhSai = soMiengSaiViTri(Temp.MaTran); ChiSo++;

Trang 26

CHƯƠNG 3 CHƯƠNG TRÌNH

- Trạng thái đầu

- Sau khi bắt đầu tìm Chương trình chạy sẽ đưa đến trạng thái đích

25

Trang 27

CHƯƠNG 4 KẾT LUẬN.

Sau một thời gian tìm hiểu và nghiên cứu cùng với sự chỉ dẫn củathầy, chúng em đã hoàn thành đề tài ghép tranh với thuật toán tìm kiếmA* Xong vẫn không thể tránh được những thiếu sót, mong thầy có thểchỉ dẫn để báo cáo được hoàn thiện

Bài ghép tranh trên thực hiện với ma trận 3X3 và có độ khó khôngcao Chúng em sẽ tiếp tục nghiên cứu áp cho bài toán ghép tranh mức độkhó hơn 4X4, 5X5 , nXn, …

26

Trang 28

TI LIỆU THAM KHẢO

https://www.iostream.co/article/thuat-giai-a-DVnHj

https://freetuts.net/cac-buoc-viet-ung-dung-windows-form-3343.html

27

Ngày đăng: 22/01/2025, 14:49