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 1TRƯỜ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
ĐỀ TI: NGHIÊN CỨU VỀ ÁP DỤNG THUẬT TOÁN A* VO
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 2Hà 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 3MỤ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 BI 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 4LỜ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 5CHƯƠ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 61.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 72.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 81.4 Ví dụ minh họa tìm đường đi từ A-Z
Trang 91.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 BI 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 10thuậ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 112.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 122.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 13for 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 15MaTran[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 16Temp = 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 17c++;
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 19else
{
//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 20Close.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 212.2.8 Hàm tạo ra hướng đi
List<Node> sinhHuongDi(Node tSo)
Trang 22Node Temp = newNode();
Temp.MaTran = new int [n, n];
Trang 23Temp.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 26CHƯƠ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 27CHƯƠ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 28TI 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