1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo chuyên đề học phần nhập môn trí tuệ nhân tạo đề ti ứng dụng thuật toán a trong bi toán ghép tranh

29 6 0

Đ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 29
Dung lượng 1,82 MB

Nội dung

TRƯỜNG ĐẠI HỌC ĐIỆN LỰC KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO CHUN ĐỀ HỌC PHẦN NHẬP MƠN TRÍ TUỆ NHÂN TẠO ĐỀ TI: ỨNG DỤNG THUẬT TOÁN A* TRONG BI TOÁN GHÉP TRANH Sinh viên thực : PHẠM ĐỨC ANH NGUYỄN BÁ CHÍ CƠNG PHẠM VĂN THNH ĐẠT Giảng hướng dẫn viên : VŨ VĂN ĐỊNH Ngành : CÔNG NGHỆ THÔNG TIN Chuyên ngành : CÔNG MỀM Lớp : D15CNPM4 Khóa : 2022-2025 NGHỆ PHẦN Hà Nội, tháng 12 năm 2022 PHIẾU CHẤM ĐIỂM Sinh viên thực hiện: Họ tên Chữ ký Ghi Chữ ký Ghi Phạm Đức Anh Nguyễn Bá Chí Cơng Phạm Văn Thành Đạt Giảng viên chấm: Họ tên Giảng viên chấm 1: Giảng viên chấm 2: LỜI MỞ ĐẦU Đây tài liệu dùng để biểu diễn thiết kế giải tốn “Trị chơi ghép tranh” sử dụng thuật tốn A* nhóm em tìm hiểu thử nghiệm Tài liệu giúp ta có nhìn tồn vẹn tổng qt ứng dụng thuật toán A* để giải toán Do thời gian có hạn nên báo cáo khơng thể tối ưu tồn khơng gian trạng thái tốn Tuy nhiên, nhóm em cố gắng tìm hiểu, thử nghiệm thời gian sớm Nhóm thực đề tài nhằm mục đích xây dựng hệ thống giải toán thực tế dựa chiến lược tìm kiếm heuristic xây dựng trị chơi ứng dụng giải trí Trong q trình thực đề tài khơng tránh khỏi sai sót, nhóm em mong nhận góp ý đánh giá thầy, cô Em xin cảm ơn thầy cô! MỤC LỤC CHƯƠNG CHƯƠNG .BÀI TOÁN GHÉP TRANH CHƯƠNG CHƯƠNG THUẬT TOÁN A* CHƯƠNG 1.1 .Giới thiêu thuật toán CHƯƠNG 1.2 Mơ tả thuật tốn CHƯƠNG 1.3 .Cài đặt toán CHƯƠNG CHƯƠNG .CHẠY THỬ NGHIỆM THUẬT TOÁN A*TRÊN PHẦN MỀM DEV – C++ CHƯƠNG KẾT LUẬN 19 CHƯƠNG .TÀI LIỆU THAM KHẢO 20 CHƯƠNG DANH MỤC HÌNH ẢNH Hình 1: Trạng thái bắt đầu trạng thái đích toán ghép tranh Hình 2: Các bước di chuyển trống Hình 3: Mơ tả thuật tốn A* .6 Hình 4: Nội dung file Input1.txt Hình 5: Nội dung file Input2.txt Hình 6: Kết chạy chương trình 16 CHƯƠNG 10 BÀI TOÁN GHÉP TRANH Game ghép tranh (N-Puzzle) trị chơi hay trí tuệ, biết đến với nhiều phiên tên gọi khác : 8-puzzle, 15-puzzle, Gem puzzle, Boss puzzle Bài toán Npuzzle vấn đề cổ điển cho mơ hình thuật tốn liên quan đến trí tuệ nhân tạo Bài tốn đặt phải tìm đường từ trạng thái trạng thái đích Và chưa có thuật tốn tối ưu để giải toán Phần mềm N-puzzle chương trình xây dựng trị chơi giải toán Phần mềm viết java, sử dụng giao diện đồ họa để mơ trị chơi thuật tốn A* để tìm đường Người dùng sủ dụng chuột/bàn phím chơi với kích thước khác với hình ảnh khác sử dụng chức tìm lời giải nhờ thuật tốn A* u cầu xây dựng bảng vuông n hàng, n cột Bảng gồm ô trống n2 -1 ô chứa số phạm vi [1, n -1] Xuất phát từ cách xếp bất kì, di chuyển trống lên trên, xuống dưới, sang phải, sang trái để đưa ô trạng thái đích Sử dụng chuột hay phím chức để di chuyển trống Chương trình có chức tự động chơi trạng thái Mỗi trạng thái bảng số hoán vị n2 phần tử Ở ta mở rộng việc thêm hình ảnh vào game gắn số vào hình ảnh để gợi ý cho người chơi Ở trạng thái ban đầu, ô xếp ngẫu nhiên, nhiệm vụ người chơi tìm cách đưa chúng trạng thái đích (ơ đầu trống, ô khác theo thứ tự tăng dần từ trái qua phải, từ xuống dưới) Để đơn giản cách tiếp cận toán, ta giả định ô trống di chuyển bảng di chuyển đến vị trí khác Như vậy, trạng thái có tối đa cách di chuyển đến trạng thái khác (trái, phải, lên, xuống) Recommandé pour toi Suite du document ci-dessous Analysis of the two signals Cong nghe thong tin Include - aaaa Cong nghe thong tin Aucun Resumen Cap 59 Guyton Luis Enrique Silva Díaz Fisiología Humana y Prácticas Aucun 95% (19) Question Paper - FFDBFGDNHFGHMJJMM Remote Sensing & Its Application In Environmental Science 82% (34) Hình 1: Trạng thái bắt đầu trạng thái đích tốn ghép tranh 1.Xuống 4.Sang phải 2.Lên 3.Sang trái Hình 2: Các bước di chuyển ô trống CHƯƠNG 11 THUẬT TỐN A* 1.1 Giới thiêu thuật tốn Thuật tốn A* mơ tả lần năm 1986 Peter Hart, Nils Nilson Bertram Raphael Trong báo cáo họ, thuật toán gọi thuật toán A, sử dụng thuật toán với hàm đánh giá heuristic thích hợp thu hoạt động tối ưu, mà có tên A* Trong khoa học máy tính, A* thuật tốn tìm kiếm đồ thị Thuật tốn tìm đường từ nút khởi đầu tới nút đích cho trước (hoặc tới nút thỏa mãn điều kiện đích) Thuật toán sử dụng đánh giá heuristic để xếp loại nút theo ước lượng đường tốt qua nút Thuật tốn duyệt nút theo thứ tự đánh giá heuristic Do đó, thuật tốn A* ví dụ tìm kiếm theo lựa chọn tốt (best-first search) Xét tốn tìm đường – tốn mà A* thường dùng để giải A* xây dựng tăng dần tất tuyến đường từ điểm xuất phát tìm thấy đường chạm tới đích Tuy nhiên, tất thuật tốn tìm kiếm có thơng tin xây dựng tuyến đường dần đích Để biết tuyến đường có khả dần tới đích, A* sử dụng hàm đánh giá heuristic vế khoảng cách từ điểm đích Trong trường hợp tìm đường đi, đánh giá khoảng cách đường chim bay - đánh giá xấp xỉ thường dùng cho khoảng cách đường giao thông Điểm khác biệt A* tìm kiếm theo lựa chọn tốt cịn tính đến khoảng cách qua Điều làm cho A* đầy đủ tối ưu, nghĩa A* ln tìm thấy đường ngắn tốn đường A* không đảm bảo chạy nhanh thuật tốn tìm kiếm đơn giản Trong mơi trường dạng mê cung, cách để đến đích trước hết phải vế phía xa đích cuối quay trở lại Trong trường hợp đó, việc thử nút theo thứ tự “gần đích thử trước” gây tốn thời gian 1.2 Mơ tả thuật tốn Giả sử n trạng thái đạt tới (có đường từ trạng thái ban đấu n0 tới n) Ta xác định hàm đánh giá: f(n) = g(n) + h(n) - g(n) chi phí từ nút gốc n0 tới nút n - h(n) chi phí ước lượng từ nút n tới đích - f(n) chi phí tổng thể ước lượng đường qua nút n đến đích Một ước lượng heuristic h(n) xem chấp nhận với nút n: ≤ h(n) ≤ h*(n).Trong h*(n) chi phí thật (thực tế) để từ nút n đến đích 1.3 Cài đặt toán OPEN (FRINGE): tập chứa trạng thái sinh chưa xét đến OPEN hàng đợi ưu tiên mà phần tử có độ ưu tiên cao phần tử tốt CLOSE: tập chứa trạng thái xét đến Chúng ta cần lưu trữ trạng thái nhớ để phòng trường hợp có trạng thái tạo lại trùng với trạng thái mà ta xét đến trước Khi xét đến trạng thái ni OPEN bên cạnh việc lưu trữ giá trị g, h, f để phẩn ánh độ tốt trạng thái đó, A* cịn lưu trữ thêm hai thơng số sau:  Trạng thái cha trạng thái ni (ký hiệu Cha(ni)): cho biết trạng thái dẫn đến trạng thái ni  Danh sách trạng thái ni: danh sách lưu trữ trạng thái nk ni cho chi phí đến nk thông qua ni từ trạng thái ban đầu thấp Thực chất danh sách tính từ thuộc tính Cha Hình 3: Mơ tả thuật tốn A* CHƯƠNG 12 CHẠY THỬ NGHIỆM THUẬT TOÁN A*TRÊN PHẦN MỀM DEV – C++ Dùng file Input1.txt Input2.txt để lưu trọng số đồ thị File Input1.txt lưu giá trị h node mà đề cho file Input2.txt lưu dạng ma trận lưu khoảng cách điểm điểm khơng có đoạn nối đánh (tức khoảng cách hai đỉnh không khơng có đoạn nối đỉnh này) Nội dung file Input1.txt lưu: Hình 4: Nội dung file Input1.txt Trong đó:  11 số đỉnh(A,B,C,D,E,F,G,H,I,J,K,L)  Mảng lưu giá trị h đỉnh theo thứ tự Nội dung file Input2.txt lưu: 10 Hình 5: Nội dung file Input2.txt Trong đó:  11 số đỉnh(A,B,C,D,E,F,G,H,I,J,K,L)  Ma trận kề lưu liên hệ đỉnh độ dài đỉnh đồ thị theo thứ tự đỉnh Sau tạo file Astar.cpp để viết chạy chương trình Chương trình cho kết thứ tự node qua từ điểm bắt đầu đến điểm kết thúc Code chương trình: #include #include using namespace std; struct Node { int index; // số thứ tự đỉnh int g; // khoảng cách từ đỉnh ban đầu tới đỉnh 11 int f; // f = h + g; tổng chi phí từ đỉnh ban đầu tới đỉnh int h; // Heuristic int color; // đánh dấu đỉnh qua int parent; // đỉnh cha }; int a[100][100]; Node p[100]; Node Open[100]; Node Close[100]; void ReadInputFile1(int *b, int &n) // đọc nội dung từ file Input1.txt { fstream fs1("C:Input1.txt"); if (!fs1.is_open()) { cout > n; for (int i = 0; i < n; i++) 12 { fs1 >> b[i]; } } fs1.close(); } void ReadInputFile2(int a[100][100], int &n, int &start, int &finsh) //đọc nội dung //từ file Input2.txt { fstream fs2("C:Input2.txt"); if (!fs2.is_open()) { cout > n >> start >> finsh; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) fs2 >> a[i][j]; } 13 } fs2.close(); } int Count(int n, Node *Open) { int count = 0; for (int i = 0; i < n; i++) { if (Open[i].color == 1) count++; } return count; } int Find(int n, Node *Open) { for (int i = 0; i < n; i++) if (Open[i].color == 1) return i; return -1; } int FindMin(int n, Node *Open) 14 { int minIndex = Find(n, Open); int = Open[minIndex].f; for (int i = 0; i < n; i++) { if (Open[i].f < && Open[i].color == 1) { minIndex = i; = Open[i].f; } } return minIndex; } void Init(int n, int *b) { for (int i = 0; i < n; i++) { p[i].index = i; p[i].color = 0; p[i].g = b[i]; p[i].parent = 0; p[i].f = p[i].g; p[i].h = 0; } 15 } int FindPoint(int n, Node *q, int o) { for (int i = 0; i < n; i++) if (q[i].index == o) return i; return -1; } void AStar(int a[100][100], int n, int start, int finsh, int b[]) { int l = 0; Open[l] = p[start]; Open[l].color = 1; Open[l].f = Open[l].h + Open[l].g; l++; int w = 0; while (Count(l, Open) != 0) // kiem tra xem tap Open co phan tu nao khong { int k = FindMin(n, Open); // tim vi tri nho nhat Open Open[k].color = 2; // cho diem tim duoc vao Close Close[w] = Open[k]; 16 Close[w].color = 2; w++; p[FindPoint(n, p, Open[k].index)].color = 2; if (FindPoint(n, p, Open[k].index) == finsh) { cout

Ngày đăng: 12/06/2023, 09:23

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

TÀI LIỆU LIÊN QUAN

w